使用Python爬取B站UP主所有视频信息

这篇具有很好参考价值的文章主要介绍了使用Python爬取B站UP主所有视频信息。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、背景

二、爬虫的实现思路

1、直接requests爬取

2、综合思路

二、代码实现

1、初始化Selenium WebDriver:

2、访问用户视频列表页面

3、翻页处理

4、获取视频详细信息

5、保存数据

6、定义一个运行函数串联所有方法功能

三、实际运行效果

1、selenium爬取视频BV号

2、BV号的json文件

3、execl文件信息


一、背景

之前B站有刷到一个视频,关于某UP主的视频播放数统计,这视频的UP主是个狠人,一个个视频统计,最后算所有视频的播放数,可以是可以,就是有点废人,突然有了想用爬虫的思路了.

首先我们知道B站的每一个视频是BV号,视频的URL是由B站域名加唯一BV号如:

https://www.bilibili.com/video/BV1Qm411S7BP/5分钟了解 蓝色监狱【『剧场版 蓝色监狱 -EPIOSODE 凪-』2024年4月19日公開】_哔哩哔哩_bilibili

那这样爬取的大致思路就是获取所有BV号,再用requests,去爬取视频,获取视频信息

二、爬虫的实现思路

1、直接requests爬取

发现行不通,这里直接在up主页面访问得不到每一个视频的BV号

(:listname 0_listname\)upname\avtitle-(:favtime favtime-)pav2-qn,python,开发语言

看样子这个JS脚本是来用于检测用户的信息,并根据这些条件可能会重定向不同的页面。此外,还有一些用于页面性能监控、日志上报和webp图片格式支持检测的脚本。

本菜鸟技术有限,打不过就绕过,直接上selenium来获取所有视频的BV号

2、综合思路

selenium用来获取BV号,爬取到具体的信息保存下来,配合多线程、requests用来爬取具体视频的信息,提高爬取效率,最后用execl保存爬取到的所有信息

二、代码实现

1、初始化Selenium WebDriver:

使用Selenium的Chrome WebDriver来模拟用户在浏览器中的操作,这样可以处理JavaScript渲染的页面

class GetInfo():
    def __init__(self, user_id):
        self.a_list = []  # 存储每一个视频的url
        self.d = webdriver.Chrome()  # 初始化Chrome浏览器驱动
        self.user_id = user_id
        self.base_url = f'https://space.bilibili.com/{user_id}/video'
        self.d.get(self.base_url)
        #这篇文章写于2022年,当时B站免登入可以搜索视频,查看视频,但是这段时间再次尝试爬取资源时,加了必须认证登入,尝试过很多次,没有获取token,只能老老实实,登入后再去爬取信息
        time.sleep(10)
        print("速度扫码登入")

实际效果,是可以直接访问,

(:listname 0_listname\)upname\avtitle-(:favtime favtime-)pav2-qn,python,开发语言

但是会弹出登入验证,甚至因为未登入无法获取视频列表,接口返回无权限,遇到这种情况,只能登入,尝试过selenium带cookie,但是没用,甚至登入后copy as curl再postman导入请求,都返回无权限,说明搜索接口再请求服务器时候,没有带上cookie

(:listname 0_listname\)upname\avtitle-(:favtime favtime-)pav2-qn,python,开发语言

2、访问用户视频列表页面

这里使用XPath定位到视频列表的ul元素,然后遍历其中的li元素,提取每个视频的URL。

(:listname 0_listname\)upname\avtitle-(:favtime favtime-)pav2-qn,python,开发语言

    def get_url(self):
        # 从当前页面获取所有视频的URL并保存到本地文件
        ul=WebDriverWait(self.d, 10).until(lambda x: x.find_element(By.XPATH, '//*[@id="submit-video-list"]/ul[1]'))
        lis = ul.find_elements(By.XPATH, "li")
        for li in lis:
            self.a_list.append(li.get_attribute("data-aid"))
        with open("url.json", "w+", encoding="utf-8") as f:
            data = json.dumps(self.a_list, ensure_ascii=False)  # 确保中文字符正常保存
            f.write(data)  # 使用write而不是writelines

3、翻页处理

首先获取总页数,然后通过点击“下一页”按钮来遍历所有页面,并在每个页面上调用get_urls方法来提取视频URL

    def next_page(self):
        # 遍历所有页面,获取所有视频的URL)
        total = WebDriverWait(self.d, 10).until(lambda x: x.find_element(By.XPATH, '//*[@id="submit-video-list"]/ul[3]/span[1]'))
        number = re.findall(r"\d+", total.text)
        total = int(number[0])

        for page in range(1, total):
            try:
                self.d.find_element(By.LINK_TEXT, '下一页').click()
                time.sleep(2)  # 等待页面加载
                self.get_url()  # 修复方法名错误
            except Exception as e:
                print(f"Failed to click next page: {e}")

        return self.a_list

