哔哩哔哩弹幕爬虫脚本
·
import os
import requests
from bs4 import BeautifulSoup
from pyquery import PyQuery
import re
import shutil
headers = {
"Cookie": "CURRENT_FNVAL=16; stardustvideo=1; _uuid=3C5905C8-410F-D211-2688-E6DB4BC3D97666261infoc; "
"LIVE_BUVID=AUTO7615735489629889; buvid3=C644BBC1-927F-4A44-B550-22D5C89A4E76155809infoc; "
"msource=ad_bw_cpt80003; deviceFingerprint=d87f1972fefedc181aeb4fef8b35cb71; sid=60f495kc;"
" rpdid=|(m)m)u|lJR0J'ul~JlRm|Y|; stardustpgcv=0606",
"Host": "search.bilibili.com",
"Referer": "https://search.bilibili.com/",
"Sec-Fetch-Mode": "no-cors",
"Sec-Fetch-Site": "same-site",
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)"
" Chrome/78.0.3904.70 Safari/537.36"}
api_headers = {
"Cookie": "CURRENT_FNVAL=16; stardustvideo=1; _uuid=3C5905C8-410F-D211-2688-E6DB4BC3D97666261infoc;"
" LIVE_BUVID=AUTO7615735489629889; buvid3=C644BBC1-927F-4A44-B550-22D5C89A4E76155809infoc;"
" msource=ad_bw_cpt80003; deviceFingerprint=d87f1972fefedc181aeb4fef8b35cb71; sid=60f495kc;"
" rpdid=|(m)m)u|lJR0J'ul~JlRm|Y|; stardustpgcv=0606",
"Host": "api.bilibili.com",
"Origin": "https://www.bilibili.com",
"Sec-Fetch-Mode": "no-cors",
"Sec-Fetch-Site": "same-site",
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/78.0.3904.70 Safari/537.36"}
def analysis():
# 1.设置要爬取的视频名称
keys = ["猎场", "大宋提刑官"]
# 2.设置存储路径
save_path = "./bilibili"
# 3.设置弹幕数量
barrage_sum = 1000
# 4.获取视频的ID
for key in keys:
path = "https://search.bilibili.com/all?keyword={}".format(key)
resp = requests.get(path, headers=headers)
resp.encoding = "utf-8"
doc = PyQuery(resp.text)
resp.close()
play_url = doc(".pgc-list .pgc-item:first-child>div>a").attr("href")
print(play_url)
print("https:" + play_url)
video_id = re.findall("\d{5}", play_url)[0]
# 5.获取视频弹幕URL
# https://api.bilibili.com/pgc/web/season/section?season_id=20228&season_type=5
video_detail_url = "https://api.bilibili.com/pgc/web/season/section?season_id=" + video_id + "&season_type=5"
resp_detail = requests.get(video_detail_url, headers=api_headers)
resp_detail.encoding = "utf-8"
detail_json = resp_detail.json()
resp_detail.close()
episodes = detail_json["result"]["main_section"]["episodes"]
# 6.删除之前历史文件
save_text_url = save_path + os.sep + key + ".txt"
if os.path.exists(save_text_url):
os.remove(save_text_url)
# 7.判断弹幕的数量
current_sum = 0
for index, episode in enumerate(episodes):
if current_sum == barrage_sum:
break
print("第{}集".format(str(index + 1)))
# 8.获取弹幕的cid
cid = episode["cid"]
barrage_url = 'http://comment.bilibili.com/' + str(cid) + ".xml"
res_barrage = requests.get(barrage_url)
html = res_barrage.content
res_barrage.close()
html_doc = str(html, 'utf-8') # 修改成utf-8
soup = BeautifulSoup(html_doc, "lxml") # 解析
results = soup.find_all('d')
contents = [x.text for x in results]
for barrage_url in set(contents):
if current_sum == barrage_sum:
break
barrage_url = barrage_url + "\n"
# 9.下载保存弹幕
barrage_download(save_path, save_text_url, barrage_url)
current_sum += 1
def barrage_download(save_path, save_text_url, barrage_url):
if not os.path.exists(save_path):
os.makedirs(save_path)
with open(save_text_url, mode="a", encoding="utf-8")as f:
f.write(barrage_url)
if __name__ == '__main__':
analysis()
更多推荐
所有评论(0)