小姐姐教你用爬虫抓取B站人类高质量男性求偶视频的弹幕,康康都在讨论什么!

640 阅读3分钟

这是我参与8月更文挑战的第5天,活动详情查看:8月更文挑战

爬取数据目标

网站:bilibili image.png

效果展示

image.png

工具使用

开发工具:pycharm 开发环境:python3.7, Windows10 使用工具包:requests,threading, csv

重点学习内容

  • 常见请求头的反爬
  • json数据的处理
  • csv文件处理

项目思路解析

找到你需要采集的视频地址(我找的是小破站的一个高质量男性的视频) image.png 网址:www.bilibili.com/video/BV1po…

爬虫采集数据首先要找到对应的数据目标地址 可以明显看出当前的网页的评论数据是在不断变化的 需要找到对应的评论接口 习惯性的去找动态数据

image.pngimage.png

数据并没有在动态数据里 清空数据加载新的评论数据 触发加载条件

image.pngimage.png

加载的数据在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)

image.png

数据请求失败请求头没有做反爬策略 添加对应的ua,以及refere 主要是防盗链的请求头措施,在浏览器请求也是得不到数据的

image.png 获取到准确的数据 提取自己想要的数据信息

  • 评论的内容
  • 评论的时间
  • 评论的作者
  • 作者的性别
  • 作者的个性签名
  • (各位大佬可以根据自己的需求进行自动的采集数据)

处理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

image.png 获取到数据后进行数据保存 数据保存在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('\n', '')
        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的,可以直接留言或者私我【非常感谢你的点赞、收藏、关注、评论,一键四连支持】