要说今年最火的综艺节目,兴风作浪……,哦,不对;小明历险记……,也不对,哎!算了,接着看吧……
数据
利用爬虫抓取了百度百科和维基百科上姐姐们的公开数据信息。两个网站均为静态的页面,只需要对相应HTML标签进行解析即可获取相应的数据。(更简单的方法也可以直接复制相应的表格信息到本地)
百度百科
PS:仔细一瞧,百度百科上有些信息竟然是错的,比如陈松伶的初舞台评分。
维基百科
维基百科数据可以跟百度百科互补一下,对于评分细节更细致许多。
视频弹幕
看着视频,按F12打开开发者工具,然后在network下就会有弹幕json数据包不断的向你扔过来了,在Headers栏可以查看json的路径。https://bullet-ali.hitv.com/bullet/2020/06/30/224134/8766480/0.json
可以看出有日期,即爬取当天的弹幕数据,其余两个应该是节目id和视频id,x.json应该是按照节目的时间来定的,每60s一个数据包。
scrapy startproject sisiter
cd sisiter
scrapy genspider danmu bullet-ali.hitv.com
构建数据Item
import scrapy
class DanmuItem(scrapy.Item):
# define the fields for your item here like:
# 视频id
vid_id = scrapy.Field()
# id
danmu_id = scrapy.Field()
# uname
uname = scrapy.Field()
# 内容
content = scrapy.Field()
# 时间
danmu_time = scrapy.Field()
# 点赞
up_count = scrapy.Field()
# 分钟
danmu_minites = scrapy.Field()
编写爬虫解析代码
# -*- coding: utf-8 -*-
import scrapy
import json
from datetime import datetime
from sister.items import DanmuItem
class DanmuSpider(scrapy.Spider):
name = \'danmu\'
# allowed_domains = [\'bullet-ws.hitv.com\']
start_urls = [\'https://bullet-ali.hitv.com\']
date_str = datetime.now().strftime(\'%Y/%m/%d\')[:8] + str(datetime.now().day)# 当前时日期
num1 = 112744 # 节目参数 7/3最新一期
num2 = 8980904 # 视频参数
def start_requests(self):
base_url = \'https://bullet-ali.hitv.com/bullet/%s/%d/%d/%d.json\'
for page in range(38):
# 打印进度
print(\'正在获取第{}页的信息\'.format(page))
url = base_url % (self.date_str, self.num1, self.num2, page)
yield scrapy.Request(url=url, meta={\'step\': page}, callback=self.parse)
def parse(self, response):
step = response.meta[\'step\']
json_data = json.loads(response.body)
# 获取数据
all_data = json_data[\'data\'][\'items\']
print(len(all_data))
for data in all_data:
danmu_item = DanmuItem()
danmu_item[\'vid_id\'] = self.num2
danmu_item[\'danmu_id\'] = data.get(\'id\')
danmu_item[\'uname\'] = data.get(\'uname\')
danmu_item[\'content\'] =data.get(\'content\')
danmu_item[\'danmu_time\'] = data.get(\'time\')
danmu_item[\'up_count\'] = data.get(\'v2_up_count\')
danmu_item[\'danmu_minites\'] = step + 1
yield danmu_item
保存数据pipeline
import pandas as pd
class SisterPipeline(object):
def __init__(self):
self.info_list = []
def process_item(self, item, spider):
self.info_list.append(item)
return item
def close_spider(self, spider):
df = pd.DataFrame(self.info_list)
df.to_csv(\'danmu_info.csv\', sep=\'\t\', encoding=\'utf-8\', index=False)
保存的数据就是这样婶儿的
可视化
整体
首先,看看姐姐们都来自哪里,可以看出节目组在姐姐们的选择上兼顾到了两岸三地,
而且在民族构成上,也包含了7位少数民族选手,比如“土家族之花”--沈梦辰。
年龄分布情况
职业分布情况
年龄与初评得分的关系很明显了