一、環境配置
1)搞一台伺服器,什麼linux都行,我用的是CentOS 6.5;
2)裝個mysql資料庫,5.5或5.6均可,圖省事可以直接用lnmp或lamp來裝,回頭還能直接在瀏覽器看日誌;
3)先安個node.js環境,我用的是0.12.7,更靠後的版本沒試過;
4)執行npm -g install forever,安裝forever好讓爬蟲在後台跑;
5)把所有程式碼整到本地(整=git clone);
6)在專案目錄下執行npm install安裝依賴函式庫;
7)在專案目錄下建立json和avatar兩個空資料夾;
8)建立一個空mysql資料庫和一個有完整權限的用戶,先後執行程式碼裡的setup.sql和startusers.sql,建立一個資料庫結構並導入初始種子用戶;
9)編輯config.js,標示(必須)的設定項目必須填入或修改,其餘項目可暫時不改:
exports.jsonPath = "./json/";//生成json文件的路径 exports.avatarPath = "./avatar/";//保存头像文件的路径 exports.dbconfig = { host: 'localhost',//数据库服务器(必须) user: 'dbuser',//数据库用户名(必须) password: 'dbpassword',//数据库密码(必须) database: 'dbname',//数据库名(必须) port: 3306,//数据库服务器端口 poolSize: 20, acquireTimeout: 30000 }; exports.urlpre = "http://www.jb51.net/";//脚本网址 exports.urlzhuanlanpre = "http://www.jb51.net/list/index_96.htm/";//脚本网址 exports.WPurl = "www.xxx.com";//要发布文章的wordpress网站地址 exports.WPusername = "publishuser";//发布文章的用户名 exports.WPpassword = "publishpassword";//发布文章用户的密码 exports.WPurlavatarpre = "http://www.xxx.com/avatar/";//发布文章中替代原始头像的url地址 exports.mailservice = "QQ";//邮件通知服务类型,也可以用Gmail,前提是你访问得了Gmail(必须) exports.mailuser = "12345@qq.com";//邮箱用户名(必须) exports.mailpass = "qqpassword";//邮箱密码(必须) exports.mailfrom = "12345@qq.com";//发送邮件地址(必须,一般与用户名所属邮箱一致) exports.mailto = "12345@qq.com";//接收通知邮件地址(必须)
儲存,然後進入下一步。
二、爬蟲使用者
爬蟲的原理其實就是模擬一個真正的知乎用戶在網站上點來點去並收集數據,所以我們需要有一個真正的知乎用戶。 為了測試可以用自己的帳號,但從長遠著想,還是專門註冊個小號吧,一個就夠,目前的爬蟲也只支援一個。 我們的模擬過程不必像真的使用者一樣從首頁登錄,而是直接借用cookie值:
註冊啟動登入之後,進入自己的主頁,使用任何有開發者模式或查看cookie插件的瀏覽器,開啟知乎中自己的cookie。 可能有很複雜的一大串,但我們只需要其中一部分,也就是「z_c0」。 複製你自己cookie中的z_c0部分,連等號、引號、分號都不要落下,最後格式大致是這樣的:
z_c0="LA8kJIJFdDSOA883wkUGJIRE8jVNKSOQfB9430=|1420113988|a6ea18bc1b23ea469e3b5fb2e33c2828439cb";
在mysql資料庫的cookies表中插入一行記錄,其中各欄位值分別為:
- email:爬蟲使用者的登入信箱
- password:爬蟲使用者的密碼
- 名稱:爬蟲使用者名稱
- hash:爬蟲用戶的hash(每個用戶不可修改的唯一標識,其實這裡用不到,可以暫時留空)
-
cookie:剛才你複製的cookie
然後就可以正式開始運作了。若cookie失效或使用者被封,直接修改這行記錄的cookie欄位即可。
三、運行
推薦用forever來執行,這樣不僅方便後台運行和記錄日誌,還能在崩潰後自動重啟。 例:
forever -l /var/www/log.txt index.js
其中-l後的位址就是記錄日誌的地方,如果放在web伺服器目錄下,就能在瀏覽器裡透過http://www.xxx.com/log.txt 來直接查看日誌了。在index.js後面加上參數(用空格分隔)可以執行不同的爬蟲指令:
1、-i 立即執行,如果不加此參數則預設在下一個指定時間執行,如每天凌晨0:05分;
2、-ng 跳過抓取新使用者階段,即getnewuser;
3、-ns 跳過快照階段,即usersnapshot;
4、-nf 跳過生成資料檔階段,即saveviewfile;
5、-db 顯示調試日誌。
各階段的功能在下一節介紹。為了方便運行,這行命令可以寫成sh腳本,例如:
#!/bin/bash cd /usr/zhihuspider rm -f /var/www/log.txt forever -l /var/www/log.txt start index.js $*
具體路徑請替換成自己的。這樣就能透過./zhihuspider.sh 加參數來開啟爬蟲了: 例如./zhihuspider.sh -i -ng -nf就是立即開始任務、跳過新使用者和儲存檔案階段。停止爬蟲的方法是forever stopall(或stop序號)。
四、原理概述
看知乎爬蟲的入口檔案是index.js。它透過循環方式在每天指定時間執行爬蟲任務。每天順序執行的任務有三個,分別是:
1)getnewuser.js:透過目前庫內使用者追蹤者清單的對比,抓取新使用者訊息,依靠此機制可以自動將知乎上值得關注的新人納入庫中;
2)usersnapshot.js:循環抓取目前庫內用戶資料和答案列表,並以每日快照形式保存下來。
3)saveviewfile.js:根據最近一次快照內容,產生使用者分析列表,並篩選出昨日、近日和歷史精華答案發佈到「看知乎」網站。
在上述三個任務執行完畢後,主執行緒會每隔幾分鐘刷新一次知乎首頁,驗證當前cookie是否仍然有效,如果失效(跳到未登入頁),則會給指定郵箱發送通知郵件,提醒及時更換cookie。 更換cookie的方法和初始化時一致,只需手動登入一次然後取出cookie值就行了。如果對具體程式碼實作感興趣可以仔細看裡面的註釋,調整一些配置,甚至嘗試自己重構整個爬蟲。
Tips
1)getnewuser的原理是透過對比前後兩天快照中使用者的關注數量進行指定抓取,所以必須有了至少兩次快照之後才能開始,之前就算執行也會自動跳過。
2)快照抓到一半是可以恢復的。如果程式出錯崩潰,用forever stop停止它,然後加上參數-i -ng,立即執行並跳過新用戶階段就能從剛才抓到一半的快照繼續下去了。
3)不要輕易增加快照抓取時的(偽)執行緒數,即usersnapshots中的maxthreadcount屬性。線程太多會導致429錯誤,同時抓取回來的大量資料可能會來不及寫入資料庫造成記憶體溢位。所以,除非你的資料庫搭在SSD上,線程不要超過10個。
4)saveviewfile產生分析結果的工作需要至少近7天的快照才能進行,如果快照內容少於7天會報錯並跳過。先前的分析工作可以手動查詢資料庫進行。
5)考慮到大多數人並不需要複製一個「看知乎」,已經將自動發布wordpress文章函數入口註解掉了。如果你搭建好了wordpress,記得開啟xmlrpc,然後設定一個專門用於發布文章的用戶,在config.js中配置對應參數並將saveviewfile中的相關程式碼解除註解。
6)由於知乎對頭像做了防盜鏈處理,我們在抓取用戶資訊時一併也將頭像獲取了下來,保存在本地,發布文章時使用的是本地頭像地址。需要在http伺服器中將url路徑指向保存頭像的資料夾,或將保存頭像的資料夾直接放到網站目錄下。
7)程式碼可能不太容易讀懂。除了node.js的回調結構本身就較混亂之外,還有一部分原因是最初寫程式時我剛開始接觸node.js,有很多不熟悉的地方導致結構混亂沒有來得及改正;另一部分是在多次縫縫補補中累積了許多醜陋的判斷條件和重試規則,如果全部去掉,程式碼量可能會下降三分之二。但這是沒有辦法的事,為了保障一個系統的穩定運行,必須加入這些。
8)本爬蟲源碼基於WTFPL協議,不對修改和發布做任何限制。
以上就是本文的全部內容,希望對大家的學習有所幫助。

