bangumi游戏信息与评论爬取与整理(基于urllib与beautifulsoup)

爬虫结构

项目原址

注:项目原址中已包含游戏相关的数据,如有研究需要,可以下载。不可用于商业用途!

bangumi网站机器人协议

User-agent: *

Disallow: /pic/
Disallow: /img/
Disallow: /js/

网站格式

  • 以游戏《素晴日》为例,该游戏页面有如下结构:
    1. 概览页面网址为:https://bangumi.tv/subject/259061
    2. 角色页面网址为:https://bangumi.tv/subject/259061/characters
    3. 制作人员页面网址为; https://bangumi.tv/subject/259061/persons
    4. 吐槽页面网址为: https://bangumi.tv/subject/259061/comments
  • 因而不难推测,对于bangumi上的一款游戏,基本的页面结构如下:
    1. 概览页面网址为:https://bangumi.tv/subject/XXXXXX
    2. 角色页面网址为:https://bangumi.tv/subject/XXXXXX/characters
    3. 制作人员页面网址为: https://bangumi.tv/subject/XXXXXX/persons
    4. 吐槽页面网址为: https://bangumi.tv/subject/XXXXXX/comments
      其中XXXXXX为每一部作品的id

爬取内容

  1. 概览页面
    • 左侧简要信息
    • 中部所有tag标签及各标签的标记人数
    • 右部的评分、rank
  2. 角色页面
    • cv原文姓名
    • cv中文姓名
    • 是主角还是配角
  3. 制作人员页面
    • 每位成员原文名称
    • 每位成员中文名称
    • 该成员担任的职务
  4. 吐槽页面
    • 评论用户的id
    • 评论时间
    • 用户评分
    • 评论内容

流程

  • 总体
Created with Raphaël 2.2.0 开始 人为确定爬取范围:游戏-所有游戏 换页 是否为最后一页? 爬取该页所有游戏信息 结束 爬取该页所有游戏信息 yes no
#-*- 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):
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值