爬取数据目标
网站:bilibili
效果展示
工具使用
开发工具:pycharm 开发环境:python3.7, Windows10 使用工具包:requests,threading, csv
重点学习内容
- 常见请求头的反爬
- json数据的处理
- csv文件处理
项目思路解析
找到你需要采集的视频地址(我找的是小破站的一个高质量男性的视频) 网址:https://www.bilibili.com/video/BV1po4y1C7Pa?from=search&seid=8340616883387402352
爬虫采集数据首先要找到对应的数据目标地址 可以明显看出当前的网页的评论数据是在不断变化的 需要找到对应的评论接口 习惯性的去找动态数据
数据并没有在动态数据里 清空数据加载新的评论数据 触发加载条件
加载的数据在all里 明确数据之后就好处理了 获取到对应的网页接口 通过requests发送网络请求
url = 'https://api.bilibili.com/x/v2/reply/main?jsonp=jsonp&next={}&type=1&oid=9659814&mode=3&plat=1&_=1627974678383'.format(
i)
response = requests.get(url)
print(response.text)
数据请求失败请求头没有做反爬策略 添加对应的ua,以及refere 主要是防盗链的请求头措施,在浏览器请求也是得不到数据的获取到准确的数据 提取自己想要的数据信息
- 评论的内容
- 评论的时间
- 评论的作者
- 作者的性别
- 作者的个性签名
- (各位大佬可以根据自己的需求进行自动的采集数据)
处理json数据时要注意, json数据前有jQuery1720892078778784086_1627994582044 可以通过正则的方式进行匹配提取 这里我选择修改url的参数 讲网址的jQuery1720892078778784086_1627994582044进行删除 最终的网址是:
https://api.bilibili.com/x/v2/reply/main?jsonp=jsonp&next={}&type=1&oid=376402596&mode=3&plat=1&_=1627993394215
获取到数据后进行数据保存 数据保存在csv文件
def save_data(item):
with open('小破站1.csv', "a", newline='', encoding="utf-8")as f:
filename = ['content', 'ctime', 'sex', 'uname', 'sign']
csv_data = csv.DictWriter(f, fieldnames=filename)
csv_data.writerow(item)
简易源码分享
import csv # 处理对应的csv文件
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36'
}
def save_data(item):
with open('小破站高质量人类.csv', "a", newline='', encoding="gbk")as f:
filename = ['content', 'ctime', 'sex', 'uname', 'sign']
csv_data = csv.DictWriter(f, fieldnames=filename)
csv_data.writerow(item)
def get_data(i):
url = 'https://api.bilibili.com/x/v2/reply/main?jsonp=jsonp&next={}&type=1&oid=376402596&mode=3&plat=1&_=1627993394215'.format(
i)
response = requests.get(url, headers=headers).json()
# print(response.content.decode('utf-8'))
item = {}
for data in response['data']['replies']:
# print(data)
# print(' ')
item['content'] = data['content']['message'].replace('
', '')
item['ctime'] = data['ctime'] # 时间戳保存方便
item['sex'] = data['member']['sex']
item['uname'] = data['member']['uname']
item['sign'] = data['member']['sign']
print(item)
save_data(item)
if __name__ == '__main__':
for i in range(1, 300):
# 发送网络请求
get_data(i)
我是白又白i,一名喜欢分享知识的程序媛❤️
如果没有接触过编程这块的朋友看到这篇博客,发现不会的或者想要学习Python的,可以直接留言或者私我【非常感谢你的点赞、收藏、关注、评论,一键四连支持】