知乎爬蟲(scrapy默認配置下單機1小時可爬取60多萬條數據)
版本:1.0
作者: AlexTan
CSDN: http://blog.csdn.net/alextan_
e-mail: [email protected]
Github: https://github.com/AlexTan-b-z
代碼請移步GitHub:ZhihuSpider
前言:
在這裏特別鳴謝: 九茶 http://blog.csdn.net/bone_ace
學了爬蟲差不多快一年了,然而由於項目原因,這還是第一次發爬蟲的博客,在學習的過程中,受益最大的就是看了九茶的微博爬蟲吧,所以在這裏特別鳴謝。 他的代碼裏涉及了很多:自動化技術、模擬登錄、分佈式、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
最後,歡迎大家提出問題,共同學習!!!
轉載請註明出處,謝謝!(原文鏈接: http://blog.csdn.net/AlexTan_/article/details/77057068)