Python爬虫——某网站的视频数据

一、选题背景

1.背景

  随着大数据时代的来临,网络爬虫在互联网中的地位将越来越重要。互联网中的数据是海量的,如何自动高效地获取互联网中我们感兴趣的信息并为我们所用是一个重要的问题,而爬虫技术就是为了解决这些问题而生的。对于身为数据科学与大数据技术专业的学生来说,网络爬虫成为必要的技能之一,结合自己的喜好,这次我选择爬取个人比较喜欢的B站up主老番茄目前(2023-5-20以前)的所有视频数据,并进行简单的可视化分析。

2.预期目标

  老番茄自2013年起在哔哩哔哩平台进行视频创作,是该站首位拥有1000万粉丝的个人UP主,同时他也发布了近500条视频内容,通过对其视频信息的爬取和数据分析,目的是了解老番茄什么时候开始获得流量、播放量和视频上传时间是否存在关联、其主要视频内容分区、每年的视频产量等。

如果你也刚接触或者正在学习Python,但是找不到方向,不知道如何系统的学习Python,那么你可以试试我分享这个学习规划和知识点+实战案例
点击领取(绝对免费哦~)

二、B站up主—老番茄视频信息数据爬取方案

1.课题名称

  B站up主—老番茄视频信息数据爬取

2.爬取的内容与数据特征分析

  主要将爬取的内容分为16个字段,分别是:视频标题、视频地址、up主昵称、up主UID、视频上传时间、视频时长、是否合作视频、视频分区、弹幕数、播放量、点赞数、投币量、收藏量、评论数、转发量以及爬取时间;爬取到的478条视频数据,保存到excel表格中。

3.设计方案概述

(1)实现思路:

  • 打开一个B站的网页,打开开发者模式,点击network,刷新。
  • 发起请求,获取响应内容,得到json字符串,进行js解密。
  • 解析自己想要的数据,保存文本。

(2)技术难点:

  • 应对反爬。
  • json解密。
  • 视频内容分区。

三、老番茄B站主页的特征分析

根据鼠标光标确定具体爬取内容的部分,以便分析

四、网络爬虫程序设计

1.数据的爬取与采集

爬取网站:https://space.bilibili.com/546195/video

(1)导入相关库并且建立一个用户代理池,以解决反爬。用户代理池取自:csdn :https://deepboat.blog.csdn.net/ 【Python】【进阶篇】三、Python爬虫的构建User-Agnet代理池

 
import requests
import random
import time
import datetime
import pandas as pd
import hashlib
from pprint import pprint
from lxml import etree
#爬取b站up主老番茄全部视频信息
up_mid = '546195'  # 这是老番茄的aid号
max_page = 16     # 爬取最大页数
'''用户代理池,防止反爬 '''
user_agent = ["Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)","Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; AcooBrowser; .NET CLR 1.1.4322; .NET CLR 2.0.50727)","Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Acoo Browser; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.0.04506)","Mozilla/4.0 (compatible; MSIE 7.0; AOL 9.5; AOLBuild 4337.35; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)","Mozilla/5.0 (Windows; U; MSIE 9.0; Windows NT 9.0; en-US)","Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Media Center PC 6.0)","Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 1.0.3705; .NET CLR 1.1.4322)","Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.2; .NET CLR 3.0.04506.30)","Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN) AppleWebKit/523.15 (KHTML, like Gecko, Safari/419.3) Arora/0.3 (Change: 287 c9dfb30)","Mozilla/5.0 (X11; U; Linux; en-US) AppleWebKit/527+ (KHTML, like Gecko, Safari/419.3) Arora/0.6","Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.2pre) Gecko/20070215 K-Ninja/2.1.1","Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9) Gecko/20080705 Firefox/3.0 Kapiko/3.0","Mozilla/5.0 (X11; Linux i686; U;) Gecko/20070322 Kazehakase/0.4.5","Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.8) Gecko Fedora/1.9.0.8-1.fc10 Kazehakase/0.5.6","Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11","Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/535.20 (KHTML, like Gecko) Chrome/19.0.1036.7 Safari/535.20","Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; fr) Presto/2.9.168 Version/11.52"
]
def web_rid(param):"""js解密"""n = "9cd4224d4fe74c7e9d6963e2ef891688" + "263655ae2cad4cce95c9c401981b044a"c = ''.join([n[i] for i in[46, 47, 18, 2, 53, 8, 23, 32, 15, 50, 10, 31, 58, 3, 45, 35, 27, 43, 5, 49, 33, 9, 42, 19, 29, 28, 14,39, 12, 38, 41, 13, 37, 48, 7, 16, 24, 55, 40, 61, 26, 17, 0, 1, 60, 51, 30, 4, 22, 25, 54, 21, 56,59, 6, 63, 57, 62, 11, 36, 20, 34, 44, 52]][:32])s = int(time.time())param["wts"] = sparam = "&".join([f"{i[0]}={i[1]}" for i in sorted(param.items(), key=lambda x: x[0])])return hashlib.md5((param + c).encode(encoding='utf-8')).hexdigest(), s
复制代码

