Skip to main content

为在Bilibili上的影视资源自动获取imdb评分

Project description

logo

bilibili-rater

PyPI - License PyPI - Version PyPI - Python Version Test GitHub Tag

⚠️使用注意: 请勿使用本项目用于违反法律或违反社区规则的行为, 例如刷屏、辱骂、广告推广等。

本项目基于bilibili-api开发, ⚠️⚠️务必注意B站官方的反爬虫系统, 设置合理的请求间隙。

本项目使用GPLv3许可证, 仅供个人学习使用, 请勿用于商业用途。

仓库地址: https://github.com/NearlyHeadlessJack/bilibili-rater
Python>=3.10
安装最新稳定版

pip install bilibili-rater

// 使用阿里云镜像加速
pip install -i https://mirrors.aliyun.com/pypi/simple bilibili-rater

安装开发版本
PyPI - Version

pip install --index-url https://test.pypi.org/simple/ bilibili-rater==0.x.x.dev13

简介

bilibili-rater 适用于在B站搬运的美剧、动画等视频下, 按预置规则获取对应imdb信息, 并自动评论标题评分等信息。

设置自动化后, 可24h监控指定up主的最新视频并提供评分信息, 供其他观众参考。

示例

Feature

  • 自定义“季-集”信息的爬取方式, 可通过视频简介的固定模式来获取。
  • 可以获取当期节目在整季中的评分排名。
  • 可以获取本季平均分和评分中位数。
  • 可以获取本集的首播时间。
  • 基于bilibili-api开发, 对B站的访问高可靠性。
  • 提供多种imdb数据获取方式, 支持使用imdbinfo直接从imdb网站进行抓取, 也支持 使用omdbapi从第三方数据库获取imdb评分信息。

适合用户

  • 影视搬运类up主本人。
  • 热心观众, 但需要与up主沟通好“季-集”信息获取模式。

FAQ

  • 本项目可以直接识别某个视频是哪个节目, 以及具体某一季、某一集吗?
    • 不可以, 是哪个节目需要在脚本中设定resource_id。“季-集”信息需要视频上传者提供获取模式, 本项目只提供从视频简介中抓取对应“季-集”数据的接口 handler及其抽象类class SeasonEpisodeHandler(ABC)。 用户可以设置自定义的模式匹配方法。
  • imdb信息是自动获取的吗?
    • 是的, 首先从b站视频获取到“季-集”信息后, 会使用脚本中提供的抓取器(fetcher), 自动获取imdb信息。
  • 可以使用豆瓣评分吗?
    • 不可以, 因为豆瓣没有单集评分功能。
  • omdbapi和直接获取imdb的信息有什么区别?
    • omdbapi胜在稳定,不受制于imdb可能出现的反爬虫策略更新。但是omdbapi方式无法获取排名、平均分和中位数信息,且评分数据并不是最新的。

使用教程与示例

1. 确定你要抓取的up主与节目信息

up主通过B站数字uid确定, 节目信息通过imdb编号确定。
例如要抓取up主龙三条, uid5024187
我要抓取的节目为《恶搞之家》, imdb编号为tt0182576

imdb影视节目的编码一般为tt开头。可通过imdb网站对应页面的URL看到。

[!NOTE] 连载节目请获取根节目的imdb代码, 不要使用季或集的imdb代码, 他们是独立的。

连载节目的根imdb代码可通过imdb网站搜索节目名, 进入根节目的页面, 通过URL看到。例如《恶搞之家》https://www.imdb.com/title/tt0182576/ 的根imdb编号为tt0182576

2. 获取用于发表评论账号的credentials

获取用于评论的账号credentials, 具体方法请直接参考bilibili-api使用文档

这里一共需要五个值:sessdata, bili_jct, buvid3, buvid4, dedeuserid

3. 创建imdb信息获取器fetcher

程序运行时需要fetcher才能获取imdb信息, 当前版本内置两个fetcher, 分别为DirectFetcher, OmdbFetcher

fetcher 原理 适用情形
DirectFetcher 直接构造请求从imdb官网获取最新信息 适用于大多数情况
OmdbFetcher 通过第三方数据库omdb提供的api获取信息 imdb无法进行爬虫时

