一個爬取用戶全部微博的爬蟲,還能斷網續爬那種

    點擊上方 月小水長 並 設爲星標,第一時間接收乾貨推送

這是 月小水長 的第  51  篇原創乾貨

熟悉這個微博超級話題爬蟲系列的都知道,我已經中止對有GUI功能集中版本的維護了,集中精力維護無GUI版本功能獨立版本的開發和維護,而且保證每一個功能都是最小可用產品且互不干擾。可是功能獨立版本一直有個歷史遺留問題:沒有將集中版本中爬取每一個用戶的全部微博的功能獨立出來,恰好今天有空,我也以爲是時候寫點東西了,因而就有了這篇文章。
web

總體的剝離過程來算比較輕鬆,由於功能集中版本每一個功能都有一個相對獨立的類,這個用戶微博爬蟲就是一個 WeiboUserScrapy 類,只不過在集中版本中爲了和其餘功能模塊進行通訊和協調,引進了 PyQT5 的信號量,以及一些公共配置變量,獨立時將這些東西去掉便可。json

代碼的地址放在文末閱讀原文,拿到代碼後,你須要作的兩件事依次是:微信

  1. 更換代碼中的 Cookie
  2. 把 user_id 改爲你想要爬取的用戶 id(是純數字)
而後運行代碼便可,不一下子你就能在項目的根目錄下的 user 文件夾看到諸如 {user_id}_{nickname}_{weibo_num}博_{followers}粉_{following}關注.csv' 格式的文件,爬取的微博都保存在這裏。
按道理,這篇文章到此就能夠收尾了。可是想了想,想到老鐵們可能有這樣的問題:某個博主有 4w 條微博,爬了 2w 條忽然斷網了或者 Cookie 過時了,難道要從新爬?
 
做爲良心博主,固然要加一個斷點續爬的功能,其實實現起來也不難,每次寫 csv 的時候同時將翻頁參數 page 保存並更新到一個配置文件中便可,核心代碼以下:
    
user_page_config = 'user_page.json'
if not os.path.exists('user_page.json'):
    page = 1
    with open(user_page_config,'w', encoding='utf-8-sig'as f:
        f.write(json.dumps({f'{self.user_id}':page}, indent=2))
else:
    with open(user_page_config,'r', encoding='utf-8-sig'as f:
        page = json.loads(f.read())[f'{self.user_id}']

random_pages = random.randint(15)
for page in range(page, page_num + 1):
    self.get_one_page(page)  # 獲取第page頁的所有微博

    with open(user_page_config,'r', encoding='utf-8-sig'as f:
        old_data = json.loads(f.read())
        old_data[f'{self.user_id}'] = page

    with open(user_page_config,'w', encoding='utf-8-sig'as f:
        f.write(json.dumps(old_data, indent=2))
這樣,就能右鍵運行代碼,開開心心作其餘事去,不用每時每刻盯着代碼。
最後就是一點碎碎唸了,斷更的這一個月中, 我正式成爲了一名社畜,一個北漂,全職在北京西二旗某互聯網廠工做 ,所以我的可用的時間相比在校少了許多,可是這個微博爬蟲呢,我會繼續維護的,公衆號也會加油更的,請你們多多支持。哦,別忘了, 閱讀原文 取代碼,跑數據。

本文分享自微信公衆號 - 月小水長(inspurer)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。dom

相關文章
相關標籤/搜索