最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Node.js環(huán)境下編寫爬蟲爬取維基百科內(nèi)容的實例分享

 更新時間:2016年06月12日 18:46:36   作者:zhoutk  
WikiPedia平時在國內(nèi)不大好訪問-- 所以用爬蟲一次性把要看的東西都爬下來保存慢慢看還是比較好的XD 這里我們就來看一下Node.js環(huán)境下編寫爬蟲爬取維基百科內(nèi)容的實例分享

基本思路
思路一(origin:master):從維基百科的某個分類(比如:航空母艦(key))頁面開始,找出鏈接的title屬性中包含key(航空母艦)的所有目標(biāo),加入到待抓取隊列中。這樣,抓一個頁面的代碼及其圖片的同時,也獲取這個網(wǎng)頁上所有與key相關(guān)的其它網(wǎng)頁的地址,采取一個類廣度優(yōu)先遍歷的算法來完成此任務(wù)。
思路二(origin:cat):按分類進(jìn)行抓取。注意到,維基百科上,分類都以Category:開頭,由于維基百科有很好的文檔結(jié)構(gòu),很容易從任一個分類,開始,一直把其下的所有分類全都抓取下來。這個算法對分類頁面,提取子分類,且并行抓取其下所有頁面,速度快,可以把分類結(jié)構(gòu)保存下來,但其實有很多的重復(fù)頁面,不過這個可以后期寫個腳本就能很容易的處理。

庫的選擇
開始想用jsdom,雖然感覺它功能強(qiáng)大,但也比較“重”,最要命的是說明文檔不夠好,只說了它的優(yōu)勢,沒一個全面的說明。因此,換成cheerio,輕量級,功能比較全,至少文檔一看就能有一個整體概念。其實做到后來,才發(fā)現(xiàn)根本不需要庫,用正則表達(dá)式就能搞定一切!用庫只是少寫了一點正則而矣。

關(guān)鍵點
全局變量設(shè)定:

var regKey = ['航空母艦','航空母艦','航母'];  //鏈接中若包含此中關(guān)鍵詞,即為目標(biāo)
var allKeys = [];              //鏈接的title,也是頁面標(biāo)識,避免重復(fù)抓取
var keys = ['Category:%E8%88%AA%E7%A9%BA%E6%AF%8D%E8%88%B0'];  //等待隊列,起始頁

圖片下載
使用request庫的流式操作,讓每一個下載操作形成閉包。注意異步操作可能帶來的副作用。另外,圖片名字要重新設(shè)定,開始我取原名,不知道為什么,有的圖明明存在,就是顯示不出來;并且要把srcset屬性清理掉,不然本面顯示不出來。

$ = cheer.load(downHtml);
 var rsHtml = $.html();
 var imgs = $('#bodyContent .image');    //圖片都由這個樣式修飾
 for(img in imgs){
  if(typeof imgs[img].attribs === 'undefined' || typeof imgs[img].attribs.href === 'undefined')
   {continue;}  //結(jié)構(gòu)為鏈接下的圖片,鏈接不存在,跳過
  else
   {
    var picUrl = imgs[img].children[0].attribs.src;  //圖片地址
    var dirs = picUrl.split('.');
    var filename = baseDir+uuid.v1()+'.'+dirs[dirs.length -1];  //重新命名

    request("https:"+picUrl).pipe(fs.createWriteStream('pages/'+filename));  //下載

    rsHtml = rsHtml.replace(picUrl,filename);  //換成本地路徑
    // console.log(picUrl);
   }
 }

廣度優(yōu)先遍歷
開始沒能完全理解異步的概念,以循環(huán)方式來做,以為使用了Promise,就已經(jīng)全轉(zhuǎn)化為同步了,但其實只是能保證交給promise的操作會有序進(jìn)行,并不能讓這些操作與其它的操作有序化!如,下面的代碼就是不正確的。

var keys = ['航空母艦'];
var key = keys.shift();
while(key){
 data.get({
  url:encodeURI(key),
  qs:null
 }).then(function(downHtml){
    ...
    keys.push(key);        //(1)
  }
 });
key = keys.shift();          //(2)
}

上面的操作看試很正常,但其實(2)會在(1)之間被運行!哪怎么辦?
我使用遞歸來解決這個問題。如下示例代碼:

var key = keys.shift();
(function doNext(key){
 data.get({
  url:key,
  qs:null
 }).then(function(downHtml){
  ...
  keys.push(href);
  ...
  key = keys.shift();
  if(key){
   doNext(key);
  }else{
   console.log('抓取任務(wù)順利完成。')
  }
 })
})(key);

正則清理
使用正則表達(dá)式清理無用的頁面代碼,因為有很多模式需要處理,寫了一個循環(huán)統(tǒng)一處理。