(2)对我们要爬取的视频内容进行分类,在开发者界面找到以下部分

代码如下:

""" 进行分类 """
def get_video_type(v_num):if v_num == 28:return '音乐'elif v_num == 17:return '游戏'elif v_num == 71:return '娱乐'elif v_num == 138 or v_num == 161 or v_num == 239:return '生活'elif v_num == 85:return '影视'elif v_num == 218:return '动物圈'elif v_num == 214:return '美食'else:return '未知分区'

(3)获取前几页视频的url列表

代码如下:

'''获取前几页视频的url列表'''
def get_url_list():headers = {'User-Agent': random.choice(user_agent),'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8','Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2','Connection': 'keep-alive',}url_list = []  # 视频地址title_list = []  # 视频标题author_list = []  # UP主昵称mid_list = []  # UP主UIDcreate_time_list = []  # 上传时间play_count_list = []  # 播放数length_list = []  # 视频时长comment_count_list = []  # 评论数is_union_list = []  # 是否合作视频type_list = []  # 分区danmu_count_list = []  # 弹幕数for i in range(1, max_page + 1):  # 前n页print('开始爬取第{}页'.format(str(i)))url = 'https://api.bilibili.com/x/space/wbi/arc/search'params = {'mid': up_mid,'ps': 30,'tid': 0,'pn': i,  # 第几页'keyword': '','order': 'pubdate','platform': 'web','web_location': '1550101','order_avoided': 'true',}# 增加解密参数ret = web_rid(params)w_rid = ret[0]wts = ret[1]params['w_rid'] = w_ridparams['wts'] = wts

(4)发送请求

# 发送请求r = requests.get(url, headers=headers, params=params)print(r.status_code)  # 响应码200json_data = r.json()video_list = json_data['data']['list']['vlist']for i in video_list:bvid = i['bvid']url = 'https://www.bilibili.com/video/' + bvidurl_list.append(url)title = i['title']title_list.append(title)author = i['author']author_list.append(author)mid = i['mid']mid_list.append(mid)create_time = i['created']create_time = trans_date(v_timestamp=create_time)create_time_list.append(create_time)play_count = i['play']play_count_list.append(play_count)length = i['length']length_list.append(length)comment = i['comment']comment_count_list.append(comment)is_union = '是' if i['is_union_video'] == 1 else '否'is_union_list.append(is_union)type_name = get_video_type(v_num=i['typeid'])type_list.append(type_name)danmu_count = i['video_review']danmu_count_list.append(danmu_count)return url_list, title_list, author_list, mid_list, create_time_list, play_count_list, length_list, comment_count_list, is_union_list, type_list, danmu_count_list

(5)爬取每个视频详细数据,并保存为excel表格

'视频标题': title_list,

'视频地址': url_list,

