Python 3.10
如何安装python第三方模块:
win + R 输入 cmd 点击确定, 输入安装命令 pip install 模块名 (pip install requests) 回车
在pycharm中点击Terminal(终端) 输入安装命令
python源码、视频教程、插件安装教程、资料我都准备好了,直接在文末名片自取就可
明确需求
明确采集的网站以及数据内容
网址: https://search.bilibili.com/all?keyword=%E6%98%8F%E5%90%9B%E4%BD%93%E9%A
A%8C%E5%8D%A1&from_source=webtop_search&spm_id_from=333.1007&search_source=
5
数据: 视频相关信息: 标题 / 播放量 / 弹幕量 / 评论 / 作者…
抓包分析 (浏览器中进行操作)
通过浏览器自带工具 (开发者工具) 进行数据抓包: 分析我们需要数据可以请求那个网址能够得到
打开开发者工具
F12 / 右键点击检查选择 network (网络)
刷新网页 / 点击下一页查看数据
点击第二页 / 点击下一页 (爬虫批量采集数据, 进行翻页操作)
通过关键字搜索找到对应数据包链接(位置)
关键字: 我们需要的数据 (标题)
请求网址: https://api.bilibili.com/x/web-interface/wbi/search/type
请求方法: GET
导入的模块
import requests
# 导入格式化输出模块 (内置模块, 无需安装)
from pprint import pprint
# 导入日期转化模块 (内置模块, 无需安装)
import datetime
# 导入csv模块 (内置模块, 无需安装)
import csv
# 导入哈希模块
import hashlib
# 导入时间模块
import time
模拟浏览器对于url地址发送请求
模拟浏览器 (字典接收参数内容)
主要是使用开发者工具中: 请求标头 参数内容
常用: cookie / referer / host / User-Agent (UA)
请求网址
发送请求 (请求方法&请求参数)
def GetResponse(url, data):
"""发送请求
- def: 定义函数的关键字
- GetResponse: 自定义的函数名 (自定义变量名)
- url / data: 形式参数 --> 如果调用这个函数的时候, 需要传入参数
url: 请求网址
data: 请求参数
"""
# 模拟浏览器 (伪装)
headers = {
# User-Agent 用户代理, 表示浏览器基本身份信息/设备信息
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36'
}
# 发送请求
response = requests.get(url=url, params=data, headers=headers)
# 返回内容
return response
response.text 获取响应文本数据
其实除了 获取json / content 以外都可以用text
response.json() 获取响应json数据
响应数据返回内容 {} / [{}] 类似这样的形式 就直接获取json()
response.content 获取响应二进制数据
保存 图片/音频/视频/特定格式文件 的时候, 获取content 表示获取二进制数据
def GetInfo(page, offset, wts, w_rid):
"""获取视频数据
GET请求: 查询参数 (链接问号后面的内容)
"""
# 请求网址
url = 'https://api.bilibili.com/x/web-interface/wbi/search/type'
# 请求参数 (代码折叠)
data = {
'category_id': '',
'search_type': 'video',
'ad_resource': '5654',
'__refresh__': 'true',
'_extra': '',
'context': '',
'page': page,
'page_size': '42',
'from_source': '',
'from_spmid': '333.337',
'platform': 'pc',
'highlight': '1',
'single_column': '0',
'keyword': '昏君体验卡',
'qv_id': '0I7bwAusbLfoEYY25kUrqvU9NodT7Ktq',
'source_tag': '3',
'gaia_vtoken': '',
'dynamic_offset': offset,
'web_location': '1430654',
'w_rid': w_rid,
'wts': wts,
}
# data = {...}
# 发送请求 + 获取数据
JsonData = GetResponse(url=url, data=data).json()
解析方法选择根据你获取到数据情况来的
json字典数据: 可以根据键值对取值
键值对取值: 根据冒号左边的内容[键], 提取冒号右边的内容[值] (一层一层往下提取)
# 解析数据, 提取视频信息列表
result = JsonData['data']['result']
# for 循环遍历, 提取列表里面元素
for index in result:
# 提取具体数据内容, 保存字典里面
send_date = index['senddate'] # 时间戳
# 把时间戳转成日期
date = str(datetime.datetime.fromtimestamp(send_date))
dit = {
'标题': index['title'].replace('', '').replace('', ''),
'Up': index['author'],
'播放': index['play'],
'BV号': index['bvid'],
'弹幕': index['danmaku'],
'时长': index['duration'],
'评论': index['review'],
'日期': date,
}
# 写入字典数据
csv_writer.writerow(dit)
print(dit)
def Hash(page, offset, wts):
"""解密w_rid参数"""
bn = [
"__refresh__=true",
"_extra=",
"ad_resource=5654",
"category_id=",
"context=",
f"dynamic_offset={offset}",
"from_source=",
"from_spmid=333.337",
"gaia_vtoken=",
"highlight=1",
"keyword=%E6%98%8F%E5%90%9B%E4%BD%93%E9%AA%8C%E5%8D%A1",
f"page={page}",
"page_size=42",
"platform=pc",
"qv_id=0I7bwAusbLfoEYY25kUrqvU9NodT7Ktq",
"search_type=video",
"single_column=0",
"source_tag=3",
"web_location=1430654",
f"wts={wts}"
]
jn = '&'.join(bn)
string = jn + "ea1db124af3c7062474693fa704f4ff8"
MD5 = hashlib.md5()
MD5.update(string.encode('utf-8'))
w_rid = MD5.hexdigest()
return w_rid
if __name__ == '__main__':
"""保存数据(固定写法)
open() 内置函数, 用于文件操作(保存/读取)
- file='data.csv': 保存路径以及文件名/格式
- mode='w': 模式(保存方式) w写入数据
- encoding='utf-8': 编码
如果你保存csv表格使用utf-8乱码了 --> 换成utf-8-sig
- newline='': 换成符
csv.DictWriter(): csv模块中字典写入方式
- f: 通过open函数创建的文件对象
- fieldnames: 字段名(表头), 表格文件中第一行内容,表示后续数据是什么东西
"""
f = open(file='data.csv', mode='w', encoding='utf-8', newline='')
csv_writer = csv.DictWriter(f, fieldnames=[
'标题',
'Up',
'播放',
'BV号',
'弹幕',
'时长',
'评论',
'日期',
])
# 写入表头
csv_writer.writeheader()
for page in range(1, 29):
print(f'=============正在采集第{page}页面的数据内容=============')
offset = (page - 1) * 36
wts = int(time.time())
w_rid = Hash(page=page, offset=offset, wts=wts)
GetInfo(page=page, offset=offset, wts=wts, w_rid=w_rid)
感谢你观看我的文章呐~本次航班到这里就结束啦 🛬
希望本篇文章有对你带来帮助 🎉,有学习到一点知识~
躲起来的星星🍥也在努力发光,你也要努力加油(让我们一起努力叭)。