QQ空間爬蟲分享(一天可抓取 400 萬條資料)

九茶發表於2016-03-01

程式碼請移步GitHub:QQSpider

爬蟲功能:

QQSpider 使用廣度優先策略爬取QQ空間中的個人資訊、日誌、說說、好友四個方面的資訊,詳細可見資料庫說明
判重使用“記憶體位”判重,理論上億數量級的QQ可瞬間判重,記憶體只佔用400M+。
爬蟲速度可達到單機每天400萬條資料以上(具體要考慮網速、網路頻寬、穩定性等原因。我在學校是400萬+,但在公司那邊卻只有六成的速度,普通家庭網路可能會更慢)。


環境、架構:

開發語言:Python2.7
開發環境:64位Windows8系統,4G記憶體,i7-3612QM處理器。
資料庫:MongoDB 3.2.0
(Python編輯器:Pycharm 5.0.4;MongoDB管理工具:MongoBooster 1.1.1)

主要使用 requests 模組抓取,部分使用 BeautifulSoup 解析。
多執行緒使用 multiprocessing.dummy 。
抓取 Cookie 使用 selenium 和 PhantomJS 。
判重使用 BitVector 。


使用說明:

啟動前配置:
MongoDB安裝好 能啟動即可,不需要配置。
Python需要安裝以下模組(注意官方提供的模組是針對win32系統的,64位系統使用者在使用某些模組的時候可能會出現問題,所以儘量先找64位模組,如果沒有64的話再去安裝32的資源):
requests、BeautifulSoup、multiprocessing、selenium、itertools、BitVector、pymongo

另外我們需要使用到 PhantomJS,這並不是 Python 的模組,而是一個exe可執行檔案,我們可以利用它模擬瀏覽器去獲取 Cookie 。使用方法:將 phantomjs-2.0.0-windows.zip 壓縮包裡面的 phantomjs.exe 放到你的 Python 目錄下就行了。


啟動程式:

  1. 進入 myQQ.txt 寫入QQ賬號和密碼(用一個空格隔開,不同QQ換行輸入),一般你開啟幾個QQ爬蟲執行緒,就至少需要兩倍數量的QQ用來登入,至少要輪著登入嘛。
  2. 進入 init_messages.py 進行爬蟲引數的配置,例如執行緒數量的多少、設定爬哪個時間段的日誌,哪個時間段的說說,爬多少個說說備份一次等等。
  3. 執行 init.py 檔案開啟爬蟲專案。
  4. 爬蟲開始之後首先根據 myQQ.txt 裡面的QQ去獲取 Cookie(以後登入的時候直接用已有的Cookie,就不需要每次都去拿Cookie了,遇到Cookie失效也會自動作相應的處理)。獲取完Cookie後爬蟲程式會去申請四百多兆的記憶體,申請的時候會佔用兩G左右的記憶體,大約五秒能完成申請,之後會掉回四百多M
  5. 爬蟲程式可以中途停止,下次可開啟繼續抓取。


執行截圖:

QQSpider code

說說資料:
QQSpider Mood

日誌資料:
QQSpider Blog

好友關係資料:
QQSpider Friends

個人資訊資料:
QQSpider Information1

QQSpider Information2


資料庫說明:

QQSpider主要爬取QQ使用者的說說、日誌、朋友關係、個人資訊。
資料庫分別設定 Mood、Blog、Friend、Information 四張表。

Mood 表:
_id:採用 “QQ_說說id” 的形式作為說說的唯一標識。
Co-oridinates:發說說時的定位座標,呼叫地圖API可直接檢視具體方位,可識別到在哪一棟樓。
Comment:說說的評論數。
Like:說說的點贊數。
Mood_cont:說說內容。
PubTime:說說發表時間。
QQ:發此說說的QQ號。
Source:說說的根源(對於轉發的說說),採用 “QQ_說說id” 的形式標識。
Tools:發說說的工具(手機型別或者平臺)。
Transfer:說說的轉發數。
URL:說說的連結地址。
isTransfered:此說說是否屬於轉發來的。

Blog 表:
_id:採用 “QQ_日誌id” 的形式作為日誌的唯一標識。
Blog_cont:日誌內容。
Comment:日誌的評論數。
Like:日誌的點贊數。
PubTime:日誌的發表時間。
QQ:發此日誌的QQ號。
Share:日誌的分享數。
Source:日誌的根源(對於轉發的日誌),採用 “QQ_日誌id” 的形式標識。
Title:日誌的標題。
Transfer:日誌的轉發數。
URL:日誌的連結地址。
isTransfered:此日誌是否屬於轉發來的。

Friend 表:
_id:採用 QQ 作為唯一標識。
Num:此QQ的好友數(僅統計已抓取到的)。
Fx:朋友的QQ號,x代表第幾位好友,x從1開始逐漸迭加。

Information 表:
_id:採用 QQ 作為唯一標識。
Age:年齡。
Birthday:出生日期。
Blog:已發表的日誌數。
Blogs_WeGet:我們已抓取的日誌數。
Blood_type:血型。
Career:職業。
Company:公司。
Company_address:公司詳細地址。
Company_city:公司所在城市。
Company_country:公司所在國家。
Company_province:公司所在省份。
Constellation:星座。
CurrentTime:抓取當前資訊的時間(不同時間資訊會不同)。
FriendsNum:好友數(僅統計已抓取的)。
Gender:性別。
Hometown_city:故鄉所在城市。
Hometown_country:故鄉所在國家。
Hometown_province:故鄉所在省份。
Living_city:居住的城市。
Living_country:居住的國家。
Living_province:居住的省份。
Marriage:婚姻狀況。
Message:空間留言數。
Mood:已發表的說說數。
Mood_WeGet:我們已抓取的說說數。
PageView:空間總訪問量。
Picture:已發表的照片數(包括相簿裡的照片和說說裡的照片)。


結語:

自己一個人瞎搞了一個多星期,肯定還有很多地方不規範,不夠優化。不足之處請多指出!

更新版本:《QQ空間爬蟲分享(2016年11月18日更新)》



轉載請註明出處,謝謝!(原文連結:http://blog.csdn.net/bone_ace/article/details/50771839

相關文章