寫在前面
今天和朋友嘮嗑,說着說着說到了爬取B站彈幕和三連的事情。於是就想着用python來試試爬取B站的彈幕和三連了
代碼
不廢話了,先上代碼:
# 爬取B站彈幕
import requests
import time
import json
from lxml import etree
# 放入要爬的url
# 彈幕api
url_b = "https://api.bilibili.com/x/v1/dm/list.so?oid=186339235"
# 三連api
url_state = "https://api.bilibili.com/x/web-interface/archive/stat?aid=925611776"
# 設置header
header = {"user-agent": "Mozilla/5.0 (Linux; Android 8.0.0; Pixel 2 XL Build/OPD1.170816.004) "
+ "AppleWebKit/537.36 (KHTML, like Gecko)"
+ " Chrome/80.0.3987.116 Mobile Safari/537.36"}
# 獲取信息
try:
# 延時操作,防止爬的太快
time.sleep(0.5)
response = requests.get(url_b, headers=header)
except Exception as e:
print(e)
else:
if response.status_code == 200:
# 下載xml文件
with open("bilibili.xml", 'wb') as f:
f.write(response.content)
# 解析網頁
time.sleep(1)
# 文件路徑,html解析器
html = etree.parse('bilibili.xml', etree.HTMLParser())
# xpath解析,獲取當前所有的d標簽
results = html.xpath('//d//text()')
i = 0
sum_self = 0
for result in results:
sum_self = sum_self + 1
if result.find("飛"):
i = i+1
print("總數為: %d 包含飛字的彈幕為:%d" % (sum_self, i))
data_get = requests.get(url_state, headers=header)
data_san = json.loads(data_get.content.decode())
print("硬幣為:%d" % data_san['data']['coin'])
print("轉發為: %d" % data_san['data']['share'])
print("點贊為:%d" % data_san['data']['like'])
這里關於找api的操作,可以自行用火狐或者谷歌的開發者模式去尋找。
在這里由於B站的彈幕是用xml存的,且最大彈幕量是1000,即只爬了一千條彈幕。
思路分析
首先找一個B站視頻,然后尋找彈幕和三連的API:
首先發現了這個,閱讀英文后發現明顯就是三連的英文。
就是簡單的json格式,關於json格式的處理已經練習過嘞
然后找彈幕,發現是xml文件:
觀察結構可以發現彈幕都是在d標簽里的。上次爬取論文的時候也用了類似的操作,我們直接讀取d標簽的內容即可。
這里我們就用xpath來很方便的找到。關於xpath的語法等有空再開個博客寫一寫。
結果
可以看到爬取B站彈幕和三連非常方便,也體會到了python在某些領域的優勢。