'UP主昵称': author_list,

'UP主UID': mid_list,

'视频上传时间': create_time_list,

'视频时长': length_list,

'是否合作视频': is_union_list,

'视频分区': type_list,

'弹幕数': danmu_count_list,

'播放量': play_count_list,

'点赞数': like_count_list,

'投币量': coin_count_list,

'收藏量': fav_count_list,

'评论数': comment_count_list,

'转发量': share_count_list,

'实时爬取时间': now_list

'''爬取每个视频的详细数据'''
def get_video_info(v_url):headers = {'User-Agent': random.choice(user_agent),'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8','Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2','Connection': 'keep-alive',}r = requests.get(v_url, headers=headers)print('当前的url是:', v_url)# 用xpath解析页面数据html = etree.HTML(r.content)try:  # 点赞数like_count = html.xpath('//*[@id="arc_toolbar_report"]/div[1]/div[1]/div/span/text()')[0]if like_count.endswith('万'):like_count = int(float(like_count.replace('万', '')) * 10000)  # 把万转换为数字except:like_count = ''try:  # 投币数coin_count = html.xpath('//*[@id="arc_toolbar_report"]/div[1]/div[2]/div/span/text()')[0]if coin_count.endswith('万'):coin_count = int(float(coin_count.replace('万', '')) * 10000)  # 把万转换为数字except:coin_count = ''try:  # 收藏数fav_count = html.xpath('//*[@id="arc_toolbar_report"]/div[1]/div[3]/div/span/text()')[0]if fav_count.endswith('万'):fav_count = int(float(fav_count.replace('万', '')) * 10000)  # 把万转换为数字except:fav_count = ''try:  # 转发数share_count = html.xpath('//*[@class="video-share-info video-toolbar-item-text"]/text()')[0]if share_count.endswith('万'):share_count = int(float(share_count.replace('万', '')) * 10000)  # 把万转换为数字except Exception as e:print('share_count except', str(e))share_count = ''try:union_team = html.xpath('//*[@id="member-container"]')for i in union_team:url_tail = i.xpath('./div/div/a/@href')print(url_tail)members = [i.replace('//space.bilibili.com/', '') for i in url_tail]print('members is: {}'.format(members))except:members = Nonereturn like_count, coin_count, fav_count, share_count, membersif __name__ == '__main__':url_list, title_list, author_list, mid_list, create_time_list, play_count_list, length_list, comment_count_list, is_union_list, type_list, danmu_count_list = get_url_list()pprint(title_list)pprint(is_union_list)pprint(type_list)like_count_list = []  # 点赞数coin_count_list = []  # 投币数fav_count_list = []  # 收藏数share_count_list = []  # 分享数now_list = []  # 实时爬取时间for url in url_list:now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')  # 实时爬取时间like_count, coin_count, fav_count, share_count, members = get_video_info(v_url=url)like_count_list.append(like_count)coin_count_list.append(coin_count)fav_count_list.append(fav_count)share_count_list.append(share_count)now_list.append(now)df = pd.DataFrame(data={'视频标题': title_list,'视频地址': url_list,'UP主昵称': author_list,'UP主UID': mid_list,'视频上传时间': create_time_list,'视频时长': length_list,'是否合作视频': is_union_list,'视频分区': type_list,'弹幕数': danmu_count_list,'播放量': play_count_list,'点赞数': like_count_list,'投币量': coin_count_list,'收藏量': fav_count_list,'评论数': comment_count_list,'转发量': share_count_list,'实时爬取时间': now_list})df.to_excel('laofanqie_B站视频数据.xlsx', index=None)

文件部分截图(共438条数据):

如何系统化学习Python

这里,我为您精心准备了一份全面的Python学习大礼包,完全免费分享给每一位渴望成长、希望突破自我现状却略感迷茫的朋友。无论您是编程新手还是希望深化技能的开发者,都欢迎加入我们的学习之旅,共同交流进步!

