IT入门小白 2024-03-31 15:45 采纳率: 30.8%
浏览 10

但是生成的文件里面内容为空,即没有获取到评论数据,如何解决?(标签-爬虫|关键词-正常运行)

使用爬虫获取的内容为空
源程序代码如下:

# 导包
import requests
import time
import random

# 获取评论
def get_content(page):
    # 目标网址
    url = 'https://club.jd.com/comment/productPageComments.action'
    # 参数
    params = {
        'productId': product_id,
        'score': 0,
        'sortType': 5,
        'page': page,
        'pageSize': 10,
        'isShadowSku': 0,
        'fold': 1
    }
    # 请求头
    headers = {
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.35 Safari/537.36',
        'cookie':'__jdu=16589701614111380507873; shshshfpa=4daabca1-903d-22ab-baf8-97de678e14b1-1665804114; shshshfpb=opwrgFhIfEq3uLkjOVzijtQ; areaId=27; unpl=JF8EALRnNSttWB9SBBsHGEZCSg0HW1wIH0cDZjVQU19cT1FQSAMdRhl7XlVdXhRLFx9uYBRXXlNJVA4ZBysSEXtdVV9fD0oeBm5vNWRcNks6cmQDZnBMSlxRNiE4SBczblcFU1lRQ1IEGwUbFxBLXVZXXAxKEQppZTVVbVhDUDUrMh4SEUpcXFlcD0onAl9lBFVYXEpTBBgFK1l-ShBUWVkBQxECb2AFUV1YS1YMGgYaFBlNX2RfbQs; __jdv=76161171|www.baidu.com|t_1003608409_|tuiguang|1e70142ec0ab401ea18cd63554db07e8|1667745095451; __jda=122270672.16589701614111380507873.1658970161.1667719720.1667745095.7; __jdc=122270672; jsavif=1; shshshfp=1075b1ee284c481ea605141bda519a56; token=99f32c7dafc446558ee3457c800615ba,2,926525; __tk=jpIxjze0JsA1jsBilUq1lcfTkUaxjDtxkcfTjDIxJijwkctwjphoJn,2,926525; ip_cityCode=2376; ipLoc-djd=27-2376-50232-53749; 3AB9D23F7A4B3C9B=EQ27JR2QLTE5R4TJCP4OICTNOVNYQZRPPKFT66XF32BQ3MXX2DSVKPDCEHSB2RQDRMGCGNPGC42YI7WAEXO6XEQ3HI; JSESSIONID=229855194FEAF8A1A0898F4D875A5667.s1; jwotest_product=99; shshshsID=c9d69e6764a3fcbe122cc5d8922262aa_4_1667745624837; __jdb=122270672.4.16589701614111380507873|7.1667745095',
        'referer': 'https://item.jd.com/'
    }
    # 发生请求并获取json数据
    resp = requests.get(url,params=params,headers=headers).json()
    # 获取评论内容并保存
    for comment in resp['comments']:
        # 将评论内容里的换行符剔除
        content = comment['content'].replace('\n','')
        print(content)
        f.flush()
        f.write(content)
        f.write('\n')
    print(f'============================第{page+1}页爬取完毕===============================')

if __name__ == '__main__':
    product_id = input('请输入商品的ID:')
    page_number = int(input('请输入要爬取的页数:'))
    with open(f'JD_comment_{product_id}.txt','a',encoding='utf-8')as f:
        for page in range(page_number):
            try:
                get_content(page)
                time.sleep(5+random.random())
            except:
                break
    print(f'爬虫程序已结束!评论内容请在同目录下的 JD_comment_{product_id}.txt 查看!')

程序可以正常运行,但是生成的文件里面内容为空,即没有获取到评论数据。
请问这是这么回事?请广大网友帮忙解答一下。

  • 写回答

