wawj1224 发表于 2025-3-7 22:13:12

python爬虫爬取b站视频评论 为什么最后没有数据?

import requests
import csv
import hashlib
import time
from datetime import datetime
import json
from urllib.parse import quote
#w_rid加密参数

def GetW(wts,NextPage):

      pagination_str = '{"offset":%s}' %NextPage
      print(quote(pagination_str))
      l=["mode=2",
            "oid=113814703972019",
            f"pagination_str={quote(pagination_str)}",
            "plat=1",
            "type=1",
            "web_location=1315875",
            f"wts={wts}"
      ]
      y = '&'.join(l)
      string= y + "ea1db124af3c7062474693fa704f4ff8"
      MD5 = hashlib.md5()
      MD5.update(string.encode('utf-8'))
      w_rid = MD5.hexdigest()
      print(w_rid)
      return w_rid











def GetContent(NextPage):
    headers = {"cookie":"bili_ticket=eyJhbGciOiJIUzI1NiIsImtpZCI6InMwMyIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NDE1Nzk0MzAsImlhdCI6MTc0MTMyMDE3MCwicGx0IjotMX0.FsFshnZPFdht_Fj7Pxqp5XgzHlgnYPnpoGWX53F1imw; bili_ticket_expires=1741579370; buvid3=1D55509D-6660-9458-1C1A-6EC43569BE4130240infoc; b_nut=1741320227; buvid4=6A35DDCB-75FC-4C6D-03B6-B828DEA70BA430240-025030704-QwNGI+jNopUTI1GhLVomaw%3D%3D; _uuid=1D11D2210-2BC9-2529-8C44-C1010A76E8D381028745infoc; CURRENT_FNVAL=4048; buvid_fp=2f0eefefa84c6a4ab0d42472a63a6dd4; b_lsid=D414ECEB_1956F97B63D; csrf_state=130ae0096803953f25dfdd2b87144e35; SESSDATA=cdefeabd%2C1756887034%2C4ca20%2A32CjD7yyeY9-VFI_RWy8IsjId3cPUs-xTs-3CYvAyVNuAehtfvU-_ii9uXRESeWr7O9I4SVlVNQUFBUzR6NkxLcDh6SGhvVWtPbWVqZUJ6U2t6OFgtYVdqVEFJb3ZtSjJmTUQ3VHBlRFh5LXFNSDN0bUlOTlgwMF93RVV4aHh5TXB5N3o0SVRDOUdRIIEC; bili_jct=1018cac8e70a199a4feca14132a9055c; DedeUserID=3546377353169818; DedeUserID__ckMd5=b43dfea08718ba45; sid=mcmifm2h",
               "user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36 Edg/133.0.0.0",}


    url = 'https://api.bilibili.com/x/v2/reply/wbi/main'
    wts = int(time.time())
    pagination_str =   '{"offset":%s}' % offset

    w_rid = GetW(wts = wts,NextPage = pagination_str)
    data = {
      'oid': '114040961501285',
      'type': '1',
      'mode':' 2',
      'pagination_str': '{"offset":%s}' % offset,
      'plat': '1',
      'seek_rpid': '',
      'web_location': '1315875',
      'w_rid': w_rid,
      'wts': wts,}
    response = requests.get(url = url, params = data ,headers = headers)
    #Get查询参数
    #请求方法:Get请求方法

    #获取数据
    json_data = response.json()

    #解析数据
    #字典取值
    replies = json_data['data']['replies']
    for index in replies:
      ctime = index['ctime']
      date = str(datetime.fromtimestamp(ctime))
      dit = {
            '昵称':index['member']['uname'],
            '性别' :index['member']['sex'],
            '地区':index['reply_control']['location'].replace('IP属地',''),
            '评论':index['content']['message'],
            '点赞':index['like'],}
      print(dit)
      csv_writer.writerow(dit)
#保存数据
#批量采集数据
#paginaion_str    第一页为空,后续一样
#wts:时间戳可以通过time模块获取当前时间戳
#w_rid:加密参数·
    NextPage = json_dumps['data']['cursor']['pagination_reply']['next_offset']
    return NextPage
    #发送请求
    #cookie 用户信息,常用于检测是否有登录账号
    #user-agent 用户代理,表述浏览器用户身份信息
    f = open(file = 'data.csv',mode = 'w',encoding = 'utf-8',newline = '')
    #字典写入方法
    csv_writer = csv.DictWriter(f,fieldnames = ['昵称','性别','地区','评论','点赞'])
    #
    csv_writer.writeheader()
    NextPage = '""'
    for page in range(1,21):
            print(f'正在采集第页的数据内容')
            NextPage =GetContent(NextPage = NextPage)

FishC 发表于 2025-3-7 22:13:35

根据您提供的代码,有几个地方可能导致无法获取数据。以下是一些需要检查的关键点:

1. 确保API接口正确无误
[*]确认使用的API接口 `https://api.bilibili.com/x/v2/reply/wbi/main` 是有效并且支持获取评论数据。
[*]确保参数格式和值与B站公开API文档的要求一致。

2. 检查请求参数
[*]确保 `oid` 和 `type` 参数正确,为当前视频和评论类型。
[*]参数 `pagination_str` 的生成,应正确进行偏移计算以分页获取数据。

3. 处理请求返回的数据
- 您设定的 `replies = json_data`,示例代码中并未索引到具体的评论数据。
- 根据B站API,通常需要进一步从响应数据中找到评论列表,通常是类似 `data['replies']` 的条目。

4. 初始化与写入CSV的问题
- csv.DictWriter 缺少 fieldnames 初始化字段名称。

这里是您可能需要补充的一个代码片段示例:

# 初始化CSV字段
fieldnames = ['昵称', '性别', '地区', '评论', '点赞']
csv_writer = csv.DictWriter(f, fieldnames=fieldnames)
csv_writer.writeheader()

# 解析数据时获取具体内容
replies = json_data.get('data', {}).get('replies', [])
for index in replies:
    ctime = index.get('ctime', 0)
    date = str(datetime.fromtimestamp(ctime))
    dit = {
      '昵称': index.get('member', {}).get('uname', ''),
      '性别': index.get('member', {}).get('sex', ''),
      '地区': index.get('member', {}).get('region', '').replace('IP属地', ''),
      '评论': index.get('content', {}).get('message', ''),
      '点赞': index.get('like', 0),
    }
    print(dit)
    csv_writer.writerow(dit)

务必仔细检查和验证以上步骤,以确保数据请求和处理与API的返回结构一致。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: python爬虫爬取b站视频评论 为什么最后没有数据?