第一次爬糗事百科的段子也是不容易呀,第一次使用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();運行代碼的結果如下:
新聞熱點
疑難解答