使用python实现某站排行榜视频信息爬取、简单处理并保存到本地excel
原理
使用python模拟访问某站排行榜页面,利用beautiful soup解析页面数据,并将数据进行整理、归类、调整,并保存到本地
需要用到的库
import requests
from bs4 import BeautifulSoup
import pandas as pd
import datetime
import matplotlib.pyplot as plt
主要函数
获取网页内容
def GetWeb(url=None, headers=None):
'''
此函数用于获取网页内容
input
url:网页的url
headers:网页请求头
retrun
soup:经过Beautiful Soup解析后的数据
'''
data = []
response = requests.get(url, headers=headers)
if response.status_code == 200:
data = response.content.decode('utf-8')
soup = BeautifulSoup(data, 'lxml')
return soup
else:
print('网页解析失败')
return None
提取需要的数据
def GetMess(soup):
'''
此函数用来从网页中提取需要的数据
input
soup:Beautiful Soup解析的数据
return
videodata:字典形式的数据,里面包含:视频标题、视频综合得分、
视频播放量、视频评论数、up主名字、视频BV等数据
'''
video_names = [] # 视频标题
video_scores = [] # 视频综合得分
video_play = [] # 视频播放量
video_comment = [] # 视频评论数
up_name = [] # up主名字
mess = [] # 视频地址
video_id = [] # 视频BV
# 对视频标题的处理
namelist = soup.find_all('a', class_='title')
for name in namelist:
video_names.append(name.get_text('title'))
# 对视频综合得分数据的处理
scorelist = soup.find_all(class_='pts')
for score in scorelist:
video_scores.append(score.get_text().replace('综合得分\n', '').strip())
# 对视频播放量、评论数、up主名字的处理
messages = soup.find_all(class_='data-box')
for i in range(0, len(messages), 3):
play = messages[i].get_text().strip()
if messages[i].get_text().strip().find("万"):
play = float(messages[i].get_text().strip().replace("万", ""))*10000
video_play.append(play)
comment = messages[i + 1].get_text().strip()
# 处理数据中的“万”字
if messages[i + 1].get_text().strip().find("万") > 0:
comment = float(messages[i + 1].get_text().strip().replace("万", "")) * 10000
video_comment.append(comment)
# video_play.append(messages[i].get_text().strip())
# video_comment.append(messages[i + 1].get_text().strip())
up_name.append(messages[i + 2].get_text().strip())
# 对视频id的处理
for value in soup.find_all('a', class_='title'):
mess.append(value.get('href'))
# x = 0
for i in range(len(mess)):
if type(mess[i]) != str:
pass
elif mess[i].startswith('//www.bilibili.com/video/'):
# print(x,":",mess[i],",处理后:",mess[i].lstrip('//www.bilibili.com/video/)'))
video_id.append(mess[i].lstrip('//www.bilibili.com/video/)'))
# x = x + 1
else:
pass
video_ids = []
for i in video_id:
if not i in video_ids:
video_ids.append(i)
# 视频排名
rank = [i for i in range(1, 101, 1)]
# 打包整理成一个字典
videodata = {'视频名字': video_names,
'播放量': video_play,
'评论数': video_comment,
'综合得分': video_scores,
'up主名字': up_name,
'视频BV': video_ids,
'排名': rank
}
return videodata
保存成指定格式的excel,用于后续数据处理或数据展示
def SaveToExcel(videodata,type):
if type == 1:
# try:
# VideoData = pd.DataFrame(videodata)
# VideoData.to_excel('B站排名前100的视频汇总({0})(日榜).xls'.format(datetime.datetime.now().strftime('%Y-%m-%d')), index=False)
# print('数据保存成功,请到文件“B站排名前100的视频汇总({0})(日榜).xls”中查看'.format(datetime.datetime.now().strftime('%Y-%m-%d')))
# except:
# print('数据写入失败')
VideoData = pd.DataFrame(videodata)
VideoData.to_excel('B站排名前100的视频汇总({0})(日榜).xls'.format(datetime.datetime.now().strftime('%Y-%m-%d')), index=False)
print('数据保存成功,请到文件“B站排名前100的视频汇总({0})(日榜).xls”中查看'.format(datetime.datetime.now().strftime('%Y-%m-%d')))
elif type == 2:
try:
VideoData = pd.DataFrame(videodata)
VideoData.to_excel('B站排名前100的视频汇总({0})(三日榜).xls'.format(datetime.datetime.now().strftime('%Y-%m-%d')),index=False)
print('数据保存成功,请到文件“B站排名前100的视频汇总({0})(三日榜).xls”中查看'.format(datetime.datetime.now().strftime('%Y-%m-%d')))
except:
print('数据写入失败')
elif type == 3:
try:
VideoData = pd.DataFrame(videodata)
VideoData.to_excel('B站排名前100的视频汇总({0})(周榜).xls'.format(datetime.datetime.now().strftime('%Y-%m-%d')), index=False)
print('数据保存成功,请到文件“B站排名前100的视频汇总({0})(周榜).xls”中查看'.format(datetime.datetime.now().strftime('%Y-%m-%d')))
except:
print('数据写入失败')
return VideoData