Python爬虫之Js逆向案例(16)- xx商品评论&店铺详情案例

2023-11-11

一次运行程序,同时获取一下内容:

1. 获取商店详情;
2. 获取当前商品评论;
3. 获取商品的问题、答案;

效果如下图:在这里插入图片描述

下面会进行以下几步进行分析(下方演示过程全部使用chrome浏览器);

1.抓包找到对应接口

商店详情https://item-soa.jd.com/getWareBusiness?skuId=
商品评价https://club.jd.com/comment/skuProductPageComments.action
商品相关问题https://question.jd.com/question/getQuestionAnswerList.action
问题的回答https://question.jd.com/question/getAnswerListById.action

2.编写全局控制参数到配置文件

在这里插入图片描述

3.爬虫编写

3.1 店铺详情

def get_shop_info(p_id, max_page):

    q_url = shop_info_base_url + p_id
    res = requests.get(q_url, headers=headers, cookies=cookies).json()
    if res.get("shopInfo") == None:
        return

    shop = res.get("shopInfo").get("shop")
    if shop is None:
        # 没有店铺评分的店,测试下来发现是封掉的店
        return

    shop['wname'] = res.get('wareInfo').get("wname")
    saveDataTool.save_shop_info(p_id, shop)
    get_comments(p_id, max_page)
    get_questions(p_id, max_page)

3.2 商品评论

def get_comments(p_id, max_page):

    print('准备--获取店铺ID为<%s>的评价数据...' % (p_id))
    index = 0
    while True:
        try:
            print('准备--开始获取第%d页...' % (index + 1))
            params.update({'productId': p_id})
            res = requests.get(comment_base_url,
                               headers=headers,
                               cookies=cookies,
                               params=params).json()

            maxPage = res.get('maxPage')

            if len(res.get("comments", [])) > 0:
                saveDataTool.save_comment(p_id, res)
            else:
                print("结束--没有评论内容了,猜测已经是最后一页了...")
                break

            # 只要达到了最大页码条数,无论后面还有没有下一页,当前店铺的评论到此为止
            if max_page > 0 and max_page <= index + 1:
                print("正常终止--<%s>的第%d页触发了限定最大页码数..." % (p_id, index + 1))
                break
            if index >= maxPage - 1:
                print("结束--<%s>的第%d页已是最后一页..." % (p_id, index + 1))
                break
            else:
                index += 1
                params.update({
                    'page': index,
                })
                sleep = random.randint(config['random_start'],
                                       config['random_end'])
                print('开始休眠:%d秒...' % (sleep))
                time.sleep(sleep)  # 下次请求之前随机暂停几秒,防止被封号

        except Exception as err:
            logsTool.log_to_save(id, index, err)
            break

3.3 商品问题

def get_questions(p_id, max_page):
    print('准备--获取店铺ID为<%s>的问题列表数据...' % (p_id))
    index = 1
    while True:
        try:
            print('准备--开始获取问题列表第%d页...' % (index))
            quesiton_params.update({'productId': p_id})
            res = requests.get(question_base_url,
                               headers=headers,
                               cookies=cookies,
                               params=quesiton_params).json()

            totalPage = math.ceil(res.get("totalItem", 0) / 10)
            questionList = res.get("questionList", [])

            if len(questionList) > 0:
                saveDataTool.save_question(p_id, res)
                for question in questionList:
                    answerCount = question.get("answerCount", 0)
                    tempId = question.get('id')
                    # 直接保存
                    if answerCount > 0 and answerCount <= 2:
                        saveDataTool.save_answer(
                            p_id, tempId, question.get('answerList', []))
                    elif answerCount > 2:
                        get_answer(p_id, tempId, max_page)
                    else:
                        continue

            if index >= totalPage:
                print("结束--问题列表<%s>的第%d页已是最后一页..." % (p_id, index))
                break

            # 只要达到了最大页码条数,无论后面还有没有下一页,当前店铺的评论到此为止
            if max_page > 0 and max_page <= index:
                print("正常终止--问题列表<%s>的第%d页触发了限定最大页码数..." % (p_id, index))
                break

            index += 1
            quesiton_params.update({
                'page': index,
            })
            sleep = random.randint(config['random_start'],
                                   config['random_end'])
            print('开始休眠:%d秒...' % (sleep))
            time.sleep(sleep)  # 下次请求之前随机暂停几秒,防止被封号

        except Exception as err:
            logsTool.log_to_save(p_id, index, err)
            break

