测试标题1111

 前言

本文是该专栏的第68篇,后面会持续分享python爬虫干货知识,记得关注。

在本专栏之前,笔者有详细介绍京东滑块验证码的解决方法,感兴趣的同学,可以直接翻阅文章《Python如何解决“京东滑块验证码”(5)》进行查看。

而本文,笔者以京东商品详情页的评论数据为例,通过python实现采集商品详情页的评论数据。

废话不多说,具体细节部分以及详细思路逻辑,笔者将在正文结合完整代码进行详细说明。(附带完整代码)

正文

地址:aHR0cHM6Ly9hcGkubS5qZC5jb20v

目标:采集商品详情页的评论数据


1. 场景介绍

如上图所示,打开链接进入到商品详情页里面,我们直接选择商品评价。而我们要的数据,就是商品评价里面,用户的评论数据。

接下来,我们直接按住F12或者Ctrl+Shift+I组合键,启动浏览器(注意:笔者这里用的google浏览器)的开发者工具。


2. 请求方式以及参数分析

在目标页面中,通过快捷键启动浏览器的开发者工具之后,我们直接选择并点击页面底部的翻页按钮,并观察控制台的刷新数据情况。接下来,你会看到如下图所示的情况:

在network下面的fetch/xhr下面,会看到appid的地址信息。我们直接点击该信息,并查看其payload以及preview信息,会基本确定该地址就是我们要的目标数据。

我们先看下其参数部分,如下所示:

经过对比几页数据之后,会发现除了page以及t,其它值设定为定值即可。而这里的page和t:

page:表示页数;

t:表示13位数的当前时间戳

需要注意的是,这里的productId是商品ID。换言之,后续可以通过更换productId值,再采集其它商品的评论数据。


3. 测试代码

经过上面的对比分析之后,我们直接尝试一波测试代码的操作,测试代码示例如下所示:

import requests
from urllib.parse import urlencode
import timedef spider():start_url = 'https://api.m.jd.com/?'params = {"appid": "item-v3","functionId": "pc_club_productPageComments","client": "pc","clientVersion": "1.0.0","t": int(round(time.time()) * 1000),"loginType": 3,"uuid": "181111935.594086723.1700146723.1702094977.1713083334.3","productId": 100021510646,"score": 0,"sortType": 5,"page": 0,"pageSize": 10,"isShadowSku": 0,"rid": 0,"fold": 1,"bbtf": 1,"shield": "",}url = start_url + urlencode(params)headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36","Content-Type": "application/json;charset=gbk","Accept": "application/json, text/javascript, */*; q=0.01"}res = requests.get(url, headers=headers)if res.status_code == 200:print(res.text)else:print(res.status_code)if __name__ == '__main__':spider()

成功运行上述代码之后,会看到如下图所示的输出结果:

出现上面的结果之后,接下来的操作,我们只需要增加一个数据解析以及数据保存的代码功能即可。


4. 完整代码

通过上面的测试代码,基本可以明确了采集思路。而我们只需要在测试代码的基础上,增加数据解析以及数据保存的功能就行。

完整代码如下:

import requests
from urllib.parse import urlencode
import time
import json
import pandas as pd
import timedef spider(page, productId):''':param page:    页数:param productId:  商品ID:return:'''start_url = 'https://api.m.jd.com/?'params = {"appid": "item-v3","functionId": "pc_club_productPageComments","client": "pc","clientVersion": "1.0.0","t": int(round(time.time()) * 1000),"loginType": 3,"uuid": "181111935.594086723.1700146723.1702094977.1713083334.3",# 商品ID"productId": productId,"score": 0,"sortType": 5,"page": page,"pageSize": 10,"isShadowSku": 0,"rid": 0,"fold": 1,"bbtf": 1,"shield": "",}url = start_url + urlencode(params)headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36","Content-Type": "application/json;charset=gbk","Accept": "application/json, text/javascript, */*; q=0.01",# cookie可选择性# cookie: 你的cookie}res = requests.get(url, headers=headers)if res.status_code == 200:result = json.loads(res.text)tg = result['comments']nickname = []content = []creationTime = []productColor = []referenceName = []score = []status = []for i in tg:# 昵称nickname.append(i['nickname'] if i['nickname'] else '')# 内容content.append(i['content'] if i['content'] else '')# 评论时间creationTime.append(i['creationTime'] if i['creationTime'] else '')# 产品skuproductColor.append(i['productColor'] if i['productColor'] else '')# 产品标题referenceName.append(i['referenceName'] if i['referenceName'] else '')# 评价星级score.append(i['score'] if i['score'] else '')# 评价类型if i['score'] == 5:status.append('好评')elif i['score'] == 3:status.append('中评')elif i['score'] == 1:status.append('差评')# 保存数据data = {'商品ID': [str(productId) for i in nickname],'用户昵称': nickname,'评价内容': content,'评论时间': creationTime,'产品sku': productColor,'产品标题': referenceName,'评价星级': score,'评价类型': status}df = pd.DataFrame(data, columns=['商品ID', '用户昵称', '评价内容', '评论时间', '产品sku', '产品标题', '评价星级', '评价类型'])df.to_csv('京东商品评论数据.csv', mode='a', encoding='utf_8_sig', index=False)else:print(res.status_code)if __name__ == '__main__':# 设置采集的页数pages = 10# 商品IDproductId = 100021510646for page in range(pages):print('当前开始采集 %d 页' % (page + 1))spider(page, productId)time.sleep(2)df2 = pd.read_csv(r'京东商品评论数据.csv')df3 = df2.loc[~df2['商品ID'].isin(['商品ID'])]df3.to_csv(r'京东商品评论数据.csv', encoding='utf_8_sig', index=False)print('采集完成!')