[!IMPORTANT] OmdbFetcher需要提前申请api key。

  • omdb网站提供了免费、快速的api, 可以获得imdb的数据。
  • 输入邮箱并提交后, 邮件会收到api key。请点击邮件中的激活链接, 否则api key无法使用

4. 创建Python脚本

创建一个Python文件, 并添加以下内容:

import bilibili_rater
from bilibili_api import Credential
import asyncio

credential = Credential(
    sessdata="",
    bili_jct="",
    buvid3="",
    buvid4="",
    dedeuserid="",
)


fetcher_omdb = bilibili_rater.OmdbFetcher(api_key="xxxx",
                                          is_show_title=True)
fetcher_direct = bilibili_rater.DirectFetcher(is_show_ranking=True,
                                              is_show_title=True,
                                              is_show_release_date=True,
                                              is_show_average=True,
                                              is_show_median=True)


job = bilibili_rater.BilibiliRater(
    uploader_uid=591331248,  # up主 uid
    credential=credential,  
    handler=bilibili_rater.OnlyNumberHandler.handle,  # “季-集”信息的解包方式
    resource_id="tt0397306",  # 根节目的imdb编号
    resource_cn_name="美国老爹",  #  最终显示在评论中的节目中文名
    imdb_fetchers=[fetcher_direct, fetcher_omdb],  # 使用的imdb信息获取器
)

asyncio.run(job.run())

其中, handler的设置详情请见自定义handler

imdb_fetchers接收一个fetcher列表。程序会依次使用列表中的fetcher来获取imdb信息。
若前一个fetcher获取失败, 程序会自动尝试使用下一个fetcher
因此建议将OmdbFetcher放在最后, 作为最后的获取方式运行。

5. 运行脚本或设置自动化

可以直接运行脚本

python script.py

如果一切正常, 会提示评论发送成功。

但是这样, 脚本只会运行一次。

自动化

使用cron

    1. 创建一个运行脚本run-bilibili-rater-1.sh
#!/bin/bash
python /path/to/script.py
    1. 添加定时任务
crontab -e

// 在新页面里面添加一行
*/10 0 * * * /path/to/run-bilibili-rater-1.sh

这样脚本会每10分钟运行一次。
关于cron语法, 请参见教程, 或直接使用生成器

多任务运行

有些时候我们并不会只关注一个up主的某个节目, 而是关注多个up主或者多个节目。这样需要分别编写Python脚本与对应的运行脚本。
对于同一个up主的不同节目, 请不要使用相同的handler。否则会被解析为同一个节目。
例如《辛普森一家》使用简介第一行用"S03E05"形式来标注“季-集”信息, 《恶搞之家》使用简介第一行用"10-4"来标注“季-集”信息。

使用不同的handler可以区分两者, 不至于误将一个节目解析为另一个节目。

此外, 在使用cron来调度脚本时, ⚠️请勿设置多个脚本在同一时刻运行, 会极大增加被系统检测的风险, 可能导致账号封禁。

可以这样设置:

1,31 * * * * /path/to/run-bilibili-rater-1.sh
16,46 * * * * /path/to/run-bilibili-rater-2.sh

这样两个脚本岔开运行, 减少了被封禁的风险。

自定义handler

bilibili-rater通过handler来抓取视频对应的“季-集”信息。

handler本质是一个字符串解析器, 将字符串中包含的“季-集”信息解析出来。

handler属于抽象类SeasonEpisodeHandler, 其原型为:

from abc import ABC
class SeasonEpisodeHandler(ABC):
    @staticmethod
    def handle(desc: str) -> tuple[int, int]:
        pass

其中
desc为经过处理视频简介, 只包含简介第一行的信息。 handler返回一个元组, 元组的第一个元素为“季”信息, 第二个元素为“集”信息。

bilibili-rater已实现三种handler, 可以直接使用:

handler 说明 适用情形
OnlyNumberHandler.handler 简介第一行, 只使用数字来标注“季-集”信息 简介第一行为"3-2","10-5","6-14"
NormalLetterHandler.handler 简介第一行, 使用"S"和"E"字母来标注 "S08E12","S1E09","S13E15"
DotHandler.handler 简介第一行, 使用"."来分割"季-集"信息 "1.2","8.5","14.3"

