# Crawler_Merge **Repository Path**: sunmozhu/crawler_merge ## Basic Information - **Project Name**: Crawler_Merge - **Description**: B站爬虫 - **Primary Language**: Python - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2024-11-18 - **Last Updated**: 2024-11-18 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Crawler_Merge # 介绍 B站爬虫项目sadas 该项目基于https://github.com/NanmiCoder/MediaCrawler 改写。原项目只能爬取B站视频和评论信息。一旦开启,在完成指定任务前无法停止;期间如果程序(意外)中断,就必须从头开始重新爬取。 在原项目的基础上,该项目能够额外爬取B站创作者的信息,以及能够下载视频及其相应的音频文件。 为了解决意外中断得到问题,本项目引入”检查点“文件用于保存爬取进度,从而在(意外)关闭后能够及时恢复。 同时,为了能够兼容Web开发,本项目还增加了自定义参数、定时爬取、动态加载参数等功能,在后文将依次介绍。 # 安装及使用 #### 进入项目根目录 ```shell cd crawler_merge ``` #### 创建虚拟环境 ```shell # 注意python 版本需要 3.10 - 3.11 python -m venv venv # 或者使用conda创建虚拟环境(建议) conda create --name my_env python=3.10 ``` #### 激活虚拟环境 ```shell # macos & linux 激活虚拟环境 source venv/bin/activate # windows 激活虚拟环境 venv\Scripts\activate # conda激活虚拟环境(建议) conda activate my_env ``` #### 安装依赖库 ```shell pip3 install -r requirements.txt ``` #### 安装 playwright浏览器驱动 ```shell playwright install ``` #### 运行爬虫程序 ```shell # 在config/base_config.py中设置爬虫相关的参数后,运行以下命令 python main.py ``` #### 数据保存 - 支持保存到关系型数据库(Mysql) - 支持保存到json中(data/目录下) #### 数据库配置 1. 在config/db_config.py中添加自己的数据库配置 2. 创建数据库 3. 将schema/table.sql的SQL语句导入数据库并执行 # 功能介绍 ## 自定义爬虫 位于config/base_config.py 文件 其余新的参数存放于config.json 文件中。可用于集成web开发,动态修改爬虫的参数。 ### 参数设置 可以根据自己的需要设置爬虫的一些参数: ``` KEYWORDS:搜索的关键词。支持多关键词,各关键词之间用半角逗号“,”分隔开。 ``` ``` LOGIN_TYPE:登录类型。支持二维码、手机号、cookie。建议使用cookie即可,其他需要自己摸索hhh ``` ```: COOKIES:用于登录的cookies。自行从浏览器获取。为空则代表游客模式登录。 ``` ``` SAVE_DATA_OPTION:数据保存类型选项配置。支持db、json两种类型。 ``` ``` CRAWLER_MAX_NOTES_COUNT:单次爬取视频数量设置。建议:20及其倍数,少量多次防止被封禁。 ``` ``` MAX_CONCURRENCY_NUM:并发爬虫的数量。注意根据机器性能酌情设置。 ``` ```: CRAWLER_INTERVAL:爬虫间隔(单位:秒) 在爬虫间隔会重新读取爬虫参数config.json ``` ### 动态设置参数 使用类与类方法动态读取爬虫参数; 在爬虫开始前与爬虫间隔读取爬虫参数,不需要重新启动; ---2024/06/17 ### 功能设置 也可以根据自己的需要启用/禁用部分功能: ``` ENABLE_GET_COMMENTS:是否开启爬取评论功能。 ``` ``` ENABLE_DOWNLOAD_VIDEO:是否开启爬取视频 & 音频功能。 ``` 上述没有提及的参数最好不要修改,除非你完全了解整个项目。 ## 并发爬取 多使用并发是该项目的特色。 在 ## 包装客户端请求 B站API文档(非官方,仅用于学习使用): [BAC Document (socialsisteryi.github.io)](https://socialsisteryi.github.io/bilibili-API-collect/) 该项目实现了一个 发送HTTP请求获取网页数据,然后解析这些数据提取有用的信息 ## B站视频详细信息爬取 ![图片描述](./image/视频信息.png) 根据输入的关键词,包装对客户端的get请求。获得 搜索支持多种排序方法 ## B站UP主(视频发布者)信息爬取 ![图片描述](./image/UP主信息.png) 在视频详细信息的爬取之后,紧跟着的是对UP主信息的爬取。 ## B站视频/音频爬取与下载 本项目还支持对音视频的下载。根据视频的aid包装url,可以从B站客户端爬取视频和音频的下载url。通过该url向客户端发送请求,接收报文中的content即为视频/音频的二进制形式,将该二进制码保存为mp3,mp4格式即可完成下载。由于该项目对视频和音频分别处理,因此这里没有给出二者的合并。 根据搜索关键词的不同,每个关键词会单独创建一个目录用于存储。 eg: ![图片描述](./image/音频存储.png) ## B站评论爬取 ![图片描述](./image/评论信息.png) 最后则是对评论的爬取。 支持子评论爬取。 对于数据库中的每一条评论,都包含comment_root和comment_parent两个字段,分别表示该评论的根评论(所在楼层)和父评论(直接回复对象)。 ## 定时爬取 创建异步执行的main函数,并且在每个main函数执行完成之后,进程停止“爬虫间隔”的时间。 在main函数添加了一个 这样设计,每隔一段时间(爬虫间隔)会创建一个新的 ## 数据库去重 # 项目结构介绍 ## 项目目录结构 ``` Crawler_Merge ├── base │ └── base_crawler.py # 项目的抽象类(无变化) ├── BiliVideos # 从B站下载的视频及其音频(一个关键词一个目录) ├── browser_data # 用户的浏览器数据目录(运行后产生) ├── config │ ├── base_config.py # 基础配置,包含了爬虫相关的部分输入参数 │ └── db_config.py # 数据库配置 ├── data # 数据保存目录(只针对json格式存储) ├── libs │ └── stealth.min.js # 去除浏览器自动化特征的JS(无变化) ├── media_platform │ └── bilibili # B站crawler的具体实现 │ ├── client.py # 用于包装和向B站客户端发送请求 │ ├── core.py # 爬虫的核心所在。并行创建爬虫任务并执行 │ ├── exception.py # 处理爬虫异常情况(无变化) │ ├── field.py # 包含搜索视频和显示评论的排序方式的枚举类 │ ├── help.py # B站请求参数签名(无变化) │ └── login.py # B站登录实现(无变化) ├── schema │ └── tables.sql # 存储的SQL语句,包含了视频信息,UP主信息、评论信息 ├── store │ └── bilibili # B站存储模型 │ ├── __init__.py # 获取需要存储的数据条目 │ ├── bilibili_store_db_types.py # B站到数据库的存储模型 │ └── bilibili_store_impl.py # B站存储的实现 ├── tools # 爬虫过程中用到的工具(无变化) │ ├── utils.py # 暴露给外部的工具函数 │ ├── crawler_util.py # 爬虫相关的工具函数 │ ├── slider_util.py # 滑块相关的工具函数 │ ├── time_util.py # 时间相关的工具函数 │ └── easing.py # 模拟滑动轨迹相关的函数 ├── checkpoint.json # 用于保存爬取进度的检查点文件 ├── config.json # 用于保存(Web可修改的)爬虫参数 ├── db.py # 从store目录加载模型,用于初始化和关闭数据库 ├── main.py # 程序入口,实现了定时爬取 ├── README.md # 您现在打开的文件 ├── recv_sms_notification.py # 短信转发器的HTTP SERVER接口 ├── requirement.txt # 项目的依赖库 └── var.py # 上下文变量定义 ``` ## 调用图Call Graph ![图片描述](./image/调用图.jpg)