成功运行上述代码,会在本地自动生成一个“京东商品评论数据”的csv文件,打开文件如下所示:

最后,笔者这里需要补充的几点:

1. 笔者这里仅以单个商品ID为例,如果你需要批量采集多个商品ID的评论数据,可以创建一个任务队列或者list,将商品ID存入进去,再让程序对任务队列或者list进行循环采集即可;

2. 为了避免平台的封控,可以考虑将cookie加入到请求头中;

3. 如果有IP代理的话,最好加入代理IP进行采集,以此保证程序的稳定性;

4. 每次采集的时候,尽量避免频率过快,进行翻页的时候可以增加一个时间缓存等待,防止平台触发封控。

如果还想了解爬虫的更多知识,后面我会持续分享,记得收藏并点赞,后面的python干货在等着你。

如果喜欢本文或者本文对你有帮助的话,记得收藏并点个赞,有问题和需求欢迎留言私信

Python如何解决“滑动拼图”验证码(8)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/19650.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

JDK8-17新特性

1.Java8新特性-Lambda表达式 2.1关于Java8新特性简介 Java 8是Java编程语言的一个重大版本更新,于2014年3月发布。它引入了许多新特性和改进,使得Java编程更加方便和高效。 下面是Java 8的主要新特性: Lambda表达式:Lambda表达式…

如何确保Python爬虫程序的稳定性和安全性?

在当今数字化时代,Python爬虫被广泛应用于数据采集和信息抓取。然而,确保爬虫程序的稳定性和安全性是开发过程中的重要考虑因素。本文将探讨如何通过技术手段和最佳实践来提高Python爬虫的稳定性和安全性,并提供代码示例。 稳定性保障 1. 异…

Axure二级菜单下拉交互实例

1.使用boxlabe进行基础布局 2.设置鼠标悬浮和选中状态 3.转换为动态面板 选中所有二级菜单,进行按钮组转换 选中所有二级菜单,进行动态面板转换 4.给用户管理增加显示/隐藏事件 1)选择toggle代表上拉和下拉切换加载 2)勾选Bring to Front,并选择Push/Pull Widgets代表收缩时…

基于智能推荐的图书电商系统的设计与实现

💗博主介绍💗:✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示:文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…

JavaScript实现Promise

第一步:编写constructor构造方法 const PENDING pending; const FULFILLED fulfilled; const REJECTED rejected;class MyPromise {#state PENDING;#result undefined;constructor(executor) {const resolve (data) > {this.#changeState(FULFILLED, data…

物理 + 人工智能 = 2024年诺贝尔物理学奖

💓 博客主页:倔强的石头的CSDN主页 📝Gitee主页:倔强的石头的gitee主页 ⏩ 文章专栏:《热点时事》 期待您的关注 目录 引言 一、机器学习与神经网络的发展前景 二、机器学习和神经网络的研究与传统物理学的关系 结…

C++:异常

1. 异常的概念 C语言主要通过错误码的方式处理错误,错误码本质上就是对错误信息进行分类编号,拿到错误码以后还要去查询错误信息,比较麻烦。异常时抛出一个对象,这个对象可以涵盖更全面的信息。 异常处理机制允许程序中独立开发的…

南京邮电大学算法设计-二叉树先序遍历算法动态演示

二叉树先序遍历算法动态演示 一、课题内容和要求 (1)实验目的: 本实验通过手动输入二叉树结点信息,构建相应的二叉树,并通过图形化界面动态演示先序遍历算法的过程。通过本次实验,我可以深入理解二叉树的数据结构、先序遍历算法…

【开源免费】基于Vue和SpringBoot的在线考试系统(附论文)

本文项目编号 T 624 ,文末自助获取源码 \color{red}{T624,文末自助获取源码} T624,文末自助获取源码 网络的广泛应用给生活带来了十分的便利。所以把在线考试管理与现在网络相结合,利用java技术建设在线考试系统,实现…

高阶C语言之六:程序环境和预处理

本文介绍程序的环境,在Linux下对编译链接理解,较为简短,着重在于编译的步骤。 C的环境 在ANSI C(标准C语言)的任何一种实现中,存在两个不同的环境。 翻译环境:在这个环境中,源代码…

HarmonyOs鸿蒙开发实战(10)=>状态管理-对象数组的属性数据变更刷新UI,基于@Observed 和@ObjectLink装饰器

1.条件:基于HarmonyOs5.0.0版本. 2.功能要求:横向列表中每个景点的名称(eg: 第二项 “灵隐寺” ), 在通过天气接口拿到对应天气后,拼接到名称后面 > 变成(“灵隐寺” 天气)) 3.老规矩先看…

