1. 程式人生 > >微博爬蟲,每日百萬級資料

微博爬蟲,每日百萬級資料

Update

已經整理好的千萬級微博語料,需要的戳這裡

前言

新浪微博絕對是一個巨大的,實時的語料庫!對微博資料爬取和分析,有重大的意義。

比如,現在要調查工商銀行的服務態度,就可以抓取微博內容中包含工商銀行的微博語料,然後做情感分析,就可以得到使用者對銀行服務的滿意程度。

再比如,最近火熱的明星鹿晗,可以抓取鹿晗的粉絲資訊,分析這些粉絲處於什麼年齡段,有什麼標籤,愛好,性別分佈等等。這種對人群的分析,還可以同理應用到商業品牌上,用使用者市場調研。

當然例子還有很多,那麼,首先,要有微博資料!

所以,就產生了眾多的微博爬蟲專案。後來,新浪微博也開放了微博的API介面,但是官方的東西,限制還是很多的。

準備工作

User-Agent池

爬微博,這種大專案,必要充分的偽裝是必須的,所以需要一個User-Agent池,每次,隨機選擇一個User-Agent。

充足的微博賬號

微博爬蟲,必須登入以後,才能抓取。而一直使用一個賬號,是很容易被封號的!

所以,需要多準備幾個賬號,每次隨機選擇一個賬號登入,進行抓取。(實際是隨機選擇一個cookie)。

至於買微博賬號的地方,某寶就有:

充足的IP代理

如果你想很快的進行抓取,延遲為0的話,IP很快就會被封,返回403 Forbidden。這時候就需要換代理,所以需要有一個IP代理池,這個具體可以參見我的另一個專案:構建爬蟲代理池

當然,經測試,每次訪問延遲為0.5s,併發量為32,這個引數是不會被封的!

一個伺服器

其實,如果IP代理,是免費抓取來的,通常質量並不好,通過代理訪問延遲會很大!所以,不如不用代理,加一個0.5秒的延遲,慢慢爬。

這時候,就需要一個勤勞的爬蟲,24小時不間斷的爬資料!

所以當然是需要部署在伺服器上!

爬蟲策略

登入微博

登入一直是一個很複雜的問題,不過,我們可以通過selenium來簡化這個問題。
直接通過selenium編寫瀏覽器的指令碼,自動開啟微博的手機站,點選登入,在輸入框中填充賬號,密碼,再點選登入。最後返回cookie即可。

def get_cookie_from_weibo(username, password):
    driver = webdriver.
Chrome() driver.get('https://weibo.cn') assert "微博" in driver.title login_link = driver.find_element_by_link_text('登入') ActionChains(driver).move_to_element(login_link).click().perform() login_name = WebDriverWait(driver, 10).until( EC.visibility_of_element_located((By.ID, "loginName")) ) login_password = driver.find_element_by_id("loginPassword") login_name.send_keys(username) login_password.send_keys(password) login_button = driver.find_element_by_id("loginAction") login_button.click() cookie = driver.get_cookies() driver.close() return cookie

獲取cookie以後,可以儲存到資料庫中。以後每次request請求,隨機從資料庫中選一個cookie加上,就免登入了。

抓取方案

  1. 首先選擇一個(或多個)種子使用者,作為最初抓取的物件。
  2. 對於每個抓取物件,依次抓取個人資訊,所有的微博,還有粉絲列表和關注列表。
  3. 將物件的粉絲列表和關注列表中的使用者,再加入到抓取物件中去。以此迴圈。

這樣就可以形成以種子使用者為核心,逐層向外擴散的爬蟲輻射。

理論上,只要一小批種子使用者啟動,就可以爬取全網的微博!

大V的過濾

事實上,有很多微博的資訊是沒有營養的,比如一些惡俗的營銷號,或者一些明星的微博賬號。所以,我們可以給抓取的物件,加一個比較正常的閾值,也就是一個普通使用者的情況:微博數量<5000,粉絲<5000,關注<5000.

Scrapy配置

  • MiddleWare:隨機User-Agent和隨機Cookie
  • Mongodb:網路爬蟲,資料項進場會出現不全,格式不統一的狀況,所以採用Mongodb較為合適
  • DOWNLOAD_DELAY = 0.5 下載間隔時間設定為0.5
  • CONCURRENT_REQUESTS = 32 併發下載量為32
  • LOG_FILE = weibo.log 採用日誌檔案記錄日誌

全部程式碼

執行環境為:Python3

需要依賴包括:pymogo,scrapy

歡迎Star/Fork

部署伺服器,Run!

伺服器安裝Mongodb,並開放外網訪問許可權

這樣配置以後,在本地Pycharm中,配置遠端資料庫,就實現視覺化操作與管理。

執行爬蟲

克隆程式碼到伺服器中,安裝依賴,並執行

nohup python run.py

就已經開始不停的爬取微博了!

通過命令:tail -10 weibo.log 檢視最新的日誌。

在日誌中,檢視爬取速度:

可以看到一分鐘,可以抓取848個item(資料項),這樣一天下來:

848*60*24=1221120 可以抓取120萬的微博資料!!

而且是在伺服器上執行,可以源源不斷的抓取!

同時在本地,通過Mongodb視覺化工具,連線並檢視資料庫。

通過簡單的count統計,抓取數量:

可以看到至此已經抓取1.8k使用者資訊,2.7w微博語料,8.2w分析關係資訊。

如果對此有疑問,歡迎同我交流:[email protected]