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商品评论&店铺详情案例 的相关文章

  • 使用Python开发Web应用程序

    我一直在用 python 做一些工作 但这都是针对独立应用程序的 我很想知道 python 的任何分支是否支持 Web 开发 有人还会建议一个好的教程或网站吗 我可以从中学习一些使用 python 进行 Web 开发的基础知识 既然大家都说
  • InterfaceError:连接已关闭(使用 django + celery + Scrapy)

    当我在 Celery 任务中使用 Scrapy 解析函数 有时可能需要 10 分钟 时 我得到了这个信息 我用 姜戈 1 6 5 django celery 3 1 16 芹菜 3 1 16 psycopg2 2 5 5 我也使用了psyc
  • Python PAM 模块的安全问题?

    我有兴趣编写一个 PAM 模块 该模块将利用流行的 Unix 登录身份验证机制 我过去的大部分编程经验都是使用 Python 进行的 并且我正在交互的系统已经有一个 Python API 我用谷歌搜索发现pam python http pa
  • 使用 openCV 对图像中的子图像进行通用检测

    免责声明 我是计算机视觉菜鸟 我看过很多关于如何在较大图像中查找特定子图像的堆栈溢出帖子 我的用例有点不同 因为我不希望它是具体的 而且我不确定如何做到这一点 如果可能的话 但我感觉应该如此 我有大量图像数据集 有时 其中一些图像是数据集的
  • 导入错误:没有名为 _ssl 的模块

    带 Python 2 7 的 Ubuntu Maverick 我不知道如何解决以下导入错误 gt gt gt import ssl Traceback most recent call last File
  • 如何在 Sublime Text 2 的 OSX 终端中显示构建结果

    我刚刚从 TextMate 切换到 Sublime Text 2 我非常喜欢它 让我困扰的一件事是默认的构建结果显示在 ST2 的底部 我的程序产生一些很长的结果 显示它的理想方式 如在 TM2 中 是并排查看它们 如何在 Mac 操作系统
  • 为 pandas 数据透视表中的每个值列定义 aggfunc

    试图生成具有多个 值 列的数据透视表 我知道我可以使用 aggfunc 按照我想要的方式聚合值 但是如果我不想对两列求和或求平均值 而是想要一列的总和 同时求另一列的平均值 该怎么办 那么使用 pandas 可以做到这一点吗 df pd D
  • 在循环中每次迭代开始时将变量重新分配给原始值(在循环之前定义)

    在Python中 你使用 在每次迭代开始时将变量重新分配给原始值 在循环之前定义 时 也就是说 original 1D o o o for i in range 0 3 new original 1D revert back to orig
  • 运行多个 scrapy 蜘蛛的正确方法

    我只是尝试使用在同一进程中运行多个蜘蛛新的 scrapy 文档 http doc scrapy org en 1 0 topics practices html但我得到 AttributeError CrawlerProcess objec
  • 在 NumPy 中获取 ndarray 的索引和值

    我有一个 ndarrayA任意维数N 我想创建一个数组B元组 数组或列表 其中第一个N每个元组中的元素是索引 最后一个元素是该索引的值A 例如 A array 1 2 3 4 5 6 Then B 0 0 1 0 1 2 0 2 3 1 0
  • 使用 Pycharm 在 Windows 下启动应用程序时出现 UnicodeDecodeError

    问题是当我尝试启动应用程序 app py 时 我收到以下错误 UnicodeDecodeError utf 8 编解码器无法解码位置 5 中的字节 0xb3 起始字节无效 整个文件app py coding utf 8 from flask
  • 表达式中的 Python 'in' 关键字与 for 循环中的比较 [重复]

    这个问题在这里已经有答案了 我明白什么是in运算符在此代码中执行的操作 some list 1 2 3 4 5 print 2 in some list 我也明白i将采用此代码中列表的每个值 for i in 1 2 3 4 5 print
  • Numpy 优化

    我有一个根据条件分配值的函数 我的数据集大小通常在 30 50k 范围内 我不确定这是否是使用 numpy 的正确方法 但是当数字超过 5k 时 它会变得非常慢 有没有更好的方法让它更快 import numpy as np N 5000
  • Python 3 中“map”类型的对象没有 len()

    我在使用 Python 3 时遇到问题 我得到了 Python 2 7 代码 目前我正在尝试更新它 我收到错误 类型错误 map 类型的对象没有 len 在这部分 str len seed candidates 在我像这样初始化它之前 se
  • 从 pygame 获取 numpy 数组

    我想通过 python 访问我的网络摄像头 不幸的是 由于网络摄像头的原因 openCV 无法工作 Pygame camera 使用以下代码就像魅力一样 from pygame import camera display camera in
  • 如何在 Django 中使用并发进程记录到单个文件而不使用独占锁

    给定一个在多个服务器上同时执行的 Django 应用程序 该应用程序如何记录到单个共享日志文件 在网络共享中 而不保持该文件以独占模式永久打开 当您想要利用日志流时 这种情况适用于 Windows Azure 网站上托管的 Django 应
  • glpk.LPX 向后兼容性?

    较新版本的glpk没有LPXapi 旧包需要它 我如何使用旧包 例如COBRA http opencobra sourceforge net openCOBRA Welcome html 与较新版本的glpk 注意COBRA适用于 MATL
  • 从 Python 中的类元信息对 __init__ 函数进行类型提示

    我想做的是复制什么SQLAlchemy确实 以其DeclarativeMeta班级 有了这段代码 from sqlalchemy import Column Integer String from sqlalchemy ext declar
  • Python:元类属性有时会覆盖类属性?

    下面代码的结果让我感到困惑 class MyClass type property def a self return 1 class MyObject object metaclass MyClass a 2 print MyObject
  • 改变字典的哈希函数

    按照此question https stackoverflow com questions 37100390 towards understanding dictionaries 我们知道两个不同的字典 dict 1 and dict 2例

随机推荐

  • 数据分析入门-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