1. 程式人生 > >知乎爬蟲(scrapy預設配置下單機1小時可爬取60多萬條資料)

知乎爬蟲(scrapy預設配置下單機1小時可爬取60多萬條資料)

前言:

學了爬蟲差不多快一年了,然而由於專案原因,這還是第一次發爬蟲的部落格,在學習的過程中,受益最大的就是看了九茶的微博爬蟲吧,所以在這裡特別鳴謝。 他的程式碼裡涉及了很多:自動化技術、模擬登入、分散式、redis、mongodb等都有涉及,而且還講了程式碼的可複用性,深受啟發。 不過,對於爬蟲的知識塊兒來講,還沒涉及抓包(因為個人覺得,如果只抓取json資料的話,會比抓取普通網頁速度來得快得多)、以及自動更換IP技術,於是在這裡寫一個知乎爬蟲的部落格,這篇部落格裡,除了九茶的微博爬蟲所涉及的知識以外,還有抓包、以及更換ip技術,歡迎大家提問,互相學習。

環境: Ubuntu16.04 Python環境是ubuntu自帶的python3.5.2 需要安裝的軟體Redis, MongoDB, Phantomjs; 需要安裝的python模組:scrapy, scrapy-redis, selenium 電腦是用的小米筆記本4999元的那個版本,如果是桌上型電腦的話速度應該會更快。(ps:如果想更快,

可以加大setting.py 中的 CONCURRENT_REQUESTS的值,這個值預設是16,可以調大,直到CPU使用率達到80-90%,相信速度會快很多,絕不僅僅是一分鐘6000多條。當然也可以在單機上多程序爬取) 使用說明: 開啟cookie.py,填入你的知乎賬號密碼 執行爬蟲 : scrapy crawl zhishuspider 即可 分散式擴充套件:把程式碼考到新一臺機器上,只需要把setting.py裡的REDIS_HOST和FILTER_HOST改成主機的地址就好,其他的根據自己的具體情況修改。然後執行即可。 提示:如果你的賬號數量不夠多,建議把DOWNLOAD_DELAY開啟(即把程式碼裡註釋的那四行取消註釋掉),數值多少根據自己具體情況更改。 程式碼說明: 爬蟲基於scrapy+redis架構進行開發、優化。 爬蟲支援斷點續爬。 非常簡易地,便可實現分散式擴充套件。 使用Redis的“位”進行去重,1G的記憶體可滿足80億個使用者ID的瞬間去重。 將種子優化到不足40個字元,大大降低了Redis的記憶體消耗,也提高了各子爬蟲從Redis取種子的速度。 維護了一個Cookie池,各子機器共用一個Cookie池,斷點續爬不會重複獲取Cookie,當某個Cookie失效時會自動更新。 直接爬取通過抓包得到的json格式的連結,請求速度更快、爬取速度更快。單機一小時可爬取60多萬條資料 程式碼中自帶proxy(自動更換ip),但並未啟用,經測試,只要賬號數量夠多,暫不需要啟用,如需啟用,請自行購買代理ip,並修改程式碼proxy.py中GetIPPOOLS()函式(我是用的大象代理,5元20000個,不是廣告,挺便宜,但真心覺得不咋好用,每十個ip差不多有一個能用(延遲在2s內)),如果你是用的大象代理,就不需要修改程式碼。 支援手動識別驗證碼和自動識別驗證碼,如需自動登入,請自行購買雲打碼平臺賬號。預設啟動的是手動識別,需要手動輸入驗證碼。如果你想自己寫個程式碼識別驗證碼,那也是可以的。 爬取內容: 使用者的個人資訊以及粉絲和關注的人(可以生成使用者的拓撲關係圖) 使用者的回答 使用者的提問 文章 爬取欄位: ZhihuItem(使用者個人資訊): 欄位名 含義 user_id 使用者id user_image_url 使用者頭像連結 name 使用者暱稱 locations 使用者住址 business 使用者所在行業 employments 使用者職業經歷 gender 使用者性別 education 使用者教育經歷 followees_num 使用者關注數 followers_num 使用者粉絲數 RelationItem(關係): 欄位名 含義 user_id 使用者id relation_type 關係型別 relations_id 關係的人的id AnswerItem(回答): 欄位名 含義 answer_user_id 回答的使用者 answer_id 回答內容的id question_id 問題的id cretated_time 建立的時間戳 updated_time 更新的時間戳 voteup_count 贊成數 comment_count 評論數 content 回答內容 QuestionItem(問題): 欄位名 含義 ask_user_id 提問人的id question_id 問題的id ask_time 提問時間 answer_count 回答數量 followees_count 關注數量 title 提問標題 ArticleItem(文章): 欄位名 含義 author_id 作者id title 文章標題 article_id 文章id content 文章內容 cretated_time 建立時間戳 updated_time 更新時間戳 voteup_count 贊成數 comment_count 評論數 關於抓包獲取到的幾個連結問題: 未登入狀態下需要Authorization才能訪問json資料的連結,帶登入後的cookie訪問就不需要了。

Authorization可以通過訪問任意一個使用者頁面在請求json資料鏈接中的header中獲取,建議通過模擬瀏覽器的方式獲取,不過如果登陸了就不需要了,故程式碼中沒有獲取Authorization。