Python Scrapy框架爬取微博數據

-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.具體問題

如果有具體想了解的可以評論區交流,由於項目保密性,所以無法貼出代碼.

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