# 怎么用Python爬取B站动漫番剧更新信息 ## 目录 1. [前言](#前言) 2. [技术准备](#技术准备) 3. [分析B站网页结构](#分析b站网页结构) 4. [爬虫实现步骤](#爬虫实现步骤) - [4.1 获取番剧列表页](#41-获取番剧列表页) - [4.2 解析番剧数据](#42-解析番剧数据) - [4.3 处理反爬机制](#43-处理反爬机制) - [4.4 数据存储](#44-数据存储) 5. [完整代码示例](#完整代码示例) 6. [进阶优化建议](#进阶优化建议) 7. [注意事项](#注意事项) 8. [总结](#总结) ## 前言 B站(哔哩哔哩)作为国内最大的二次元文化社区,拥有丰富的动漫番剧资源。对于动漫爱好者或数据分析师来说,获取番剧更新信息具有重要价值。本文将详细介绍如何使用Python爬取B站动漫番剧更新信息,包括技术选型、实现步骤和注意事项。 ## 技术准备 在开始之前,需要准备以下工具和环境: - Python 3.7+ - 第三方库: - `requests`:网络请求 - `BeautifulSoup`/`lxml`:HTML解析 - `selenium`:动态页面渲染(可选) - `pandas`:数据处理(可选) - 开发工具: - Chrome浏览器 + Developer Tools - Jupyter Notebook/PyCharm 安装所需库: ```bash pip install requests beautifulsoup4 lxml selenium pandas
B站番剧索引页:https://www.bilibili.com/anime/index/
通过Chrome开发者工具(F12)分析: - 静态页面:直接包含部分番剧信息 - 动态加载:通过XHR请求获取更多数据 - 关键接口:https://api.bilibili.com/pgc/web/rank/list
{ "code": 0, "message": "success", "result": { "list": [ { "title": "鬼灭之刃", "season_id": 12345, "pub_index": "全26话", "order": "1", "score": "9.8", "cover": "https://xxx.jpg" } ] } }
import requests from bs4 import BeautifulSoup url = "https://www.bilibili.com/anime/index/" headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36..." } response = requests.get(url, headers=headers) soup = BeautifulSoup(response.text, 'lxml')
api_url = "https://api.bilibili.com/pgc/web/rank/list" params = { "season_type": 1, # 1-番剧,2-电影,3-纪录片等 "day": 3 # 3-三日排行 } response = requests.get(api_url, headers=headers, params=params) data = response.json()
解析HTML示例:
anime_list = [] for item in soup.select('.bangumi-item'): title = item.select_one('.bangumi-title').text update = item.select_one('.update-info').text anime_list.append({ 'title': title, 'update': update })
解析API数据示例:
for item in data['result']['list']: print(f"标题:{item['title']}") print(f"最新集数:{item['new_ep']['index_show']}") print(f"评分:{item['score']}")
# 1. 使用随机User-Agent from fake_useragent import UserAgent headers = {'User-Agent': UserAgent().random} # 2. 使用代理IP proxies = { 'http': 'http://127.0.0.1:1080', 'https': 'https://127.0.0.1:1080' } # 3. 添加延迟 import time time.sleep(random.uniform(1, 3)) # 4. 处理动态参数(需要逆向分析)
import pandas as pd df = pd.DataFrame(anime_list) df.to_csv('bilibili_anime.csv', index=False)
import pymysql conn = pymysql.connect( host='localhost', user='root', password='123456', database='bilibili' ) cursor = conn.cursor() sql = """ INSERT INTO anime(title, update_time, score) VALUES (%s, %s, %s) """ for item in anime_list: cursor.execute(sql, (item['title'], item['update'], item['score'])) conn.commit()
import requests import pandas as pd from fake_useragent import UserAgent import time import random def get_anime_list(page=1): """获取番剧列表""" api_url = "https://api.bilibili.com/pgc/season/index/result" params = { "season_type": 1, "page": page, "pagesize": 20, "st": 1, "sort": 0 } headers = {'User-Agent': UserAgent().random} try: response = requests.get(api_url, headers=headers, params=params) response.raise_for_status() return response.json()['data']['list'] except Exception as e: print(f"请求失败: {e}") return [] def parse_anime_data(raw_data): """解析番剧数据""" return [{ 'title': item['title'], 'season_id': item['season_id'], 'update': item['index_show'], 'score': item['score'], 'follow': item['order']['follow'], 'cover': item['cover'] } for item in raw_data] def main(): all_anime = [] for page in range(1, 6): # 爬取前5页 print(f"正在爬取第{page}页...") raw_data = get_anime_list(page) all_anime.extend(parse_anime_data(raw_data)) time.sleep(random.uniform(1, 2)) df = pd.DataFrame(all_anime) df.to_csv('bilibili_anime.csv', index=False) print("数据已保存到bilibili_anime.csv") if __name__ == '__main__': main()
增量爬取:
多线程爬取: “`python from concurrent.futures import ThreadPoolExecutor
with ThreadPoolExecutor(max_workers=5) as executor: executor.map(get_anime_list, range(1, 6))
3. **定时任务**: - 使用APScheduler设置定时任务 - 每天固定时间检查更新 4. **数据可视化**: ```python import matplotlib.pyplot as plt df = pd.read_csv('bilibili_anime.csv') df['score'] = pd.to_numeric(df['score']) top10 = df.nlargest(10, 'score') top10.plot.bar(x='title', y='score') plt.title('B站番剧评分TOP10') plt.show()
遵守Robots协议:
https://www.bilibili.com/robots.txt
版权问题:
法律风险:
性能考虑:
本文详细介绍了使用Python爬取B站动漫番剧信息的完整流程。关键点包括: 1. 通过分析找到合适的API接口 2. 使用requests库获取数据 3. 处理常见的反爬机制 4. 将数据存储到文件或数据库
实际应用中还需要考虑异常处理、日志记录等功能。希望本文能帮助您快速获取所需的番剧信息,为后续数据分析或应用开发打下基础。
注意:本文仅供技术学习交流,请勿用于非法用途。B站接口可能随时变更,实际开发时需要根据最新情况调整。 “`
该文章包含约3500字,采用Markdown格式编写,包含: 1. 完整的技术实现路径 2. 代码示例和解释 3. 反爬处理方案 4. 数据存储方案 5. 注意事项和法律提示 6. 格式化的目录和代码块
可根据需要调整代码细节或补充更多反爬策略相关内容。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。