源代碼:https://github.com/dataabc/weiboSpider
本程序可以連續爬取一個或多個新浪微博用戶的數據,並將結果信息寫入文件或數據庫。此處作為論文數據應用。
首先進入GitHub下載代碼至本地。
將該程序導入進PyCharm,此處的readme類似說明書,根據說明進行增刪改查即可,config是需要配置的內容(根據自己需要爬取的內容)。
需要的配置如下:
打開cmd,進行pip install
lxml == 4.6.5
requests == 2.23.0
tqdm == 4.46.1
absl-py == 0.9.0
進行實例爬取,以爬取蘇炳添的微博存儲為.csv文件為例,我們需要修改config.json文件,文件內容如下:
{
"user_id_list": ["2029906001"],
"filter": 1,
"since_date": "2008-01-01",
"end_date": "now",
"random_wait_pages": [1, 5],
"random_wait_seconds": [6, 10],
"global_wait": [[1000, 3600], [500, 2000]],
"write_mode": ["csv"],
"pic_download": 1,
"video_download": 0,
"file_download_timeout": [5, 5, 10],
"result_dir_name": 0,
"cookie": "your cookie"
}
解釋如下:
- user_id_list代表我要爬取的微博用戶的user_id,可以是一個或多個,也可以是文件路徑,微博用戶蘇炳添的user_id為2029906001,具體如何獲取user_id見docs文件夾下userid.md文件;
- filter的值為1代表爬取全部原創微博,值為0代表爬取全部微博(原創+轉發);
- since_date代表我們要爬取since_date日期之后發布的微博,因為我要爬蘇炳添的2008年以后的原創微博,所以since_date設置了為2008-01-01;
- end_date代表我們要爬取end_date日期之前發布的微博,since_date配合end_date,表示我們要爬取發布日期在since_date和end_date之間的微博,包含邊界,如果end_date值為"now",表示爬取發布日期從since_date到現在的微博;
- write_mode代表結果文件的保存類型,我想要把結果寫入csv文件,所以它的值為["csv"],如果你想寫入其他,參考原始config.json文件即可,也可參考docs文件夾下settings.md;
- pic_download值為1代表下載微博中的圖片,值為0代表不下載;
- video_download值為1代表下載微博中的視頻,值為0代表不下載;
- result_dir_name控制結果文件夾名,值為1代表文件夾名是用戶id,值為0代表文件夾名是用戶昵稱;
- cookie是爬蟲微博的cookie,具體如何獲取cookie可以參考docs文件夾下cookie.md,獲取cookie后把"your cookie"替換成真實的cookie值即可(這里隱私就不寫出來,非常簡單哦)。
接下來進行程序運行:
首先必須在cmd將目錄轉移到weiboSpider-master的目錄,比如進入cmd后:
f:
cd code\weiboSpider-master
接下來運行:
python -m weibo_spider
完工!!!時間可能會很長,耐心等待下載即可!效果如下:
數據展示如下(蘇神數據只到2015年):
本項目提出的一些常見問題:
1、程序運行出錯,錯誤提示中包含“ImportError: cannot import name 'config_util' from 'main'”,如何解決?
出現這種錯誤,說明使用者很可能是直接運行的.py文件,程序正確的運行方式是在weiboSpider目錄下,運行如下命令:
python -m weibo_spider
2、程序運行出錯,錯誤提示中包含“'NoneType' object”字樣,如何解決?
這是最常見的問題之一。出錯原因是爬取速度太快,被暫時限制了,限制可能包含爬蟲賬號限制和ip限制。一般情況下,一段時間后限制會自動解除。可通過降低爬取速度避免被限制,具體修改config.json文件中的如下代碼:
"random_wait_pages": [1, 5],
"random_wait_seconds": [6, 10],
"global_wait": [[1000, 3600], [500, 2000]],
前兩行的意思是每爬取1到5頁,隨機等待6到10秒。可以通過加快暫停頻率(減小random_wait_pages內的值)或增加等待時間(加大random_wait_seconds內的值)避免被限制。最后一行的意思是獲取1000頁微博,一次性等待3600秒;之后獲取500頁微博一次性等待2000秒。默認只有兩個global_wait配置([1000, 3600]和[500, 2000]),可以添加更多個,也可以自定義。當配置使用完,如默認配置在獲取1500(1000+500)頁微博后就用完了,之后程序會從第一個配置開始循環使用(獲取第1501頁到2500頁等待3600秒,獲取第2501頁到第3000頁等待2000秒,以此類推)。
3、如何獲取微博評論?
因為限制,只能獲取一部分評論,無法獲取全部,因此暫時沒有添加獲取評論功能的計划。
4、有的長微博正文只能獲取一部分內容,如何解決?
程序是可以獲取長微博全文的。程序首先在微博列表頁獲取微博,如果發現長微博(正文沒有顯示完整,以“全文”代替部分內容的微博),會先保存這個不全的內容,然后去該長微博的詳情頁嘗試獲取全文,如果獲取成功,獲取的內容就是微博文本;如果獲取失敗,等待若干秒重新獲取;如果連續嘗試5次都失敗,就用上面不全的內容代替。這樣做的原因是避免因部分長微博獲取失敗而卡住。如果想嘗試更多次,可以修改comment_parser.py文件get_long_weibo方法內for循環的次數。
5、如何按指定關鍵詞獲取微博?
請使用weibo-search。該程序可以連續獲取一個或多個微博關鍵詞搜索結果,並將結果寫入文件(可選)、數據庫(可選)等。所謂微博關鍵詞搜索即:搜索正文中包含指定關鍵詞的微博,可以指定搜索的時間范圍。對於非常熱門的關鍵詞,一天的時間范圍,可以獲得1000萬以上的搜索結果,N天的時間范圍就可以獲得1000萬 X N搜索結果。對於大多數關鍵詞,一天產生的相應微博數量應該在1000萬條以下,因此可以說該程序可以獲得大部分關鍵詞的全部或近似全部的搜索結果。而且該程序可以獲得搜索結果的所有信息,本程序獲得的微博信息該程序都能獲得。
6、如何獲取微博用戶關注列表中用戶的user_id?
請使用weibo-follow。該程序可以利用一個user_id,獲取該user_id微博用戶關注人的user_id,一個user_id最多可以獲得200個user_id,並寫入user_id_list.txt文件。程序支持讀文件,利用這200個user_id,可以獲得最多200X200=40000個user_id。再利用這40000個user_id可以得到40000X200=8000000個user_id,如此反復,以此類推,可以獲得大量user_id。本項目也支持讀文件,將上述程序的結果文件user_id_list.txt路徑賦值給本項目config.json的user_id_list參數,就可以獲得這些user_id用戶所發布的大量微博。
7、如何獲取自己的微博?
修改page_parser.py中__init__方法,將self.url修改為:
self.url = "https://weibo.cn/%s/profile?page=%d" % (user_uri, page)