var regs = [/<link rel=\"stylesheet\" href=\"?[^\"]*\">/g,
  /<script>?[^<]*<\/script>/g,
 /<style>?[^<]*<\/style>/g,
 /<a ?[^>]*>/g,
 /<\/a>/g,
 /srcset=(\"?[^\"]*\")/g
 ]
 regs.forEach(function(rs){
  var mactches = rsHtml.match(rs);
  for (var i=0;i < mactches.length ; i++)
  {
   rsHtml = rsHtml.replace(mactches[i],mactches[i].indexOf('stylesheet')>-1?'<link rel="stylesheet" href="wiki'+(i+1)+'.css"':'');
  }
 })

運行效果
上維基中文是需要FQ的,試運行了一下,抓取 航空母艦 分類,運行過程中,發(fā)現(xiàn)了三百左右的相關(guān)鏈接(包括分類頁面,這些頁面我是只取有效鏈接,不下載),最終正確的下載了209個,手工測試了一些出錯鏈接,發(fā)現(xiàn)都為無效鏈接,顯示該詞條還未建立,整個過程大概花了不到十五分鐘,壓縮后近三十M,感覺效果還不錯。

源代碼
https://github.com/zhoutk/wikiSpider
小結(jié)
到昨晚基本完成任務(wù),思路一能夠抓取內(nèi)容比較準(zhǔn)確的頁面,而且頁面不重復(fù),但抓取效率不高,分類信息無法準(zhǔn)確獲得;思路二能夠按維基百科的分類,自動抓取并分門別類的把文件存儲到本地,效率高(實測,抓取【軍艦】類,共抓取頁面近六千個,費時五十來分鐘,每分鐘能抓取超過一百個頁面),能準(zhǔn)確的保存分類信息。
最大的收獲在于深刻的理解了異步編程的整體流程控制。

相關(guān)文章

  • Node.js連接postgreSQL并進(jìn)行數(shù)據(jù)操作

    Node.js連接postgreSQL并進(jìn)行數(shù)據(jù)操作

    自從MySQL被Oracle收購以后,PostgreSQL逐漸成為開源關(guān)系型數(shù)據(jù)庫的首選。這篇文章就給大家介紹了關(guān)于Node.js如何連接postgreSQL數(shù)據(jù)庫,并進(jìn)行數(shù)據(jù)操作的方法,有需要的朋友們可以參考借鑒,下面來一起看看吧。
    2016-12-12
  • node+multer實現(xiàn)圖片上傳的示例代碼

    node+multer實現(xiàn)圖片上傳的示例代碼

    這篇文章主要介紹了node+multer實現(xiàn)圖片上傳的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • Mac下安裝node.js及環(huán)境配置全過程

    Mac下安裝node.js及環(huán)境配置全過程

    這篇文章主要介紹了Mac下安裝node.js及環(huán)境配置全過程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • npm install常見錯誤類型及對應(yīng)的解決方案

    npm install常見錯誤類型及對應(yīng)的解決方案

    在前端開發(fā)中,npm是最常用的包管理工具,通過 npm install 命令,開發(fā)者可以輕松地安裝項目所需的依賴包,然而,在實際使用過程中,npm install 可能會因為各種原因而報錯,本文將詳細(xì)介紹一些常見的 npm install 錯誤類型、發(fā)生原因及其對應(yīng)的解決方案,需要的朋友可以參考下
    2025-03-03
  • Mongoose經(jīng)常返回e11000 error的原因分析

    Mongoose經(jīng)常返回e11000 error的原因分析

    這篇文章主要給大家分析了Mongoose經(jīng)常返回e11000 error的原因,文中介紹的非常詳細(xì),對大家具有一定的參考價值,需要的朋友可以們下面來一起看看吧。
    2017-03-03
  • 如何在Node和瀏覽器控制臺中打印彩色文字

    如何在Node和瀏覽器控制臺中打印彩色文字

    這篇文章主要介紹了如何在Node和瀏覽器控制臺中打印彩色文字,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • node.js中的emitter.on方法使用說明

    node.js中的emitter.on方法使用說明

    這篇文章主要介紹了node.js中的emitter.on方法使用說明,本文介紹了emitter.on的方法說明、語法、接收參數(shù)、使用實例和實現(xiàn)源碼,需要的朋友可以參考下
    2014-12-12
  • Sublime Text3 配置 NodeJs 環(huán)境的方法

    Sublime Text3 配置 NodeJs 環(huán)境的方法

    大家都知道,Sublime Text 安裝插件一般從 Package Control 中直接安裝即可,當(dāng)我安裝 node js 插件時候,直接通過Package Control 安裝,雖然插件安裝成功了,但是找不到配置文件 Nodejs.sublime-build 來更改一些配置
    2020-05-05
  • Windows8下搭建Node.js開發(fā)環(huán)境教程

    Windows8下搭建Node.js開發(fā)環(huán)境教程

    這篇文章主要介紹了Windows8下搭建Node.js開發(fā)環(huán)境教程,Win8下安裝node.js也比較簡單,只是一些權(quán)限比較麻煩,需要的朋友可以參考下
    2014-09-09
  • Node.js中的CommonJS模塊化規(guī)范詳解

    Node.js中的CommonJS模塊化規(guī)范詳解

    這篇文章主要介紹了Node.js中的CommonJS模塊化規(guī)范,本文主要介紹了?CommonJS?規(guī)范在?Node?中的簡單應(yīng)用,主要就是導(dǎo)入和導(dǎo)出模塊,需要的朋友可以參考下
    2023-02-02

最新評論

富裕县| 汝南县| 子洲县| 砚山县| 辽阳市| 红安县| 湖南省| 巨野县| 中牟县| 和林格尔县| 自贡市| 梓潼县| 神池县| 修武县| 沅陵县| 乌苏市| 越西县| 南靖县| 清水县| 澄迈县| 鞍山市| 陆川县| 乌拉特后旗| 大安市| 巴彦淖尔市| 房产| 公主岭市| 彩票| 周至县| 浪卡子县| 华宁县| 云林县| 布尔津县| 通城县| 乐安县| 鄂州市| 永州市| 二手房| 太湖县| 彭州市| 西林县|