首页 > 学院 > 开发设计 > 正文

NodeJS-糗事百科段子爬虫

2019-11-11 05:10:29
字体:
来源:转载
供稿:网友

第一次爬糗事百科的段子也是不容易呀,第一次使用http的get模式去爬,发现爬不到数据。估计是被反爬了吧。最后采用request模块来做,之后就成功爬取到糗事百科上的html网页数据了。不过只是爬到原始的HTML数据而已,与浏览器上直接观看的html源码还是有点区别的。因为浏览器上的代码是经过Ajax数据更改过的。所以一开始我爬到数据之后,在浏览器上找到相应的id后就获取了。结果发现什么数据都没有。之后将网页代码打印出来后,发现根本和浏览器代码是不相同的。

浏览器的代码:

真实上爬取到的代码:

所以这里面要想获取到数据的话,还是需要在真实爬取到的源码上找到它的类或id才能够获取得到数据呀。

要注意的细节就基本上完成,上代码:

var request = require('request');var cheerio = require('cheerio');var path = require('path');var fs = require('fs');var http = require('http');var run = function(Url,startNum,Sum){    var page={        i:startNum,//当前的页数        sum:startNum+Sum,//总的爬取页数        url:Url,//当前爬取的url地址        newUrl:null,//新组装的url地址        data:null,//页面爬取的html内容        timer:null,//定时器,控制爬虫的结束        ws:null,//文件操作变量    }    //爬取入口函数    this.fetchPage = function(){        console.log(page);        startRequest(page.url+page.i);    }    //开始爬取数据函数    function startRequest(x) {        request(x, function (error, response, body) {            console.log(error);            if (!error && response.statusCode == 200) {                //console.log(body);                page.data = body;                //console.log(page.data);                if(page.timer==null){                    page.ws = fs.createWriteStream('output.txt','utf-8');                    page.timer = setInterval(nextPage,1000);                }            }        });        function nextPage(){             //控制爬多少篇文章                if (page.i <= page.sum) {                    acquireData();                    console.log('当前爬取的页数: '+page.i);                    //下一篇文章的url                    page.newUrl = page.url + ++page.i;                    startRequest(page.newUrl);                } else{                    clearInterval(page.timer);                }        }        function acquireData(){           //console.log("html:"+page.data);            //cheerio插件相当于jq的功能            var $ = cheerio.load(page.data);            //看页面可以知道,当前的图片有class=test,将它们当数组存进meizi变量            var duanzi = $('.content-text div span').toArray();            var len = duanzi.length;            for(var i=0;i<len;i++){                 console.log("完成:"+i+" "+duanzi[i].children[0].data);                 page.ws.write(duanzi[i].children[0].data);            }            console.log("第"+page.i+"页全部爬取完毕!");        }    }}var start = new run('http://www.qiushibaike.com/text/page/',1,35);start.fetchPage();

运行代码的结果如下:


上一篇:凑算式

下一篇:链表 —— 双向循环

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表