第一次爬糗事百科的段子也是不容易呀,第一次使用http的get模式去爬,發(fā)現(xiàn)爬不到數(shù)據(jù)。估計(jì)是被反爬了吧。最后采用request模塊來(lái)做,之后就成功爬取到糗事百科上的html網(wǎng)頁(yè)數(shù)據(jù)了。不過(guò)只是爬到原始的HTML數(shù)據(jù)而已,與瀏覽器上直接觀看的html源碼還是有點(diǎn)區(qū)別的。因?yàn)闉g覽器上的代碼是經(jīng)過(guò)Ajax數(shù)據(jù)更改過(guò)的。所以一開始我爬到數(shù)據(jù)之后,在瀏覽器上找到相應(yīng)的id后就獲取了。結(jié)果發(fā)現(xiàn)什么數(shù)據(jù)都沒(méi)有。之后將網(wǎng)頁(yè)代碼打印出來(lái)后,發(fā)現(xiàn)根本和瀏覽器代碼是不相同的。
瀏覽器的代碼:

真實(shí)上爬取到的代碼:

所以這里面要想獲取到數(shù)據(jù)的話,還是需要在真實(shí)爬取到的源碼上找到它的類或id才能夠獲取得到數(shù)據(jù)呀。
要注意的細(xì)節(jié)就基本上完成,上代碼:
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,//當(dāng)前的頁(yè)數(shù) sum:startNum+Sum,//總的爬取頁(yè)數(shù) url:Url,//當(dāng)前爬取的url地址 newUrl:null,//新組裝的url地址 data:null,//頁(yè)面爬取的html內(nèi)容 timer:null,//定時(shí)器,控制爬蟲的結(jié)束 ws:null,//文件操作變量 } //爬取入口函數(shù) this.fetchPage = function(){ console.log(page); startRequest(page.url+page.i); } //開始爬取數(shù)據(jù)函數(shù) 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('當(dāng)前爬取的頁(yè)數(shù): '+page.i); //下一篇文章的url page.newUrl = page.url + ++page.i; startRequest(page.newUrl); } else{ clearInterval(page.timer); } } function acquireData(){ //console.log("html:"+page.data); //cheerio插件相當(dāng)于jq的功能 var $ = cheerio.load(page.data); //看頁(yè)面可以知道,當(dāng)前的圖片有class=test,將它們當(dāng)數(shù)組存進(jìn)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+"頁(yè)全部爬取完畢!"); } }}var start = new run('http://www.qiushibaike.com/text/page/',1,35);start.fetchPage();運(yùn)行代碼的結(jié)果如下:


新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注