-1.前言
最近導師接到了一個項目,要爬取社交網路的數據,其中有一部分是爬取微博,Twitter和Facebook.目前實現了微博部分.先寫着.
整個工程是使用的python3.6+Scray框架+MySQL數據庫.
整個項目是在一個github開源的項目的基礎上進行修改.
由於整個項目具有保密性,所以源碼就不能放出了,下面和大家交流思路.
未完待續,有空我就會更新一下.
0.總體思路
主要是通過weibo.cn這個站去爬取.這個也是網上的大佬們最常用的方式.
首先分析一下爲什麼這麼做:
首先,新浪微博的API已經是個廢的了,不用再考慮了.
新浪微博目前存在三個站點 weibo.cn(最老的站),m.weibo.com(目前手機端的站),weibo.com(PC端的站).這三個站的爬取難度由低到高.後兩個站都是動態加載的,想要爬取就要模擬瀏覽器的下滑動作(不過也可以判斷分頁問題,但這樣速度就很慢了),而且評論也是動態加載的,這就導致爬取難度很大.(至少對於我這個新手來說)
再者,這個站訪問的頁面都是有規律可循的,所以難度就降低了.
上面是優點.
缺點就是這個站能夠爬取的信息不足,一是無法獲取爬取用戶的點贊別人的微博,二是無法獲取全部的粉絲/關注列表(另外兩個站限制的更多)
總體上爬取的相關信息如下:
1.個人信息
2.粉絲列表(最近200位)
3.關注列表(最近200位)
4.指定用戶的所有微博
5.單條微博的點贊/轉發/評論數
6.單條微博下的所有評論(包括評論者的UID)
1.技術描述
首先是使用的編程環境:Windows 10 + pycharm 2018.2.4 + Anaconda3 + Python 3.6.6 +Scrapy 1.5.1 + (Mysql 5.7.23 + SQLyog Community 64)
關於 pycharm 和 Anaconda3 的相關配置請自行百度完成後,記得換源,不然後面conda一些環境的時候會非常痛苦.
關於 Scrapy 框架的安裝可以參考《Python 3網絡爬蟲開發實戰》,裏面第一章爬蟲環境的搭建.同時記得裝上pysql.
PS:網上有很多人用的MongoDB,但是我是感覺也就Python寫代碼的是方便點,資源還是比較少(尤其是,我需要做簡單的有界面的數據展示,以前本科是用C#做項目的,研究了很久的MongoDB的dll是真的很難受.最後還是換成了MySQL)
主要的思路就是模擬瀏覽器登錄,然後獲取Cookies.由此構成請求頭.通過登陸過的頁面去訪問個人微博,獲取相關信息.
1.1 模擬登陸
主要使用selenium去獲取控件的相關信息,並且輸入用戶名和密碼,進行點擊登錄操作,一般還會出現驗證碼的問題,可以獲取到驗證碼的控件,截取圖像,對圖像進行對比,然後完成驗證碼的問題.
ps 如果是個人使用,數據量不大的情況,可以手動的去瀏覽器的控制檯中(一般是F12)去找到cookies.
1.2 scrapy框架設置
配置都在setting.py中
首先是隨機請求頭的問題,這裏有部分可以參考:
USER_AGENT_LIST = [
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1",
"Mozilla/5.0 (X11; CrOS i686 2268.111.0) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1092.0 Safari/536.6",
"Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1090.0 Safari/536.6",
"Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/19.77.34.5 Safari/537.1",
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.9 Safari/536.5",
"Mozilla/5.0 (Windows NT 6.0) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.36 Safari/536.5",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
"Mozilla/5.0 (Windows NT 5.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; SE 2.X MetaSr 1.0; SE 2.X MetaSr 1.0; .NET CLR 2.0.50727; SE 2.X MetaSr 1.0)",
"Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",
"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; 360SE)",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
"Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.0 Safari/536.3",
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24",
"Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24"
]
同時需要在DOWNLOADER_MIDDLEWARES屬性中加入如下代碼:
'sina.middlewares.RandomUserAgentMiddleware': 400
2.數據爬取
首先你要獲取到你訪問用戶的UID,這個就不描述了.
然後構成最初是的請求:
yield Request(url="https://weibo.cn/%s/info" % uid, callback=self.parse_information)
parse_information 爲下一個函數,主要是完成個人信息的抓取
然後在個人信息列表點擊微博,可以看到個人的單條微博是有固定格式的url,評論以及粉絲等等都是,再通過網頁解析的方式獲取相關信息(可以用requests , bs4 + urllib等等)
3.具體問題
如果有具體想了解的可以評論區交流,由於項目保密性,所以無法貼出代碼.