自己实现的handler

注意, 在解析失败情况下也需要返回元组(0,0), 程序会略过本次更新, 否则会崩溃。

import bilibili_rater
from bilibili_api import Credential
import asyncio

# 继承SeasonEpisodeHandler
class MyCustomHandler(bilibili_rater.SeasonEpisodeHandler): 
    # 实现自定义的handle方法
    @staticmethod
    def handle(desc: str) -> tuple[int, int]:
      # 处理逻辑
      #
      #
      if True:
          # 成功返回结果 季号, 集号
          return 3,6
      else:
          # 失败返回0,0
          return 0,0

        
credential = Credential(
    sessdata="",
    bili_jct="",
    buvid3="",
    buvid4="",
    dedeuserid="",
)

fetcher_omdb = bilibili_rater.OmdbFetcher(api_key="xxxx",
                                          is_show_title=True)
fetcher_direct = bilibili_rater.DirectFetcher(is_show_ranking=True,
                                              is_show_title=True,
                                              is_show_release_date=True,
                                              is_show_average=True,
                                              is_show_median=True)

job = bilibili_rater.BilibiliRater(
    uploader_uid=591331248,  # up主uid
    credential=credential,  
    handler=MyCustomHandler.handle,  # “季-集”信息的解包方式
    resource_id="tt0397306",  # 根节目的imdb编号
    resource_cn_name="美国老爹",  #  最终显示在评论中的节目中文名
    imdb_fetchers=[fetcher_direct, fetcher_omdb],  
)

asyncio.run(job.run())

形参说明

  • desc: str, 类型为字符串, 仅包含简介第一行内容。

开发文档(完善中)

BilibiliRater

BilibiliRater类是主类, 运行程序时, 需要实例化该类。BilibiliRater.run()则开始一次运行。先获取视频信息, 如果视频BV号在缓存里则跳过本次搜刮。否则会获取简介中的“季-集”信息,然后使用获取器得到imdb信息并生成评论文本。然后再发送评论。

构建BilibiliRater需要以下参数

  • uploader_uid: int
    • up主uid
  • credential: bilibili_api.Credential
    • bilibili_api中的Credential类,用于存储Cookie
  • handler: SeasonEpisodeHandler.handle
    • 简介信息解析器
  • resource_id: str
    • 根节目的imdb编号
  • resource_cn_name: str
    • 节目的中文名
  • imdb_fetchers: list[ImdbFetcher]
    • 列表,里面是imdb信息获取器

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

bilibili_rater-0.2.0.tar.gz (179.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

bilibili_rater-0.2.0-py3-none-any.whl (43.4 kB view details)

Uploaded Python 3

File details

Details for the file bilibili_rater-0.2.0.tar.gz.

File metadata

  • Download URL: bilibili_rater-0.2.0.tar.gz
  • Upload date:
  • Size: 179.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for bilibili_rater-0.2.0.tar.gz
Algorithm Hash digest
SHA256 b89c63e25bb6124c138588f8848832812b09a17a65a2879fc6e3ba98793ee952
MD5 bb1c3a00dd2c4dbec1a96dfee719f555
BLAKE2b-256 bfaab23e4a7beb38b9825412dc7761efebcd74dd2b1706f543bbb49172e16856

See more details on using hashes here.

Provenance

The following attestation bundles were made for bilibili_rater-0.2.0.tar.gz:

Publisher: Publish.yml on NearlyHeadlessJack/bilibili-rater

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file bilibili_rater-0.2.0-py3-none-any.whl.

File metadata

  • Download URL: bilibili_rater-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 43.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for bilibili_rater-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 148decc9b95d1b51ad6811d0f2d075f018aec1a54c27d0667a9503399a41071f
MD5 27035c8dbaa937e97642534f6283c440
BLAKE2b-256 0032a17088a981cfadb202e1501d13e38ed3cac274910efd7f4e96added60937

See more details on using hashes here.

Provenance

The following attestation bundles were made for bilibili_rater-0.2.0-py3-none-any.whl:

Publisher: Publish.yml on NearlyHeadlessJack/bilibili-rater

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page