5条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-03-31 15:45
    关注

    引自免费微信小程序:皆我百晓生

    问题描述中的代码主要执行了一个名为 get_content 的函数,其目的是从京东商城的商品页面(Product Page)上抓取并存储评论数据。以下是可能存在的问题及相应的解决方案:

    问题1:抓取的数据为空

    由于没有找到 content 字段对应的值,导致 get_content 函数返回一个空字符串列表,即使尝试了将页面编号(page_number)传入参数 params。以下是一种可能的原因:

    for comment in resp['comments']:
        content = comment['content']
        print(content)
        f.flush()
        f.write(content)
        f.write('\n')
    

    原因分析:

    • comment['content'] 没有被正确地解析为字典,可能是类型错误。
    • 如果页面参数 page_number 可能在请求中未包含,那么该字段为空,会导致 len(comment['comments']) 为0,进而无法遍历所有的评论元素。

    解决方案:

    • 首先,确保参数 page_number 是否正确地传递给 get_content 函数。检查页面编号是否出现在文档头部的URL ('https://club.jd.com/comment/productPageComments.action') 中,如果不是,则在获取评论之前先添加或确认 page_number 参数的存在。
    url = 'https://club.jd.com/comment/productPageComments.action' + str(page_number)  # Add page number to URL if it's not there
    
    for comment in resp['comments']:
        content = comment['content']
        print(content)
        f.flush()
        f.write(content)
        f.write('\n')
    

    替换步骤:

    • 在调用 get_content 函数时,添加 str(page_number) 到 URL 之后作为参数,例如:
    url = 'https://club.jd.com/comment/productPageComments.action' + str(page_number) + '?page=1'
    

    问题2:评论数据获取失败

    如果尝试将文章标题(comment['title'])或关键词(comment['keywords'])作为参数传递给 get_content 函数,并且在 for 循环遍历评论数据时出现了意外情况,比如获取不到相应评论,上述代码中可能出现的问题是:

    for comment in resp['comments']:
        title = comment['title']
        keywords = comment['keywords']
    
        print(title)
        f.flush()
        f.write(title)
        f.write('\n')
        f.write(keywords)
        f.write('\n')
    

    原因分析:

    • 代码中尚未处理 keyword 字段的值是否存在,因此无法正确解析 comment['keywords'] 这个字段的内容。
    • 如果 keyword 存在但未包含在提取的评论内,这时可能会抛出异常,导致 for 循环停止或错误终止。
    • 如果 keyword 不在文章标题或关键词列表中,这可能意味着网页只显示了相关产品详情而不包括评论信息,而不是基于用户评论进行筛选或展示。

    解决方案:

    • 使用 Python 的内置方法 try-except 来捕获可能的异常。首先,对 keyword 字段的值是否存在进行判断,如果不是关键词,跳过不打印:
    keyword = comment['keywords']
    if keyword is None or keyword.lower() not in ['review', 'feedback']:
        print(keyword)
    

    替换步骤:

    • 将原代码中 for comment in resp['comments']: 替换为 for comment in resp['comments'] if keyword is not None and keyword.lower() not in ['review', 'feedback']:,这样在 keyword 字段不存在或非关键词的情况下仍然执行循环体,从而保证在无标题或关键词的评论处打印并打印出对应的关键字。
    keyword = comment['keywords']
    if keyword is None or keyword.lower() not in ['review', 'feedback']:
        print(keyword)
    else:
        print(comment['title'])
        f.flush()
        f.write(comment['title'])
        f.write('\n')
        f.write(keyword)
        f.write('\n')
    

    注意:

    • 为了使这段修复后的代码具有更好的兼容性,建议对 keyword 字段值类型、是否应展示特定关键字以及如何筛选评论时,保持与网页文档一致的行为,并根据实际情况在外部代码中添加适当的注释和验证。此外,在实际开发中,为了防止访问敏感或私有的数据,我们通常会在使用此类请求接口前对页面进行预处理和权限控制,以确保符合相关的安全规范。
    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 3月31日