4、获取视频详细信息

使用requests库来获取每个视频页面的HTML内容,然后调用parse_video_page方法来解析并提取视频的详细信息

    def get_video(self, urls, start, end):
        # 使用requests.Session()来复用TCP连接
        with requests.Session() as session:
            session.headers.update({
                "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36"
            })
            base_url = "http://www.bilibili.com/video/"

            # 预编译正则表达式以提高性能
            title_pattern = re.compile(r'<title data-vue-meta="true">([^&amp;]+)</title>')
            play_count_pattern = re.compile(r'视频播放量 (\d+)')
            danmu_count_pattern = re.compile(r'弹幕量 (\d+)')
            like_count_pattern = re.compile(r'点赞数 (\d+)')
            coin_count_pattern = re.compile(r'投硬币枚数 (\d+)')
            favorite_count_pattern = re.compile(r'收藏人数 (\d+)')
            share_count_pattern = re.compile(r'转发人数 (\d+)')

            for url in urls[int(start):int(end)]:
                full_url = base_url + url
                try:
                    response = session.get(full_url)
                    if response.status_code == 200:
                        string = response.text
                        # 使用正则表达式提取视频信息
                        title_match = title_pattern.search(string)
                        title = title_match.group(1) if title_match else "未找到匹配的内容"

                        # 提取视频播放量、弹幕量等信息
                        play_count = play_count_pattern.search(string).group(1) if play_count_pattern.search(
                            string) else '0'
                        danmu_count = danmu_count_pattern.search(string).group(1) if danmu_count_pattern.search(
                            string) else '0'
                        like_count = like_count_pattern.search(string).group(1) if like_count_pattern.search(
                            string) else '0'
                        coin_count = coin_count_pattern.search(string).group(1) if coin_count_pattern.search(
                            string) else '0'
                        favorite_count = favorite_count_pattern.search(string).group(
                            1) if favorite_count_pattern.search(string) else '0'
                        share_count = share_count_pattern.search(string).group(1) if share_count_pattern.search(
                            string) else '0'

                        # 将提取的信息添加到self.data_list中
                        video_info = {
                            "url":full_url,
                            "title": title,
                            "play_count": play_count,
                            "danmu_count": danmu_count,
                            "like_count": like_count,
                            "coin_count": coin_count,
                            "favorite_count": favorite_count,
                            "share_count": share_count
                        }
                        self.data_list.append(video_info)
                    else:
                        print(f"Failed {full_url}: HTTP {response.status_code}")
                except Exception as e:
                    print(f"Failed to get video info for url {full_url}: {e}")

5、保存数据

导入openpyxl库,用于将数据保存到Excel

    def save_to_excel(self, filename):
        wb = Workbook()
        ws = wb.active
        ws.append(['url','标题', '播放量', '弹幕数', '点赞数', '投币数', '收藏数', '分享数'])  # 添加表头
        for video_info in self.data_list:
            ws.append([
                video_info['url'],
                video_info['title'],
                video_info['play_count'],
                video_info['danmu_count'],
                video_info['like_count'],
                video_info['coin_count'],
                video_info['favorite_count'],
                video_info['share_count']
            ])
            wb.save(filename)

6、定义一个运行函数串联所有方法功能

    def run(self):
         # 运行整个流程
        self.get_url()  # 获取当前页面的视频URL
        self.next_page()  # 遍历所有页面获取视频URL

        with open("url.json", "r", encoding="utf-8") as f:
            data = json.load(f)

            # 使用多线程提高数据获取效率
        threads = []
        part = int(len(data) / 3)
        for i in range(3):
            start = i * part
            end = (i + 1) * part if i != 2 else len(data)
            thread = threading.Thread(target=self.get_video, args=(data, start, end))
            threads.append(thread)
            thread.start()

        for thread in threads:
            thread.join()  # 等待所有线程完成

            # 所有线程完成后,保存数据到Excel
        self.save_to_excel('final_video_info1.xlsx')

三、实际运行效果

if __name__ == '__main__':
    obj = GetInfo()
    obj.run()  # 运行整个流程

1、selenium爬取视频BV号

自动翻页至最后一页

(:listname 0_listname\)upname\avtitle-(:favtime favtime-)pav2-qn,python,开发语言

2、BV号的json文件

json文件列表长度和视频号一致

(:listname 0_listname\)upname\avtitle-(:favtime favtime-)pav2-qn,python,开发语言

3、execl文件信息

有了这些文件,想统计具体的数据,就很轻松

(:listname 0_listname\)upname\avtitle-(:favtime favtime-)pav2-qn,python,开发语言文章来源地址https://www.toymoban.com/news/detail-844546.html

