基于Node.js的強(qiáng)大爬蟲 能直接發(fā)布抓取的文章哦
一、環(huán)境配置
1)搞一臺(tái)服務(wù)器,什么linux都行,我用的是CentOS 6.5;
2)裝個(gè)mysql數(shù)據(jù)庫(kù),5.5或5.6均可,圖省事可以直接用lnmp或lamp來(lái)裝,回頭還能直接在瀏覽器看日志;
3)先安個(gè)node.js環(huán)境,我用的是0.12.7,更靠后的版本沒(méi)試過(guò);
4)執(zhí)行npm -g install forever,安裝forever好讓爬蟲在后臺(tái)跑;
5)把所有代碼整到本地(整=git clone);
6)在項(xiàng)目目錄下執(zhí)行npm install安裝依賴庫(kù);
7)在項(xiàng)目目錄下創(chuàng)建json和avatar兩個(gè)空文件夾;
8)建立一個(gè)空mysql數(shù)據(jù)庫(kù)和一個(gè)有完整權(quán)限的用戶,先后執(zhí)行代碼里的setup.sql和startusers.sql,創(chuàng)建數(shù)據(jù)庫(kù)結(jié)構(gòu)并導(dǎo)入初始種子用戶;
9)編輯config.js,標(biāo)明(必須)的配置項(xiàng)必須填寫或修改,其余項(xiàng)可以暫時(shí)不改:
exports.jsonPath = "./json/";//生成json文件的路徑 exports.avatarPath = "./avatar/";//保存頭像文件的路徑 exports.dbconfig = { host: 'localhost',//數(shù)據(jù)庫(kù)服務(wù)器(必須) user: 'dbuser',//數(shù)據(jù)庫(kù)用戶名(必須) password: 'dbpassword',//數(shù)據(jù)庫(kù)密碼(必須) database: 'dbname',//數(shù)據(jù)庫(kù)名(必須) port: 3306,//數(shù)據(jù)庫(kù)服務(wù)器端口 poolSize: 20, acquireTimeout: 30000 }; exports.urlpre = "http://chabaoo.cn/";//腳本網(wǎng)址 exports.urlzhuanlanpre = "http://chabaoo.cn/list/index_96.htm/";//腳本網(wǎng)址 exports.WPurl = "www.xxx.com";//要發(fā)布文章的wordpress網(wǎng)站地址 exports.WPusername = "publishuser";//發(fā)布文章的用戶名 exports.WPpassword = "publishpassword";//發(fā)布文章用戶的密碼 exports.WPurlavatarpre = "http://www.xxx.com/avatar/";//發(fā)布文章中替代原始頭像的url地址 exports.mailservice = "QQ";//郵件通知服務(wù)類型,也可以用Gmail,前提是你訪問(wèn)得了Gmail(必須) exports.mailuser = "12345@qq.com";//郵箱用戶名(必須) exports.mailpass = "qqpassword";//郵箱密碼(必須) exports.mailfrom = "12345@qq.com";//發(fā)送郵件地址(必須,一般與用戶名所屬郵箱一致) exports.mailto = "12345@qq.com";//接收通知郵件地址(必須)
保存,然后進(jìn)入下一步。
二、爬蟲用戶
爬蟲的原理其實(shí)就是模擬一個(gè)真正的知乎用戶在網(wǎng)站上點(diǎn)來(lái)點(diǎn)去并收集數(shù)據(jù),所以我們需要有一個(gè)真正的知乎用戶。 為了測(cè)試可以用你自己的賬號(hào),但從長(zhǎng)遠(yuǎn)著想,還是專門注冊(cè)個(gè)小號(hào)吧,一個(gè)就夠,目前的爬蟲也只支持一個(gè)。 我們的模擬過(guò)程不必像真的用戶那樣從首頁(yè)登錄,而是直接借用cookie值:
注冊(cè)激活登錄之后,進(jìn)入自己的主頁(yè),使用任何有開發(fā)者模式或查看cookie插件的瀏覽器,打開知乎中自己的cookie。 可能有很復(fù)雜的一大串,但我們只需要其中一部分,即「z_c0」。 復(fù)制你自己cookie中的z_c0部分,連等號(hào)、引號(hào)、分號(hào)都不要落下,最后格式大致是這樣的:
z_c0="LA8kJIJFdDSOA883wkUGJIRE8jVNKSOQfB9430=|1420113988|a6ea18bc1b23ea469e3b5fb2e33c2828439cb";
在mysql數(shù)據(jù)庫(kù)的cookies表中插入一行記錄,其中各字段值分別為:
- email:爬蟲用戶的登錄郵箱
- password:爬蟲用戶的密碼
- name:爬蟲用戶名
- hash:爬蟲用戶的hash(每個(gè)用戶不可修改的唯一標(biāo)識(shí),其實(shí)這里用不到,可以暫時(shí)留空)
- cookie:剛才你復(fù)制的cookie
然后就可以正式開始運(yùn)行了。如果cookie失效或用戶被封,直接修改這行記錄的cookie字段即可。
三、運(yùn)行
推薦用forever來(lái)執(zhí)行,這樣不僅方便后臺(tái)運(yùn)行和記錄日志,還能在崩潰后自動(dòng)重啟。 示例:
forever -l /var/www/log.txt index.js
其中-l后的地址就是記錄日志的地方,如果放在web服務(wù)器目錄下,就能在瀏覽器里通過(guò)http://www.xxx.com/log.txt 來(lái)直接查看日志了。在index.js后面加參數(shù)(用空格分隔)可以執(zhí)行不同的爬蟲指令:
1、-i 立即執(zhí)行,如果不加此參數(shù)則默認(rèn)在下一個(gè)指定時(shí)間執(zhí)行,如每天凌晨0:05分;
2、-ng 跳過(guò)抓取新用戶階段,即getnewuser;
3、-ns 跳過(guò)快照階段,即usersnapshot;
4、-nf 跳過(guò)生成數(shù)據(jù)文件階段,即saveviewfile;
5、-db 顯示調(diào)試日志。
各階段的功能在下一節(jié)介紹。為了方便運(yùn)行,可以將這行命令寫成sh腳本,例如:
#!/bin/bash cd /usr/zhihuspider rm -f /var/www/log.txt forever -l /var/www/log.txt start index.js $*
具體路徑請(qǐng)?zhí)鎿Q成自己的。這樣就能通過(guò)./zhihuspider.sh 加參數(shù)來(lái)開啟爬蟲了: 比如./zhihuspider.sh -i -ng -nf就是立即開始任務(wù)、跳過(guò)新用戶和保存文件階段。停止爬蟲的方法是forever stopall(或stop序號(hào))。
四、原理概述
看知乎爬蟲的入口文件是index.js。它通過(guò)循環(huán)方式在每天指定時(shí)間執(zhí)行爬蟲任務(wù)。每天順序執(zhí)行的任務(wù)有三個(gè),分別是:
1)getnewuser.js:通過(guò)當(dāng)前庫(kù)內(nèi)用戶關(guān)注者列表的對(duì)比,抓取新用戶信息,依靠此機(jī)制可以自動(dòng)將知乎上值得關(guān)注的新人納入庫(kù)中;
2)usersnapshot.js:循環(huán)抓取當(dāng)前庫(kù)內(nèi)用戶資料和答案列表,并以每日快照形式保存下來(lái)。
3)saveviewfile.js:根據(jù)最近一次快照內(nèi)容,生成用戶分析列表,并篩選出昨日、近日和歷史精華答案發(fā)布到「看知乎」網(wǎng)站。
在以上三個(gè)任務(wù)執(zhí)行完畢后,主線程會(huì)每隔幾分鐘刷新一次知乎首頁(yè),驗(yàn)證當(dāng)前cookie是否仍然有效,如果失效(跳到未登錄頁(yè)),則會(huì)給指定郵箱發(fā)送通知郵件,提醒及時(shí)更換cookie。 更換cookie的方法和初始化時(shí)一致,只需手工登錄一次然后取出cookie值就行了。如果對(duì)具體代碼實(shí)現(xiàn)感興趣可以仔細(xì)看里面的注釋,調(diào)整一些配置,甚至嘗試自己重構(gòu)整個(gè)爬蟲。
Tips
1)getnewuser的原理是通過(guò)對(duì)比前后兩天快照中用戶的關(guān)注數(shù)量進(jìn)行指定抓取,所以必須有了至少兩次快照之后才能開始,之前就算執(zhí)行也會(huì)自動(dòng)跳過(guò)。
2)快照抓到一半是可以恢復(fù)的。如果程序出錯(cuò)崩潰,用forever stop停止它,然后加上參數(shù)-i -ng,立即執(zhí)行并跳過(guò)新用戶階段就能從剛才抓到一半的快照繼續(xù)下去了。
3)不要輕易增加快照抓取時(shí)的(偽)線程數(shù),即usersnapshots中的maxthreadcount屬性。線程太多會(huì)導(dǎo)致429錯(cuò)誤,同時(shí)抓取回來(lái)的大量數(shù)據(jù)可能會(huì)來(lái)不及寫入數(shù)據(jù)庫(kù)造成內(nèi)存溢出。所以,除非你的數(shù)據(jù)庫(kù)搭在SSD上,線程不要超過(guò)10個(gè)。
4)saveviewfile生成分析結(jié)果的工作需要至少近7天的快照才能進(jìn)行,如果快照內(nèi)容少于7天會(huì)報(bào)錯(cuò)并跳過(guò)。此前的分析工作可以手動(dòng)查詢數(shù)據(jù)庫(kù)進(jìn)行。
5)考慮到大多數(shù)人并不需要復(fù)制一個(gè)「看知乎」,已經(jīng)將自動(dòng)發(fā)布wordpress文章函數(shù)入口注釋掉了。如果你搭建好了wordpress,記得開啟xmlrpc,然后設(shè)置一個(gè)專門用于發(fā)布文章的用戶,在config.js中配置相應(yīng)參數(shù)并將saveviewfile中的相關(guān)代碼解除注釋。
6)由于知乎對(duì)頭像做了防盜鏈處理,我們?cè)谧ト∮脩粜畔r(shí)一并也將頭像獲取了下來(lái),保存在本地,發(fā)布文章時(shí)使用的是本地頭像地址。需要在http服務(wù)器中將url路徑指向保存頭像的文件夾,或者將保存頭像的文件夾直接放到網(wǎng)站目錄下。
7)代碼可能不太容易讀懂。除了node.js的回調(diào)結(jié)構(gòu)本身就較混亂之外,還有一部分原因是最初寫程序時(shí)我剛剛開始接觸node.js,有很多不熟悉的地方導(dǎo)致結(jié)構(gòu)混亂沒(méi)有來(lái)得及改正;另一部分是在多次縫縫補(bǔ)補(bǔ)中累加了許多丑陋的判斷條件和重試規(guī)則,如果全部去掉,代碼量可能會(huì)下降三分之二。但這是沒(méi)有辦法的事,為了保障一個(gè)系統(tǒng)的穩(wěn)定運(yùn)行,必須加入這些。
8)本爬蟲源碼基于WTFPL協(xié)議,不對(duì)修改和發(fā)布做任何限制。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助。
相關(guān)文章
Express中使用Swagger的實(shí)現(xiàn)示例
swagger-express是一個(gè)規(guī)范和完整的框架實(shí)現(xiàn),本文主要介紹了Express中使用Swagger的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下2023-12-12理解 Node.js 事件驅(qū)動(dòng)機(jī)制的原理
本篇文章主要介紹了理解 Node.js 事件驅(qū)動(dòng)機(jī)制的原理,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-08-08安裝nvm并使用nvm安裝nodejs及配置環(huán)境變量的全過(guò)程
有時(shí)候使用nvm管理node會(huì)發(fā)現(xiàn)無(wú)法使用node或npm,主要原因是環(huán)境變量沒(méi)有配置成功,下面這篇文章主要給大家介紹了關(guān)于安裝nvm并使用nvm安裝nodejs及配置環(huán)境變量的相關(guān)資料,需要的朋友可以參考下2023-03-03Node.js 條形碼識(shí)別程序構(gòu)建思路詳解
這篇文章主要介紹了Node.js 條形碼識(shí)別程序構(gòu)建思路詳解的相關(guān)資料,需要的朋友可以參考下2016-02-02