Vercel是什么?本篇文章带大家了解一下Vercel,并介绍一下在Vercel中部署 Node 服务的方法,希望对大家有所帮助!

gm是基于node.js的图片处理插件,它封装了图片处理工具GraphicsMagick(GM)和ImageMagick(IM),可使用spawn的方式调用。gm插件不是node默认安装的,需执行“npm install gm -S”进行安装才可使用。

本篇文章带大家详解package.json和package-lock.json文件,希望对大家有所帮助!

如何用pkg打包nodejs可执行文件?下面本篇文章给大家介绍一下使用pkg将Node.js项目打包为可执行文件的方法,希望对大家有所帮助!

本篇文章给大家分享一个Nodejs web框架:Fastify,简单介绍一下Fastify支持的特性、Fastify支持的插件以及Fastify的使用方法,希望对大家有所帮助!

node怎么爬取数据?下面本篇文章给大家分享一个node爬虫实例,聊聊利用node抓取小说章节的方法,希望对大家有所帮助!

本篇文章给大家分享一个Node实战,介绍一下使用Node.js和adb怎么开发一个手机备份小工具,希望对大家有所帮助!

先介绍node.js的安装,再介绍使用node.js构建一个简单的web服务器,最后通过一个简单的示例,演示网页与服务器之间的数据交互的实现。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境

禪工作室 13.0.1
強大的PHP整合開發環境