3.4 问题答案

# 问题;p_id:product_id、 q_id:问题id
def get_answer(p_id, q_id, max_page):

    print('准备--获取问题ID为<%s>的答案列表数据...' % (q_id))
    index = 1
    while True:
        try:
            print('准备--开始获取第%d页answer...' % (index))
            answer_params.update({'questionId': q_id})
            res = requests.get(answer_base_url,
                               headers=headers,
                               cookies=cookies,
                               params=answer_params).json()

            answers = res.get("answers", [])
            if len(answers) > 0:
                saveDataTool.save_answer(p_id, q_id, answers)

            if res.get("moreCount", 0) < 0:
                print("结束--<%s>的answer的第%d页已是最后一页..." % (q_id, index))
                break

            # 只要达到了最大页码条数,无论后面还有没有下一页,当前店铺的评论到此为止
            if max_page > 0 and max_page <= index:
                print("正常终止--<%s>的第%d页触发了限定最大页码数..." % (q_id, index))
                break

            index += 1
            answer_params.update({
                'page': index,
            })
            sleep = random.randint(config['random_start'],
                                   config['random_end'])
            print('开始休眠:%d秒...' % (sleep))
            time.sleep(sleep)  # 下次请求之前随机暂停几秒,防止被封号

        except Exception as err:
            logsTool.log_to_save(q_id, index, err)
            break


4.CSV

在这里插入图片描述

总结:程序一键运行,过程中错误中断自动保存日志到log文件,方便后续分析!但是现在没有添加多线程,大数据量采集数据的话,单线程运行可能需要很久,本案例只是自己纯学习练习使用!源码已同步到知识星 球!

下期预告:使用scrapy爬虫框架完成上述功能!


后期会持续分享爬虫案例-100例,不想自己造轮子的同学可加入我的知识星球,有更多技巧、案例注意事项、案例坑点终结、答疑提问特权等你哦!!!

欢迎加入「python、爬虫、逆向Club」知识星球

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python爬虫之Js逆向案例(16)- xx商品评论&店铺详情案例 的相关文章

