如何快速爬取B站全站視頻信息
B 站我想大家都熟悉吧,其實 B 站的爬蟲網(wǎng)上一搜一大堆。不過 紙上得來終覺淺,絕知此事要躬行,我碼故我在。最終爬取到數(shù)據(jù)總量為 760萬 條。
準(zhǔn)備工作
首先打開 B 站,隨便在首頁找一個視頻點擊進(jìn)去。常規(guī)操作,打開開發(fā)者工具。這次是目標(biāo)是通過爬取 B 站提供的 api 來獲取視頻信息,不去解析網(wǎng)頁,解析網(wǎng)頁的速度太慢了而且容易被封 ip。
勾選 JS 選項,F(xiàn)5 刷新
找到了 api 的地址
復(fù)制下來,去除沒必要的內(nèi)容,得到 https://api.bilibili.com/x/web-interface/archive/stat?aid=15906633 ,用瀏覽器打開,會得到如下的 json 數(shù)據(jù)
動手寫碼
好了,到這里代碼就可以碼起來了,通過 request 不斷的迭代獲取數(shù)據(jù),為了讓爬蟲更高效,可以利用多線程。
核心代碼
- result = []
- req = requests.get(url, headers=headers, timeout=6).json()
- time.sleep(0.6) # 延遲,避免太快 ip 被封
- try:
- data = req['data']
- video = Video(
- data['aid'], # 視頻編號
- data['view'], # 播放量
- data['danmaku'], # 彈幕數(shù)
- data['reply'], # 評論數(shù)
- data['favorite'], # 收藏數(shù)
- data['coin'], # 硬幣數(shù)
- data['share'] # 分享數(shù)
- )
- with lock:
- result.append(video)
- except:
- pass
迭代爬取
- urls = ["http://api.bilibili.com/archive_stat/stat?aid={}".format(i)
- for i in range(10000)]
- with futures.ThreadPoolExecutor(32) as executor: # 多線程
- executor.map(run, urls)
不要一次性爬取全部鏈接,我是利用兩個進(jìn)程,這樣就是多進(jìn)程+多線程了。一個進(jìn)程一次大概爬取 50w 條數(shù)據(jù)。100w 條數(shù)據(jù)的話大概一個多小時吧。分多次爬取,分別將數(shù)據(jù)保存為不同的文件名,最后再匯總。
運行的效果大概是這樣的,數(shù)字是已經(jīng)已經(jīng)爬取了多少條鏈接,其實完全可以在一天或者兩天內(nèi)就把全站信息爬完的。
至于爬取后要怎么處理就看自己愛好了,我是先保存為 csv 文件,然后再匯總插入到數(shù)據(jù)庫。
匯總的 csv 文件
數(shù)據(jù)庫表
由于這些內(nèi)容是我在幾個月前爬取的,所以數(shù)據(jù)其實有些滯后了。
數(shù)據(jù)總量
查詢播放量前十的視頻
查詢回復(fù)量前十的視頻
各種花樣查詢?nèi)尉x擇?。∫曨l的鏈接為 https://www.bilibili.com/video/av + v_aid
詳細(xì)代碼請移步至 bili.py
對數(shù)據(jù)感興趣的話可以郵箱聯(lián)系我,可以打包贈與。
項目地址:chenjiandongx/bili-spider 歡迎圍觀 vfghjklp;]\78+