微博爬蟲,每日百萬級資料
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加上,就免登入了。
抓取方案
- 首先選擇一個(或多個)種子使用者,作為最初抓取的物件。
- 對於每個抓取物件,依次抓取個人資訊,所有的微博,還有粉絲列表和關注列表。
- 將物件的粉絲列表和關注列表中的使用者,再加入到抓取物件中去。以此迴圈。
這樣就可以形成以種子使用者為核心,逐層向外擴散的爬蟲輻射。
理論上,只要一小批種子使用者啟動,就可以爬取全網的微博!
大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]