前言
本文是该专栏的第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)