🌟 学习大礼包包含内容:

Python全领域学习路线图:一目了然,指引您从基础到进阶,再到专业领域的每一步学习路径,明确各方向的核心知识点。

超百节Python精品视频课程:涵盖Python编程的必备基础知识、高效爬虫技术、以及深入的数据分析技能,让您技能全面升级。

实战案例集锦:精选超过100个实战项目案例,从理论到实践,让您在解决实际问题的过程中,深化理解,提升编程能力。

华为独家Python漫画教程:创新学习方式,以轻松幽默的漫画形式,让您随时随地,利用碎片时间也能高效学习Python。

互联网企业Python面试真题集:精选历年知名互联网企业面试真题,助您提前备战,面试准备更充分,职场晋升更顺利。

👉 立即领取方式:只需【点击这里】,即刻解锁您的Python学习新篇章!让我们携手并进,在编程的海洋里探索无限可能!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/402832.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【业务场景实战】你知道布隆过滤器怎么用吗?

布隆过滤器想必大家都听过,背过Redis面试题的兄弟应该都知道,布隆过滤器是解决缓存穿透问题的一种方法。但可能很少用过 布隆过滤器主要是为了解决海量数据的存在性问题。对于海量数据中判定某个数据是否存在且容忍轻微误差这一场景(比如缓存…

03 网络编程 TCP传输控制协议

目录 1、TCP基本特征 2、TCP通信流程基本原理 (1)基本原理 (2)TCP通信代码实现 (3)核心API解析 1)地址绑定--bind 2)设置监听-listen 3)等待连接请求-accept-产生一个已连接套接字 4&a…

Transformer2

1.编解码 外国人来到中国,是如何知晓“梨”的中文? 相同的词,上下文应该都是相关的,又因为是计算机,所以需要将语义关系码进行数字化,这些数字需要体现出语义关系。 1.编解码的两个标准 编解码的两个标准包…

复习之 java 锁

裁员在家,没有面试机会,整理整理面试知识点吧! 不得不知道的java 锁 Java 中,提供了两种方式来实现同步互斥访问(也就是锁):synchronized 和 Lock 多线程编程中,有可能会出现多个线…

基于YOLOv8的缺陷检测任务模型训练

文章目录 一、引言二、环境说明三、缺陷检测任务模型训练详解3.1 PCB数据集3.1.1 数据集简介3.1.2 数据集下载3.1.3 构建yolo格式的数据集 3.2 基于ultralytics训练YOLOv83.2.1 安装依赖包3.2.2 ultralytics的训练规范说明3.2.3 创建训练配置文件3.2.4 下载预训练模型3.2.5 训练…

招聘|头部云厂商招 PG 核心骨干 DBA【上海】

我们的招聘专区又回来了!🏃 Bytebase 作为先进的数据库 DevOps 团队协同工具 🔧,用户群里汇聚了 💗 业界优秀的 DBA,SRE,运维的同学们 🌟。 上周用户群里有小伙伴发招聘信息 &…

webrtc学习笔记1

WebRTC开发环境 配置vscode 安装插件 Prettier Code Formatter 使用 Prettier 来统一代码风格,当保存 HTML/CSS/JavaScript 文件时,它会自动调整代码格式。 Live Server:在本地开发环境中,实时重新加载(reload)页面。 第一个简…

QT:Telnet客户端与服务器的创建

客户端 telnetClient类 #ifndef TELNETCLIENT_H #define TELNETCLIENT_H#include <QObject> #include <QTcpSocket>class TelnetClient : public QObject {Q_OBJECTpublic:explicit TelnetClient(QObject *parent nullptr);~TelnetClient();// 连接到指定的主机…

启发式算法之模拟退火算法

文章目录 1. 模拟退火算法概述1.1 算法起源与发展1.2 算法基本原理 2. 算法实现步骤2.1 初始化过程2.2 迭代与降温策略 3. 模拟退火算法的优化策略3.1 冷却进度表的设计3.2 参数调整与策略 4. 模拟退火算法的应用领域4.1 组合优化问题4.1.1 旅行商问题&#xff08;TSP&#xff…