快速上手Mybatis Plus并速通MybatisPlus所有知识点

目录 一、简介 1.1 概况 1.2 特性 二、快速入门 1.建表 2.引依赖 3.application.ymal文件 4.定义mapper继承BaseMapper 5.总结 三、Mybatis Plus的使用 1.常见注解 1.1 TableName 1.2 TableId 1.3 TableField 2.常见配置 3.BaseMapper的基础CRUD方法 4.Wrapper…

使用代理解决前端跨域问题详解

目录 前言1. 什么是跨域问题?1.1 同源策略的定义1.2 跨域问题的表现 2. 解决跨域问题的常见方法3. 在 Vite 中配置代理解决跨域问题3.1 环境准备3.2 配置代理3.2.1 配置基础路径3.2.2 配置 Vite 代理3.2.3 参数解释 3.3 验证代理功能 4. 深入分析与注意事项4.1 代理…

使用MaxKB搭建知识库问答系统并接入个人网站(halo)

首发地址(欢迎大家访问):使用MaxKB搭建知识库问答系统并接入个人网站 前言 从OpenAI推出ChatGPT到现在,大模型已经渗透到各行各业,大模型也逐渐趋于平民化;从最开始对其理解、生成、强大的知识积累的惊叹&…

查看台式机主机支持的最大分辨率 | 显卡和显示器

通过检查显卡规格和型号,确认主机支持最大分辨率。 方法1:设置 在设置 -> 系统 -> 屏幕 及其内的高级显示设置 设置 -> 显示 方法2:cmd 在运行中输入“devmgmt.msc”,进入设备管理器界面,点击展开“显示适配…

若依权限控制

springbootvue2项目中的权限控制(若依项目) 步骤: 1.登录管理员账号,为普通用户增加权限按钮 绿色部分为权限控制字符 2.在后端对应的方法上增加权限控制(这里以删除操作为例):PreAuthorize(“ss.hasPermi(‘area:store:remove’)”) 3.在前端对应的按钮上增加权限控制:v-ha…

5G的SUCI、SUPI、5G-GUTI使用场景及关系

使用场景(来源于对23.501、23.502、33.501、23.003的理解) 1、UE初始注册时,根据HN Public Key把SUPI加密成SUCI,并发送初始注册请求 2、AMF转发SUCI给AUSF和UDM进行认证,并获取解密后的SUPI 3、AMF根据SUPI生成一个5G-GUTI,并保…

本地部署 excalidraw

本地部署 excalidraw 0. 引言1. 本地部署 excalidraw2. 访问 excalidraw 0. 引言 Excalidraw 编辑器是一款开源虚拟手绘白板,支持协作且端到端加密。 1. 本地部署 excalidraw git clone https://github.com/excalidraw/excalidraw.git; cd excalidrawvi docker-c…

企业数字化转型的战略指南:物联网与微服务架构的深度融合及应用解析

新时代下的企业数字化转型挑战与机遇 在当前全球经济和技术迅猛发展的背景下,企业数字化转型成为保持竞争力和创新的关键战略。物联网(IoT) 的兴起为企业提供了无数新的数据来源和运营模式,然而,如何有效整合这些数据…

vue3+vant实现弹幕循环播放~

1、效果图 <!-- 弹幕 --> <div style"height: 88px"><van-barragev-model"list"duration"5000":rows"rows":gap"gap":loop"loop"style"--move-distance: -345px" ><div class&quo…