第一次爬糗事百科的段子也是不容易呀,第一次使用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();运行代码的结果如下:
新闻热点
疑难解答