爬虫结构
项目原址
注:项目原址中已包含游戏相关的数据,如有研究需要,可以下载。不可用于商业用途!
bangumi网站机器人协议
User-agent: *
Disallow: /pic/
Disallow: /img/
Disallow: /js/
网站格式
- 以游戏《素晴日》为例,该游戏页面有如下结构:
- 概览页面网址为:https://bangumi.tv/subject/259061
- 角色页面网址为:https://bangumi.tv/subject/259061/characters
- 制作人员页面网址为; https://bangumi.tv/subject/259061/persons
- 吐槽页面网址为: https://bangumi.tv/subject/259061/comments
- 因而不难推测,对于bangumi上的一款游戏,基本的页面结构如下:
- 概览页面网址为:https://bangumi.tv/subject/XXXXXX
- 角色页面网址为:https://bangumi.tv/subject/XXXXXX/characters
- 制作人员页面网址为: https://bangumi.tv/subject/XXXXXX/persons
- 吐槽页面网址为: https://bangumi.tv/subject/XXXXXX/comments
其中XXXXXX为每一部作品的id
爬取内容
- 概览页面
- 左侧简要信息
- 中部所有tag标签及各标签的标记人数
- 右部的评分、rank
- 角色页面
- cv原文姓名
- cv中文姓名
- 是主角还是配角
- 制作人员页面
- 每位成员原文名称
- 每位成员中文名称
- 该成员担任的职务
- 吐槽页面
- 评论用户的id
- 评论时间
- 用户评分
- 评论内容
流程
- 总体
- 对应代码
本部分代码原址
#-*- coding: UTF-8 -*-
#爬取bangumi上所有游戏的信息
import single_item_frame as sif#见下方'爬取该页所有游戏信息'部分的代码
from urllib.request import urlopen
from bs4 import BeautifulSoup
import pandas as pd
import re
import time
basement = r'https://bangumi.tv'#单款产品基础网址
start_page = r'https://bangumi.tv/game/browser'#单页面基础网址
present_page = r'https://bangumi.tv/game/browser?page=1'#当前地址
#数据读取
try:
raw_data_total_left = pd.read_csv('raw_data_total_left.csv',encoding='utf-8')
except:
raw_data_total_left = pd.DataFrame(columns=['game_id','attr','thing'])#游戏信息初始化,id,属性,内容
print('left文件不存在,创建一个')
try:
raw_data_total_mid = pd.read_csv('raw_data_total_mid.csv',encoding='utf-8')
except:
raw_data_total_mid = pd.DataFrame(columns=['game_id','tag_name','tag_num'])
print('mid文件不存在,创建一个')
try:
raw_data_total_right = pd.read_csv('raw_data_total_right.csv',encoding='utf-8')
except:
raw_data_total_right = pd.DataFrame(columns=['game_id','score','rank'])
print('right文件不存在,创建一个')
try:
raw_data_characters = pd.read_csv('raw_data_characters.csv',encoding='utf-8')
except:
raw_data_characters = pd.DataFrame(columns=['game_id','cv_id','charcter_type','name','other_name'])#角色信息初始化,声优id,角色类型,声优原名,别名
print('characters文件不存在,创建一个')
try:
raw_data_persons = pd.read_csv('raw_data_persons.csv',encoding='utf-8')
except:
raw_data_persons = pd.DataFrame(columns=['game_id','person_id','work','name','other_name'])#制作人员信息初始化,职务、名字、别名
print('persons文件不存在,创建一个')
try:
raw_data_comments = pd.read_csv('raw_data_comments.csv',encoding='utf-8')
except:
raw_data_comments = pd.DataFrame(columns=['game_id','user_id','issue_time','user_score','content'])#存储数据的dataframe#评论信息初始化
print('comments文件不存在,创建一个')
#记录已经获取的gameid
id_list_left = list(set(raw_data_total_left['game_id']))
id_list_mid = list(set(raw_data_total_mid['game_id']))
id_list_right = list(set(raw_data_total_right['game_id']))
id_list_characters = list(set(raw_data_characters['game_id']))
id_list_persons = list(set(raw_data_persons['game_id']))
id_list_comments = list(set(raw_data_comments['game_id']))
#累计爬取产品数
n = 0
#爬取该页所有信息
while True:
print('正在爬' + present_page)
#设置超时(timeout)重新请求
for times in range(50):