使用python实现某站排行榜视频信息爬取、简单处理并保存到本地excel

使用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
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值