到了这里,关于使用Python爬取B站UP主所有视频信息的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 采集B站up主视频信息

    一、网页信息(示例网址:https://space.bilibili.com/3493110839511225/video) 二、查看响应数据 三、查看数据包内容 四、相关代码(代码内容未进行翻页爬取) 五、爬取内容

    2024年01月21日
    浏览(44)
  • 使用python爬取淘宝商品信息

    要使用Python爬取淘宝商品信息,您可以按照以下步骤: 安装必要的库 您需要安装Python的requests库和BeautifulSoup库。 发送请求并解析HTML页面 使用requests库发送HTTP请求,然后使用BeautifulSoup库解析HTML页面。在这里,我们将以淘宝的\\\"蚊帐\\\"为例。 提取所需的信息 通过分析HTML页面,

    2024年02月15日
    浏览(89)
  • 使用python爬取某专科学校官方信息

    导入模块和代理设置:脚本开始时导入了必要的模块,如 csv, os, re, time, urllib.parse 中的 urljoin,bs4 中的 BeautifulSoup 和 selenium 中的 webdriver。同时为 HTTP 和 HTTPS 设置了代理。 CSV文件初始化:打开一个名为 ‘fzmjtc.csv’ 的CSV文件,用于存储提取的数据。文件以 UTF-8 编码写入,通

    2024年01月18日
    浏览(38)
  • 爬取b站任意视频下的所有评论【附完整代码】

    今天花了一上午探究如何用selenium获取b站视频下面的评论,一开始只是想用一个视频来练练手,后面逐渐改成了所有视频都适用的完整代码。 话不多说,直接上源码: 因为我是用的jupyter,所以整个代码包括两个部分。下面这段代码用于完成获取自动登录b站所需的cookie。 下

    2024年02月04日
    浏览(40)
  • 使用python爬虫爬取bilibili视频

    可以使用 Python 爬虫框架如 Scrapy 来爬取 Bilibili 的视频。首先需要了解 Bilibili 网站的构造,包括数据是如何呈现的,然后构建请求来获取所需的数据。同时需要考虑反爬虫措施,可能需要使用代理 IP 和 User-Agent 等方法来绕过反爬虫机制。 这里提供一个简单的爬取视频标题的

    2024年02月08日
    浏览(39)
  • 快乐学Python,使用爬虫爬取电视剧信息,构建评分数据集

    在前面几篇文章中,我们了解了Python爬虫技术的三个基础环节:下载网页、提取数据以及保存数据。 这一篇文章,我们通过实际操作来将三个环节串联起来,以国产电视剧为例,构建我们的电视剧评分数据集。 收集目前国产电视剧的相关数据,需要构建国产电视剧和评分的

    2024年01月21日
    浏览(52)
  • 【Python爬虫开发实战②】使用urllib以及jsonpath爬取即将上映电影信息

    🚀 个人主页 :为梦而生~ 关注我一起学习吧! 💡 专栏 :python网络爬虫从基础到实战 欢迎订阅!后面的内容会越来越有意思~ 💡 往期推荐 : ⭐️首先,我们前面讲了多篇基础内容: 【Python爬虫开发基础④】爬虫原理 【Python爬虫开发基础⑤】HTML概述与基本标签详解 【P

    2024年02月12日
    浏览(48)
  • Python爬虫使用selenium爬取qq群的成员信息(全自动实现自动登陆)(1)

    browser.find_element_by_xpath(‘.//ul[@id=“headerNav”]/li[4]’).click() 8.点击群管理之后,进入群管理界面,我们需要的是成员管理 WebDriverWait(browser, 1000).until( EC.presence_of_all_elements_located( (By.CLASS_NAME, ‘color-tit’) ) ) browser.find_element_by_class_name(‘color-tit’).click() 9.点击成员管理之后会重新

    2024年04月28日
    浏览(47)
  • 在B站爬取坤坤的视频,并获取视频基本信息

    在B站有许多坤坤的视频,作为一名ikun,让我们写个爬虫研究一下视频的视频的名字、链接、观看次数、弹幕、发布时间以及作者。我们用selenium来实现这个爬虫,由于要获取的数据比较多,我们写几个函数来实现这个爬虫。 先倒入需要用到的库,包括selenium, time ,BeautifulSou

    2024年02月07日
    浏览(32)
  • ins视频批量下载,instagram批量爬取视频信息【爬虫实战课1】

    Instagram 是目前最热门的社交媒体平台之一,拥有大量优质的视频内容。但是要逐一下载这些视频往往非常耗时。在这篇文章中,我们将介绍如何使用 Python 编写一个脚本,来实现 Instagram 视频的批量下载和信息爬取。 我们使用selenium获取目标用户的 HTML 源代码,并将其保存在本地

    2024年04月23日
    浏览(57)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包