翼度科技»论坛 编程开发 python 查看内容

Python爬虫爬取B站up主所有动态内容

6

主题

6

帖子

18

积分

新手上路

Rank: 1

积分
18
请注意,爬虫的使用应遵守网站的爬虫政策和法律法规,不要对网站造成不必要的负担或违反服务条款。
通过浏览器审查元素查看网络日志,发现每次获取动态信息的请求地址都相同,首次加载时offset为空:
https://api.bilibili.com/x/polymer/web-dynamic/v1/feed/space?host_mid=25470223&offset=
随着网页的不断下拉,offset参数无规律变换,第二次及以后的offset就在上一次次请求返回的json里的"offset"中,将"offset"的值带入下一次请求的参数中即可循环爬取。动态下拉到头时,json中"has_more"会由true变为false,可以以此判断是否结尾。此时的代码如下:
  1. def fetch_data(offset):
  2.     # 请求的URL
  3.     url = "https://api.bilibili.com/x/polymer/web-dynamic/v1/feed/space"
  4.     # 请求参数
  5.     params = {
  6.         "offset": offset,
  7.         "host_mid": 25470223
  8.     }
  9.     # 发送请求
  10.     response = requests.get(url, params=params, headers=headers)
  11.     # 解析JSON数据
  12.     data = response.json()
  13.     print(data) # 自行处理json对象
  14.     # 检查是否还有更多数据
  15.     if data['data']['has_more']:
  16.         # 如果有更多数据,使用新的offset发起新的请求
  17.         fetch_data(data['data']['offset'])
  18. # 从offset为空开始
  19. fetch_data("")
复制代码
直接爬取时,无法直接获取到数据,经网上查询为鉴权错误
{"code":-352,"message":"-352","ttl":1}
这时需要添加请求头及必要的cookie,添加后可以正常爬取,"response.text"即为响应json字符串,可自行存储后单独处理。并添加延时参数防止以后都逛不了B站:
  1. import json
  2. import time
  3. import requests
  4. # 添加请求头
  5. headers = {
  6.     'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
  7.     'Accept-Language': 'zh-CN,zh;q=0.9',
  8.     'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36',
  9.     'Cookie':'buvid3=...; b_nut=...; _uuid=...; buvid4=...;' # up主动态页审查元素自行获取,必传
  10. }
  11. def fetch_data(offset):
  12.     # 每次请求时延时0.1秒
  13.     time.sleep(0.1)
  14.     # 请求的URL
  15.     url = "https://api.bilibili.com/x/polymer/web-dynamic/v1/feed/space"
  16.     # 请求参数
  17.     params = {
  18.         "offset": offset,
  19.         "host_mid": 25470223 # up主id,up主动态页审查元素自行获取
  20.     }
  21.     # 发送请求
  22.     response = requests.get(url, params=params, headers=headers)
  23.     # 解析JSON数据
  24.     data = response.json()
  25.     print(data) # 自行处理json对象
  26.     # 检查是否还有更多数据
  27.     if data['data']['has_more']:
  28.         # 如果有更多数据,使用新的offset发起新的请求
  29.         fetch_data(data['data']['offset'])
  30. # 从offset为空开始
  31. fetch_data("")
复制代码
来源:https://www.cnblogs.com/qiao39gs/p/18179662
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具