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()

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