YOLO好像也没那么难?

“学YOLO的念头是想整个游戏外挂&#xff01;” 目录 基本原理 模型推理 IOU交并比 NMS非极大值抑制 模型训练 损失函数LOSS 代码实现 YOLO学习渠道 基本原理 模型推理 学习一个新的神经网络结构&#xff0c;作者认为整明白输入和输出是怎么回事就OK了&#xff0c;至于…

HTML静态网页成品作业(HTML+CSS)——安徽宣笔设计制作(5个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有6个页面。 二、作品演示 三、代…

回调函数,字符函数,字符串函数

前言&#xff1a;上一趴我们学习了指针。那么今天我们来学习新的知识&#xff0c;回调函数&#xff0c;字符函数&#xff0c;字符串函数。 1 回调函数 什么是回调函数呢&#xff1f;回调函数就是通过函数指针调用的函数。 如果你把函数的指针&#xff08;地址&#xff09;作…

【Docker系列】Docker 容器时区设置指南

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

尚硅谷MYSQL(5-6章)

排序和分页 排序 如果没有使用排序操作的话 查询出来的数据是按添加的顺序排序的 ORDER BY是来进行排序的 后面可以添加ASC升序 DESC降序 如果后面没有显示指明排序的方式的话 则默认按照升序排序 where中不能使用列的别名 我们在使用sql语句的时候 她的执行顺序不是从第一…

FastCopy文件快速复制v5.7.15

软件介绍 FastCopy文件快速复制工具。Windows平台上最快的文件复制、删除软件&#xff01;功能强劲&#xff0c;性能优越&#xff01;它是源于日本的高效文件复制加速软件&#xff0c;支持拖拽操作&#xff0c;三种不同HDD模式&#xff1b;支持通配符&#xff0c;任务管理/命令…

微信小程序保存图片到相册

申请权限 代码如下 wx.downloadFile({url: image, //仅为示例&#xff0c;并非真实的资源success(res) {// 只要服务器有响应数据&#xff0c;就会把响应内容写入文件并进入 success 回调&#xff0c;业务需要自行判断是否下载到了想要的内容if (res.statusCode 200) {consol…

XSS Game练习

1.Ma Spaghet 直接get传参 ?somebodyaaaa直接使用img标签 ?somebody<img%20src1%20onerror"alert(1337)">官方文档 应使用innertext&#xff0c;安全性更高 2.Jefff 通过代码可以知道是通过eval的代码执行&#xff0c;setTimeout中的内容表示在一秒后执行…

uniapp预览图片uni.previewImage图片放大

<image v-if"file.image!" :src"file.image" click"previewImage(file.image)"></image>file: {image: ,status: 1}, // 预览 图片previewImage() {uni.previewImage({current: 1,urls: [this.img] // 是个 数组 单张的&#xff08…

JAVA打车小程序APP打车顺风车滴滴车跑腿源码微信小程序打车系统源码

&#x1f697;&#x1f4a8;打车、顺风车、滴滴车&跑腿系统&#xff0c;一键解决出行生活难题&#xff01; 一、出行新选择&#xff0c;打车从此不再难 忙碌的生活节奏&#xff0c;让我们常常需要快速、便捷的出行方式。打车、顺风车、滴滴车系统&#xff0c;正是为了满足…

[C#]winform基于opencvsharp结合Diffusion-Low-Light算法实现低光图像增强黑暗图片变亮变清晰

【训练源码】 https://github.com/JianghaiSCU/Diffusion-Low-Light 【参考源码】 https://github.com/hpc203/Diffusion-Low-Light-onnxrun 【论文地址】 https://arxiv.org/pdf/2306.00306.pdf 【算法原理图】 【效果展示】 【测试环境】 vs2019 netframework4.7.2 …