In [ ]:
# https://item.jd.com/100120884199.html
# https://curlconverter.com/
In [1]:
import requests
cookies = {
'__jdu': '1764370966',
'shshshfpa': 'b983081b-d500-95cf-ce75-af324f42da15-1687070914',
'shshshfpx': 'b983081b-d500-95cf-ce75-af324f42da15-1687070914',
'unpl': 'JF8EALBnNSttCx5WBhgKSUURHg1SW1QJSR5XbW4NBlgISVcNGVUYRUN7XlVdWBRLFx9vYRRUWFNIXQ4eBisSEXteXVdZDEsWC2tXVgQFDQ8VXURJQlZAFDNVCV9dSRZRZjJWBFtdT1xWSAYYRRMfDlAKDlhCR1FpMjVkXlh7VAQrAh0VFUlbVVZaD3sWM2hXNWRYXU1UBxsyGiIRex8AAlgASxIGbCoFUlpdSVIEEwUcIhF7Xg',
'__jdv': '76161171|baidu-pinzhuan|t_288551095_baidupinzhuan|cpc|0f3d30c8dba7459bb52f2eb5eba8ac7d_0_bd3229cf0da748038e389c4a3293f2fb|1731824925131',
'3AB9D23F7A4B3CSS': 'jdd032NJPJXNWFKZ3XKKBVI7UYTJ7DJTTVMG7KWXCA4BCXYP4JMNCMCX7VGQPR2TI7PTAUHSBL4QXPEIIPHDNQZEZKJF2CYAAAAMTHDHTZ7QAAAAAC3V5VRVEVSDVAIX',
'_gia_d': '1',
'areaId': '12',
'jsavif': '1',
'wlfstk_smdl': 'e8c1tgskdw8mfgc4qo6ol9lc22pectbq',
'TrackID': '1RqsviCt6hbj4naUJ4-2X1Xo8yfQKHyJEC5oddM2b4mnLsJCE5dEogde0oVODb8FsXQngu1f2q2fo9UcLsNMA91HNex9bW77j-qEGNRnOGW4gO3ZxqHsdOG2fwAWwjy-g',
'thor': 'A75180384C3DD978F135FA9A5BFE0B24F1412B129B96128317E07EE5E2F53441426FDAF2C39DD257C5E37A4BB9A89DDEC80C1CA85B18EF0F6D33BDC78B55B38723578D8775A09A2C9CDDC2EBF79C49B702BCA05704CDB8CD7C68B3052B968E0B66CAFA39C3DB93C6B89AA0847733AFE11323CE6AA6956006B716A1E15F86969C3FF84A6CCD8086AEFF71E4455C44E3CC10AE723D7D61CFFEEF9AE98466060965',
'light_key': 'AASBKE7rOxgWQziEhC_QY6ya7oCXdforERpniNIwfN9U2KSgVpNVKAgbS4Qk0SIZyRIqL2W9',
'pinId': '0DRQUAoQkuOE-51lGRDIcg',
'pin': 'jd_zwIdfRmYOAep',
'unick': '%E7%A7%8B%E5%B0%8F%E6%9E%AB%E6%B8%85',
'ceshi3.com': '000',
'_tp': 'B7r2tu8GDnnEKA6Eq%2FVibA%3D%3D',
'_pst': 'jd_zwIdfRmYOAep',
'3AB9D23F7A4B3C9B': '2NJPJXNWFKZ3XKKBVI7UYTJ7DJTTVMG7KWXCA4BCXYP4JMNCMCX7VGQPR2TI7PTAUHSBL4QXPEIIPHDNQZEZKJF2CY',
'__jda': '181111935.1764370966.1687070912.1728964615.1731824925.16',
'__jdc': '181111935',
'flash': '3_gGrStCyXUZZXKQ_mtYvc2OATndLdZHQZE6CeeogF8O48erkq84a1laOCcz6-13XcruhrgKiIrnmAvd7_qsnvYYaMeX1QFqwtuTz551mb-_86XyE57jCU6pPrXVv_tfWHOzjnS9KpY-L401dAdNMFMbxdZ71QPaDmjEexdUb7pX31esDG0fZn',
'ipLoc-djd': '12-978-980-36485',
'token': '12caf6e9fecb3f5cc3ae0ae1425a99cd,3,962124',
'__jdb': '181111935.6.1764370966|16.1731824925',
'shshshfpb': 'BApXSbNHYO_ZAdaYLJ0d7e3y8xkX0hGvPB8VGDjtq9xJ1MgeCSYO2',
}
headers = {
'accept': 'application/json, text/javascript, */*; q=0.01',
'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
'content-type': 'application/json;charset=gbk',
# 'cookie': '__jdu=1764370966; shshshfpa=b983081b-d500-95cf-ce75-af324f42da15-1687070914; shshshfpx=b983081b-d500-95cf-ce75-af324f42da15-1687070914; unpl=JF8EALBnNSttCx5WBhgKSUURHg1SW1QJSR5XbW4NBlgISVcNGVUYRUN7XlVdWBRLFx9vYRRUWFNIXQ4eBisSEXteXVdZDEsWC2tXVgQFDQ8VXURJQlZAFDNVCV9dSRZRZjJWBFtdT1xWSAYYRRMfDlAKDlhCR1FpMjVkXlh7VAQrAh0VFUlbVVZaD3sWM2hXNWRYXU1UBxsyGiIRex8AAlgASxIGbCoFUlpdSVIEEwUcIhF7Xg; __jdv=76161171|baidu-pinzhuan|t_288551095_baidupinzhuan|cpc|0f3d30c8dba7459bb52f2eb5eba8ac7d_0_bd3229cf0da748038e389c4a3293f2fb|1731824925131; 3AB9D23F7A4B3CSS=jdd032NJPJXNWFKZ3XKKBVI7UYTJ7DJTTVMG7KWXCA4BCXYP4JMNCMCX7VGQPR2TI7PTAUHSBL4QXPEIIPHDNQZEZKJF2CYAAAAMTHDHTZ7QAAAAAC3V5VRVEVSDVAIX; _gia_d=1; areaId=12; jsavif=1; wlfstk_smdl=e8c1tgskdw8mfgc4qo6ol9lc22pectbq; TrackID=1RqsviCt6hbj4naUJ4-2X1Xo8yfQKHyJEC5oddM2b4mnLsJCE5dEogde0oVODb8FsXQngu1f2q2fo9UcLsNMA91HNex9bW77j-qEGNRnOGW4gO3ZxqHsdOG2fwAWwjy-g; thor=A75180384C3DD978F135FA9A5BFE0B24F1412B129B96128317E07EE5E2F53441426FDAF2C39DD257C5E37A4BB9A89DDEC80C1CA85B18EF0F6D33BDC78B55B38723578D8775A09A2C9CDDC2EBF79C49B702BCA05704CDB8CD7C68B3052B968E0B66CAFA39C3DB93C6B89AA0847733AFE11323CE6AA6956006B716A1E15F86969C3FF84A6CCD8086AEFF71E4455C44E3CC10AE723D7D61CFFEEF9AE98466060965; light_key=AASBKE7rOxgWQziEhC_QY6ya7oCXdforERpniNIwfN9U2KSgVpNVKAgbS4Qk0SIZyRIqL2W9; pinId=0DRQUAoQkuOE-51lGRDIcg; pin=jd_zwIdfRmYOAep; unick=%E7%A7%8B%E5%B0%8F%E6%9E%AB%E6%B8%85; ceshi3.com=000; _tp=B7r2tu8GDnnEKA6Eq%2FVibA%3D%3D; _pst=jd_zwIdfRmYOAep; 3AB9D23F7A4B3C9B=2NJPJXNWFKZ3XKKBVI7UYTJ7DJTTVMG7KWXCA4BCXYP4JMNCMCX7VGQPR2TI7PTAUHSBL4QXPEIIPHDNQZEZKJF2CY; __jda=181111935.1764370966.1687070912.1728964615.1731824925.16; __jdc=181111935; flash=3_gGrStCyXUZZXKQ_mtYvc2OATndLdZHQZE6CeeogF8O48erkq84a1laOCcz6-13XcruhrgKiIrnmAvd7_qsnvYYaMeX1QFqwtuTz551mb-_86XyE57jCU6pPrXVv_tfWHOzjnS9KpY-L401dAdNMFMbxdZ71QPaDmjEexdUb7pX31esDG0fZn; ipLoc-djd=12-978-980-36485; token=12caf6e9fecb3f5cc3ae0ae1425a99cd,3,962124; __jdb=181111935.6.1764370966|16.1731824925; shshshfpb=BApXSbNHYO_ZAdaYLJ0d7e3y8xkX0hGvPB8VGDjtq9xJ1MgeCSYO2',
'origin': 'https://item.jd.com',
'priority': 'u=1, i',
'referer': 'https://item.jd.com/',
'sec-ch-ua': '"Not)A;Brand";v="99", "Microsoft Edge";v="127", "Chromium";v="127"',
'sec-ch-ua-mobile': '?0',
'sec-ch-ua-platform': '"Windows"',
'sec-fetch-dest': 'empty',
'sec-fetch-mode': 'cors',
'sec-fetch-site': 'same-site',
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36 Edg/127.0.0.0',
'x-referer-page': 'https://item.jd.com/100120884199.html',
'x-rp-client': 'h5_1.0.0',
}
params = {
'appid': 'item-v3',
'functionId': 'pc_club_productPageComments',
'client': 'pc',
'clientVersion': '1.0.0',
't': '1731824996510',
'body': '{"productId":100120884199,"score":0,"sortType":5,"page":0,"pageSize":10,"isShadowSku":0,"fold":1,"bbtf":"","shield":""}',
'h5st': '20241117142956514;ey58fffl4z91krr7;fb5df;tk03w9f831bd418njdHu6UTmmxHtG3Ulk5s2p6APKkeXSOBH20rr6N4vt-7c9a0n9ltFZ38aqgot0t6ZrVF3cegUvX1V;89dd5096298e274c22622c628771c386f03669a373bc4a936d70d3b792b6dc84;4.9;1731824996514;pjbMhjpd9nIg7jpjxjZf2iFjLrJp-j5e5i0R6HIN37FSFSld2HUSJrJdJrESJrpjh7Jf6rJdJz1TIipjLDrgJXYT7foe6Lof0rYfFGYdHaYdHmld1PoeHi1eJGYfyXlfJrJdJrEa-OFTGOEjLrJp-jpd7LodKiFf4j1T3bVf1jFfHSYTFqIeznYT5fIe2foeFipjxj5PKSEQKeFjLrJp-j5f9HIg3T0UG6VRFuWeDipjxjJOJrpjh7JjaWEWHGFZSimW7f0ZJrJdJ31QHyVT5ipjLDrgJj4f9G1WJrJdJTlPJrpjh7ZMLrJp7rJdJLYOJipjLrpjh7JjJrJdJPYOJipjLrpjh7Ze3rJdJTYOJipjLrpjh7pfLDIj2XETJrpjLrJp-rojxjpe2iFjLrpjLDrg6Hojxj5f2iFjLrpjLDrg53pjxjJf2iFjLrpjLDrgJHIg6zpfJrJdJnYOJipjLrpjh7pfLDIjAOEjLrpjLDrg2rJdJfkQJrpjLrJp-rojxjpQJrpjLrJp-rojxjpS0ipjLrpjh-kjxjpS9WlOzWFjLrJp-3kjLDLj7WVbcGWQZSlSiOENMaFRJrJdJjoPJrpjLrJpwqJdJrkPJrpjh7Jj3ToNL-oe1zVRUq5d7zpf6rpWdq5P0ulS9G1WJrJdJnVO4ipjLD7N;ce83d98fbfd864d236f1b9723a4071a5bb38433cc8ccc2b722adc2a54dff2c95',
'x-api-eid-token': 'jdd032NJPJXNWFKZ3XKKBVI7UYTJ7DJTTVMG7KWXCA4BCXYP4JMNCMCX7VGQPR2TI7PTAUHSBL4QXPEIIPHDNQZEZKJF2CYAAAAMTHDHTZ7QAAAAAC3V5VRVEVSDVAIX',
'loginType': '3',
'uuid': '181111935.1764370966.1687070912.1728964615.1731824925.16',
}
response = requests.get('https://api.m.jd.com/', params=params, cookies=cookies, headers=headers)
In [2]:
for comment in response.json()['comments']:
comment_id = comment['id'] # 评论id
nick_name = comment['nickname'] # 昵称
location = comment['location'] # IP地址
creation_time = comment['creationTime'] # 评论时间
product_color = comment['productColor'] # 产品颜色
product_size = comment['productSize'] # 内存大小
score = comment['score'] # 得分
useful_vote_count = comment['usefulVoteCount'] # 评论点赞量
reply_count = comment['replyCount'] # 评论回复量
# 将评论内容里的换行符剔除
content = comment['content'].replace('\n','')
print(comment_id,nick_name,location,creation_time,content)
21696982924 1***l 福建 2024-11-04 08:47:43 这款OPPO Find X8黑色手机真的太棒了!拿到手的第一感觉就是精致,黑色低调沉稳,很有质感。手机的运行速度非常流畅,玩游戏、看视频都很顺滑,没有卡顿的情况出现。拍照效果也让我惊喜,色彩还原度高,细节清晰,夜景拍摄也很出色。电池续航能力也很强,充满电可以用一整天,完全不用担心电量不足的问题。总之,这是一次非常满意的购物体验,强烈推荐给大家! 21698335219 一***o 甘肃 2024-11-04 12:21:23 这款OPPO Find X8手机确实很棒,无论是从外观还是性能上都无可挑剔。使用起来非常顺畅,双扬声器听音乐看视频太赞了,拍照效果也非常清晰。物流速度快,包装也很严实。总体来说,这次购物体验非常愉快! 21697986541 嗣***b 河北 2024-11-04 11:25:47 发布会结束后下的单,29号晚上就发货啦,30号早上九点收到的手机,目前为止使用一切正常,基本没有发热的现象,续航也很强。用过很多oppo的手机,包括R系列,K系列,Reno系列,整体给我的感觉就是很抗摔,镜头和屏幕也都很耐磨,主要为了拍照效果和直屏买的X8,使用下来整体很流畅,功能也很多,AI一键问屏和写作功能也很喜欢,整体还是满意的。4699的价格也没有很贵,喜欢拍照的可以考虑入手。外形外观:粉色真的很好看,光下会有青色的渐变屏幕音效:没觉得屏幕刺眼,护眼效果还是很不错的,指纹也没有网上说的那么差劲,沾了水也能解开,还是很灵敏的,解锁速度也可以。拍照效果:最喜欢的还是X8的拍照效果,人像模式里的滤镜真的非常非常好看,夜景模式也很棒,拍食物也很有食欲,不会发黑发红,很好看,live图也很清晰!运行速度:买的12+512款,平时会打打王者什么的,高帧+极致画质的体验还是很好的。后台同时开十几个应用也没有卡顿的感觉,完全够用。 21695911621 可***便 广东 2024-11-04 01:17:26 外形外观:轻薄,手感好。外观很漂亮屏幕音效:立体声非常棒拍照效果:三个5000万摄像头,特别清洗,长焦也很棒!运行速度:3纳米芯片,打打游戏足够了!待机时间:还没测试,不过大电池没有续航焦虑其他特色:正面边框超级窄,R角过渡很好看!OPPO做工一直很棒,手感外观都是目前主流设计,最主要是直屏,打游戏方便,不会误触和手感不好! 21708093274 j***g 陕西 2024-11-05 21:28:22 OPPO Find X8一到手,就给我带来了十足的惊喜。从外观上看,它的设计简直惊艳到我了。机身线条流畅,握在手里的感觉非常舒适,而且整体的外观很时尚,无论是走在大街上还是在各种场合拿出来使用,都能成为众人瞩目的焦点。屏幕素质更是超一流。显示效果清晰逼真,色彩饱和度高得恰到好处,每一个画面都像是被精心雕琢过的艺术品。无论是观看绚丽的电影大片,还是浏览色彩丰富的图片,都能给我带来视觉上的极致享受。再说说它的拍照功能,这简直是摄影爱好者的福音。摄像头组合的成像质量极高,照片的细节丰富,对焦迅速准确。无论是壮阔的风景、精美的微距特写,还是人物肖像,OPPO Find X8都能轻松驾驭,拍出令人惊叹的照片。而且在夜景拍摄方面,它也表现得非常出色,能够在昏暗的环境下捕捉到清晰、明亮且低噪点的画面。在性能方面,OPPO Find X8也从未让我失望。各种应用程序的切换流畅自如,运行大型游戏也毫无压力,没有出现过卡顿的情况。其系统优化做得很棒,操作简单便捷,各种功能都能轻松找到并且使用起来很顺手。 21698560204 j***2 河南 2024-11-04 12:59:06 外形外观:很时尚 紧跟时代潮流。屏幕音效:很有感觉 比较先进。拍照效果:适合我这种新手 拍照降低了要求。运行速度:反应很快 对比差距很大。 21688944498 耶***i 广东 2024-11-02 19:36:23 使用了一段时间后,感觉Find X8真的很不错,运行流畅,拍照效果清晰,值得推荐!🌟🌟 手机性能出色,日常使用完全无压力,尤其是拍照功能,细节表现非常好。物流也很快,整体购物体验非常满意! 21699532893 j***w 广东 2024-11-04 15:43:31 用了一下午,手感很惊艳。很顺滑,相比起x7,手感优化明显。拍照大师模式对小白很好,普通拍照模式,色彩也很还原,能够很大程度还原眼睛所看到的色彩。期待以后去旅游排拍出大片。数据迁移非常快。选的白色,送的是透明外壳,也很好看。同事说跟外型苹果很像。之前用的是x7,x8的直屏感觉比x7的微曲屏显示效果好一点。 21690840863 弄***沙 北京 2024-11-03 08:36:08 这款手机壳设计时尚,手感舒适,完美贴合手机。强力磁吸指环设计,不仅方便携带,还能稳固支撑手机。手机壳的图案精美,非常适合喜欢个性化装饰的朋友们。推荐给大家,非常值得购买!🌟🌟🌟🌟🌟上面的是用这手机AI一键帮写的,我用的都是oppo生态,手表,3个oppop耳机。换机十分方便。拍照对于我来说无所谓,直男一个,能扫码即可。重新下了王者荣耀测试,稳定120帧。续航的话,反正从50的电,打了四五把王者,才掉到30左右。(测完就把王者荣耀卸载了) 21698523860 土***飞 贵州 2024-11-04 12:52:45 非常满意oppo的这次产品。直观来说,手感很好,非常的轻。整体的设计风格也很戳心窝,摄像头的H字母非常有设计感,整体背板的磨砂黑也非常有气质,最重要的是大小也非常合适。当然我个人最喜欢的就是手机流畅的体验了,无缝切换app,快速载入各种原神地图界面,这些都是超越我感受的事。当然相机功能,对于我一个轻度照相者来说完全够用,新增的AI功能也充满了各种可玩性。图片上的两张图是随手拍的,用了复古风的滤镜,个人真是爱死了这种质感。
In [4]:
import requests
import csv
import time
import tqdm
import random
COOKIES = {
'__jdu': '1764370966',
'shshshfpa': 'b983081b-d500-95cf-ce75-af324f42da15-1687070914',
'shshshfpx': 'b983081b-d500-95cf-ce75-af324f42da15-1687070914',
'unpl': 'JF8EALBnNSttCx5WBhgKSUURHg1SW1QJSR5XbW4NBlgISVcNGVUYRUN7XlVdWBRLFx9vYRRUWFNIXQ4eBisSEXteXVdZDEsWC2tXVgQFDQ8VXURJQlZAFDNVCV9dSRZRZjJWBFtdT1xWSAYYRRMfDlAKDlhCR1FpMjVkXlh7VAQrAh0VFUlbVVZaD3sWM2hXNWRYXU1UBxsyGiIRex8AAlgASxIGbCoFUlpdSVIEEwUcIhF7Xg',
'__jdv': '76161171|baidu-pinzhuan|t_288551095_baidupinzhuan|cpc|0f3d30c8dba7459bb52f2eb5eba8ac7d_0_bd3229cf0da748038e389c4a3293f2fb|1731824925131',
'3AB9D23F7A4B3CSS': 'jdd032NJPJXNWFKZ3XKKBVI7UYTJ7DJTTVMG7KWXCA4BCXYP4JMNCMCX7VGQPR2TI7PTAUHSBL4QXPEIIPHDNQZEZKJF2CYAAAAMTHDHTZ7QAAAAAC3V5VRVEVSDVAIX',
'_gia_d': '1',
'areaId': '12',
'jsavif': '1',
'wlfstk_smdl': 'e8c1tgskdw8mfgc4qo6ol9lc22pectbq',
'TrackID': '1RqsviCt6hbj4naUJ4-2X1Xo8yfQKHyJEC5oddM2b4mnLsJCE5dEogde0oVODb8FsXQngu1f2q2fo9UcLsNMA91HNex9bW77j-qEGNRnOGW4gO3ZxqHsdOG2fwAWwjy-g',
'thor': 'A75180384C3DD978F135FA9A5BFE0B24F1412B129B96128317E07EE5E2F53441426FDAF2C39DD257C5E37A4BB9A89DDEC80C1CA85B18EF0F6D33BDC78B55B38723578D8775A09A2C9CDDC2EBF79C49B702BCA05704CDB8CD7C68B3052B968E0B66CAFA39C3DB93C6B89AA0847733AFE11323CE6AA6956006B716A1E15F86969C3FF84A6CCD8086AEFF71E4455C44E3CC10AE723D7D61CFFEEF9AE98466060965',
'light_key': 'AASBKE7rOxgWQziEhC_QY6ya7oCXdforERpniNIwfN9U2KSgVpNVKAgbS4Qk0SIZyRIqL2W9',
'pinId': '0DRQUAoQkuOE-51lGRDIcg',
'pin': 'jd_zwIdfRmYOAep',
'unick': '%E7%A7%8B%E5%B0%8F%E6%9E%AB%E6%B8%85',
'ceshi3.com': '000',
'_tp': 'B7r2tu8GDnnEKA6Eq%2FVibA%3D%3D',
'_pst': 'jd_zwIdfRmYOAep',
'3AB9D23F7A4B3C9B': '2NJPJXNWFKZ3XKKBVI7UYTJ7DJTTVMG7KWXCA4BCXYP4JMNCMCX7VGQPR2TI7PTAUHSBL4QXPEIIPHDNQZEZKJF2CY',
'__jda': '181111935.1764370966.1687070912.1728964615.1731824925.16',
'__jdc': '181111935',
'flash': '3_gGrStCyXUZZXKQ_mtYvc2OATndLdZHQZE6CeeogF8O48erkq84a1laOCcz6-13XcruhrgKiIrnmAvd7_qsnvYYaMeX1QFqwtuTz551mb-_86XyE57jCU6pPrXVv_tfWHOzjnS9KpY-L401dAdNMFMbxdZ71QPaDmjEexdUb7pX31esDG0fZn',
'ipLoc-djd': '12-978-980-36485',
'token': '12caf6e9fecb3f5cc3ae0ae1425a99cd,3,962124',
'__jdb': '181111935.6.1764370966|16.1731824925',
'shshshfpb': 'BApXSbNHYO_ZAdaYLJ0d7e3y8xkX0hGvPB8VGDjtq9xJ1MgeCSYO2',
}
HEADERS = {
'accept': 'application/json, text/javascript, */*; q=0.01',
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36 Edg/127.0.0.0',
}
def get_filename(product_id, page):
"""生成带有商品 ID 和页数的唯一文件名"""
timestamp = time.strftime("%Y%m%d_%H%M%S")
return f"data_{product_id}_page{page}_{timestamp}.csv"
def init_csv(filename):
"""初始化 CSV 文件,写入表头"""
with open(filename, 'w', encoding='utf-8', newline='') as f:
csvwriter = csv.writer(f)
csvwriter.writerow([
'comment_id', 'nick_name', 'location', 'creation_time', 'product_color',
'product_size', 'score', 'useful_vote_count', 'reply_count', 'content'
])
def spider(page, product_id):
"""爬取京东商品评论"""
params = {
'appid': 'item-v3',
'functionId': 'pc_club_productPageComments',
'client': 'pc',
'clientVersion': '1.0.0',
't': str(int(time.time() * 1000)), # 时间戳,防止缓存
'productId': product_id,
'score': '0',
'sortType': '5',
'page': page,
'pageSize': '10',
'isShadowSku': '0',
'fold': '1',
}
try:
response = requests.get('https://api.m.jd.com/', params=params, cookies=COOKIES, headers=HEADERS, timeout=10)
response.raise_for_status() # 如果请求失败,抛出异常
data = response.json()
comments = data.get('comments', [])
if not comments:
print(f"[INFO] 第 {page} 页无评论数据,可能是商品 ID 错误或评论已爬取完毕。")
return False
filename = get_filename(product_id, page) # 每页单独保存
init_csv(filename) # 初始化 CSV 文件
with open(filename, 'a', encoding='utf-8', newline='') as f:
csvwriter = csv.writer(f)
for comment in comments:
csvwriter.writerow([
comment.get('id', 'N/A'), # 评论 ID
comment.get('nickname', '匿名用户'), # 用户昵称
comment.get('location', '未知'), # 城市
comment.get('creationTime', '未知'), # 创建时间
comment.get('productColor', '未知'), # 商品颜色
comment.get('productSize', '未知'), # 商品尺寸
comment.get('score', 'N/A'), # 评分
comment.get('usefulVoteCount', 0), # 有用票数
comment.get('replyCount', 0), # 回复数
comment.get('content', '无内容').replace("\n", " ").replace("\r", " ") # 清理换行符
])
print(f"[INFO] 第 {page} 页数据已保存到 {filename}")
return True
except requests.exceptions.RequestException as e:
print(f"[ERROR] 请求失败: {e}")
except Exception as e:
print(f"[ERROR] 解析数据时出错: {e}")
return False
def main():
"""主函数"""
product_id = input('请输入商品的 ID:').strip()
try:
max_page = int(input('请输入要爬取的页数:').strip())
if max_page <= 0:
print("[ERROR] 页数必须大于 0")
return
except ValueError:
print("[ERROR] 请输入有效的整数页数")
return
for page in tqdm.tqdm(range(1, max_page + 1), desc="爬取进度", unit="页"):
success = spider(page, product_id)
if not success:
break # 如果当前页无数据,停止爬取
time.sleep(random.randint(3,6)) # 避免请求过快被封 IP
print("[INFO] 爬取完成!")
if __name__ == "__main__":
main()
请输入商品的 ID:100120884199 请输入要爬取的页数:20
爬取进度: 0%| | 0/20 [00:03<?, ?页/s]
[ERROR] 请求失败: 403 Client Error: for url: https://api.m.jd.com/?appid=item-v3&functionId=pc_club_productPageComments&client=pc&clientVersion=1.0.0&t=1743051727802&productId=100120884199&score=0&sortType=5&page=1&pageSize=10&isShadowSku=0&fold=1 [INFO] 爬取完成!
In [ ]: