知乎爬蟲(scrapy默認配置下單機1小時可爬取60多萬條數據)

知乎爬蟲(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技術,歡迎大家提問,互相學習。

環境:

  1. Ubuntu16.04
  2. Python環境是ubuntu自帶的python3.5.2
  3. 需要安裝的軟件Redis, MongoDB, Phantomjs;
  4. 需要安裝的python模塊:scrapy, scrapy-redis, selenium
  5. 電腦是用的小米筆記本4999元的那個版本,如果是臺式機的話速度應該會更快。(ps:如果想更快,可以加大setting.py 中的 CONCURRENT_REQUESTS的值,這個值默認是16,可以調大,直到CPU使用率達到80-90%,相信速度會快很多,絕不僅僅是一分鐘6000多條。當然也可以在單機上多進程爬取)

使用說明:

  1. 打開cookie.py,填入你的知乎賬號密碼
  2. 運行爬蟲 : scrapy crawl zhishuspider 即可
  3. 分佈式擴展:把代碼考到新一臺機器上,只需要把setting.py裏的REDIS_HOSTFILTER_HOST改成主機的地址就好,其他的根據自己的具體情況修改。然後運行即可。
  4. 提示:如果你的賬號數量不夠多,建議把DOWNLOAD_DELAY開啓(即把代碼裏註釋的那四行取消註釋掉),數值多少根據自己具體情況更改。

代碼說明:

  1. 爬蟲基於scrapy+redis架構進行開發、優化。
  2. 爬蟲支持斷點續爬。
  3. 非常簡易地,便可實現分佈式擴展。
  4. 使用Redis的“位”進行去重,1G的內存可滿足80億個用戶ID的瞬間去重。
  5. 將種子優化到不足40個字符,大大降低了Redis的內存消耗,也提高了各子爬蟲從Redis取種子的速度。
  6. 維護了一個Cookie池,各子機器共用一個Cookie池,斷點續爬不會重複獲取Cookie,當某個Cookie失效時會自動更新。
  7. 直接爬取通過抓包得到的json格式的鏈接,請求速度更快、爬取速度更快。單機一小時可爬取60多萬條數據
  8. 代碼中自帶proxy(自動更換ip),但並未啓用,經測試,只要賬號數量夠多,暫不需要啓用,如需啓用,請自行購買代理ip,並修改代碼proxy.py中GetIPPOOLS()函數(我是用的大象代理,5元20000個,不是廣告,挺便宜,但真心覺得不咋好用,每十個ip差不多有一個能用(延遲在2s內)),如果你是用的大象代理,就不需要修改代碼。
  9. 支持手動識別驗證碼和自動識別驗證碼,如需自動登錄,請自行購買雲打碼平臺賬號。默認啓動的是手動識別,需要手動輸入驗證碼。如果你想自己寫個代碼識別驗證碼,那也是可以的。

爬取內容:

  1. 用戶的個人信息以及粉絲和關注的人(可以生成用戶的拓撲關係圖)
  2. 用戶的回答
  3. 用戶的提問
  4. 文章

爬取字段:

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章