From 644437dae74f4f41dbf8bd2f8b5d5bbba4201b6d Mon Sep 17 00:00:00 2001 From: QMZ <1164250597@qq.com> Date: Mon, 16 Sep 2024 22:43:38 +0800 Subject: [PATCH] =?UTF-8?q?=E8=8E=B7=E5=8F=96=E5=BC=B9=E5=B9=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- getdanmu.py | 61 ++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 51 insertions(+), 10 deletions(-) diff --git a/getdanmu.py b/getdanmu.py index a0d9a03..4f5d678 100644 --- a/getdanmu.py +++ b/getdanmu.py @@ -1,13 +1,54 @@ import requests from bs4 import BeautifulSoup -headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36 Edg/128.0.0.0' } -response = requests.get("https://api.bilibili.com/x/v1/dm/list.so?oid=1512399639", headers=headers) #要爬取的网址 -response.encoding='utf-8' #编码方式 -html = response.text -soup = BeautifulSoup(html) #使用beautifulsoup库快速查找我们想要的信息 -all_txt = soup.findAll("d") #寻找到所有包含d的行 -txt=[all_txts.attrs ["p"]for all_txts in all_txt] #寻找到所有包含d的行中属性为p的值,这里边包含了弹幕的虚拟id等 -txtss=[all_txts.string for all_txts in all_txt] #寻找到所有包含d的行中的字符串数据,即弹幕内容 -txtsss=[txts.replace(' ','') for txts in txtss] #将字符串中的空格消除掉 -print(txtsss) ###打印便可看见一条条弹幕的属性和内容了。 +#从BV号获取CID +def get_cid_from_bv(bv_ids): + cids=[] + for bv_id in bv_ids: + # 视频详情 API 地址 + video_url = f'https://api.bilibili.com/x/web-interface/view?bvid={bv_id}' + + # 发送请求 + response = requests.get(video_url, headers=headers) + response.raise_for_status() + data = response.json() + # 提取 cid + if data.get('code') == 0: + cid = data.get('data', {}).get('cid') + cids.append(cid) + return cids + +def get_danmu(id): + global videosnumber + video_url = f'https://api.bilibili.com/x/v1/dm/list.so?oid={id}' + response = requests.get(video_url, headers=headers) #要爬取的网址 + response.encoding='utf-8' #编码方式 + html = response.text + soup = BeautifulSoup(html) #使用beautifulsoup库快速查找我们想要的信息 + all_txt = soup.findAll("d") #寻找到所有包含d的行 + txt=[all_txts.attrs ["p"]for all_txts in all_txt] #寻找到所有包含d的行中属性为p的值,这里边包含了弹幕的虚拟id等 + txtss=[all_txts.string for all_txts in all_txt] #寻找到所有包含d的行中的字符串数据,即弹幕内容 + txtsss=[txts.replace(' ','') for txts in txtss] #将字符串中的空格消除掉 + videosnumber = videosnumber +1 + bulletnumber = len(txtsss) + print( f"这是第{videosnumber}视频, 获取到{bulletnumber}弹幕") + time.sleep(1)#休眠防被封 + return(txtsss) + +def main(kword,mubiao): + bvs=[] + alltxt=[] + for i in range(100): + cids = [] + cids = get_cid_from_bv(bvs) + for id in cids: + if(videosnumber>=mubiao): break + txt = get_danmu(id) + alltxt=alltxt + txt + if(videosnumber>=mubiao): break + return(alltxt) + + +flag = 50 #你要爬的视频数量 +altxt=main(keword,flag) +