随机推荐

  • 数据分析入门-SARIMA模型案例分析(超详细)

    由于代码中注释已经非常的清晰 文章中就不过多叙述了 直接上代码 代码如下 在开始之前先导入所需要的包 import warnings do not disturbe mode warnings filterwarnings ignore i
  • 9.9+9.14字节三轮面试手撕代码记录

    一 根据字符出现的频率重新排列字符串 如 happy gt pphap import java util Scanner import java util Map import java util HashMap import java u
  • 电感升压(boost电路)感性理解

    目录 前言 一 电感升压基本原理 二 工作原理步骤 1 开关闭合 给电感和电容充电 电容获得输入电压 2 开关断开 电感继续给电容充能 电容获得更高电压 总结 前言 以前在消费类小家电方案中 经常用到电感升压的应用 一个很典型的应用是手持小
  • sh脚本报错“eval: line 1: syntax error: unterminated quoted string”

    有个之前一直正常运行的脚本 突然报错了 eval line 1 syntax error unterminated quoted string 提示也比较直接eval使用出的问题 过滤一下脚本内容 果然找到了一个疑似问题代码 eval ec
  • 切割列表[]

    import sys def sliceABC sequence start 0 K len sequence if start gt K print 切割数量超出范围 sys exit return sequence start K se
  • Kaplan-Meier生存曲线绘制

    Kaplan Meier生存曲线绘制 生存分析研究的是某个事件发生之前过去的时间 在临床研究中最常见的应用就是死亡率的估计 预测患者的生存时间 不过生存分析也可以应用于其他领域如机械故障时间等 在R中 survival包中有很多函数可以对生
  • 定根最小树形图 朱刘算法 luogu P4716

    https www luogu org problem P4716 include
  • python混淆矩阵实证分析_如何在Python中编写混淆矩阵?

    I wrote a confusion matrix calculation code in Python def conf mat prob arr input arr confusion matrix conf arr 0 0 0 0
  • Google Colab 读取/存储 云盘内的文件

    背景 Google Colaboratory是谷歌开放的一款研究工具 主要用于机器学习的开发和研究 这款工具让广大的AI开发者可以使用免费的GPU 在训练模型时 使用GPU自然速度飞快 那么训练完之后最重要的自然就是将训练出来的模板数据保存
  • 华为再发新版鸿蒙OS系统!新增超级终端功能:可媲美iOS系统

    此文章转自乐字节 一生万物 万物归一 这不是哪部武侠小说的招式 也不是哪部哲学作品的思想 它是华为鸿蒙系统的设计理念 化简为繁 精妙绝伦 相信大家都知道 自从华为推送了鸿蒙OS手机Bate版本系统以后 不少参与鸿蒙系统内测用户便纷纷反馈 在
  • XCTF:NewsCenter

    题目如下 因为有输入框 我习惯初步判断它为sql注入 1 测试是否存在注入点 输入 1 结果报错了 然后尝试 1 2 知道存在注入 且为字符型注入 然后进行字段数猜测 直到字段数为4开始报错 3 尝试获得显示位 4 查库名 5 查表名 6
  • Python计算出给定的时间段的具体日期列表-大全

    由于工作中经常用到关于用户自定义时间 来进行后台数据的查询 特意整理了一下工作中常用的到的关于时间列表的一个函数 可以计算出某一年中的具体哪个周的开始和结束日期 某个周的具体日期列表 2015年38周 自定义时间段的具体日期列表 20150
  • 华为OD机试真题-找出两个整数数组中同时出现的整数-2023年OD统一考试(B卷)

    题目描述 现有两个整数数组 需要你找出两个数组中同时出现的整数 并按照如下要求输出 1 有同时出现的整数时 先按照同时出现次数 整数在两个数组中都出现并且出现次数较少的那个 进行归类 然后按照出现次数从小到大依次按行输出 2 没有同时出现的
  • 基于人工大猩猩部队优化CNN-LSTM(GTO-CNN-LSTM)多变量时间序列预测(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码实现 1 概述 专家学者根据对人类视觉的研究 提出了注意力
  • win7虚拟图形服务器,ZNetCManager win7版

    ZNetCManager是一款虚拟串口服务器软件 它可以在你的电脑上构建出多个虚拟串口 不过功能和真实串口是一样的 你可以通过软件将数据传输到局域网内其他的串口设备上 让您即便是没有串口 也能对串口进行通信 ZNetCManager功能介绍
  • termius设置中文 v7.0.1附使用教程

    提起Windows平台远程终端 XShell的大名想必不用多说了 但它也只有Windows版本 携带非常不方便 为此小编今日要推荐的是termius全平台的远程终端 该软件不仅涵盖了Windows Linux OSX 还支持Android和
  • 几种存segmentation mask方法对比

    发现同一幅图的原图 jpg 1920 1080 1920 times 1080 1920 1080 才 155K 其用 npy 存的 segmentation mask 居然有 2M 按理 segmentation mask 只有一个通道
  • 安装npm后,nrm ls 报错internal/validators.js:124 throw new ERR_INVALID_ARG_TYPE(name, ‘string‘, value)

    报错截图 1 首先检查node js是否安装成功 输入 node v 若可查看版本号 如图所示即安装成功 若不一致则重新安装node js node js官方下载地址 https nodejs org en download 2 查看npm
  • Selector和Epoll区别

    Selector和Epoll区别 select原理 原理还是轮询所有文件描述符 将文件描述符集合fd set从用户空间拷贝到内核空间 进入内核态 遍历所有文件描述符 对每个文件描述符调用poll 该函数返回一组标准的掩码 其各个位指示相应的
  • Python爬虫之Js逆向案例(16)- xx商品评论&店铺详情案例

    一次运行程序 同时获取一下内容 1 获取商店详情 2 获取当前商品评论 3 获取商品的问题 答案 效果如下图 下面会进行以下几步进行分析 下方演示过程全部使用chrome浏览器 1 抓包找到对应接口 商店详情https item soa j