首页 > 编程语言 >Python爬虫之Js逆向案例(16)-京东商品评论&店铺详情案例

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

时间:2023-02-12 18:32:43浏览次数:43  
标签:index get Python 16 page 案例 ... print id

<center>声明:京东商品评论&店铺详情获取分析仅用于研究和学习,如有侵权,可联系删除</center>

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

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

效果如下图:

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

下面会进行以下几步进行分析(下方演示过程全部使用​​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.编写全局控制参数到配置文件

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

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

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

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

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


标签:index,get,Python,16,page,案例,...,print,id
From: https://blog.51cto.com/u_15908554/6052132

相关文章

  • Python 类型注解
    在Python语言发展的过程中,PEP提案发挥了巨大的作用,如PEP3107和PEP484提案,分别给我们带来了函数注解(FunctionAnnotations)和类型提示(TypeHints)的功能。PEP3107:定义了......
  • Python 高级编程之网络编程 Socket(六)
    目录一、概述二、Pythonsocket模块1)Socket类型1、创建TCPSocket2、创建UDPSocket2)Socket函数1、服务端socket函数2、客户端socket函数3、公共socket函数三、单工,半......
  • 三层架构与案例_需求分析&设计
    三层架构三层架构:软件设计架构1.界面层(表示层):用户看的得界面。用户可以通过界面上的组件和服务器进行交互2.业务逻辑层:处理业务逻辑......
  • 782~783 案例需求,分析,设计,环境搭建
    案例:用户信息列表展示1.需求:用户信息的增删改查操作2.设计:1.技术选型:Servlet+JSP+Mysql+JDBCTempleat+Duird+BeanUtils+Tomcat2.数据库......
  • 《黑马旅游网》综合案例(一)
    项目导入  初始的项目:链接:https://pan.baidu.com/s/1Fd-6zx4KaX-F7M5IhCWlEw提取码:btan记得解压把给定的初始项目导入即可配置tomcat     项目启动......
  • [16] Zookeeper-源码2
    1.ZkServer选举源码1.1选举准备QuorumPeer@Overridepublicsynchronizedvoidstart(){if(!getView().containsKey(myid)){thrownewRuntimeEx......
  • 学习python中的字符串操作
    字符串字符串的存储地址原理​ 在python中有一个字符串保留区,当中存放了声明的字符串,每一个字符串对应一个地址,变量名指向对应的地址,只要字符串相同,声明内容相同的字符......
  • python&&matlab
    绘制折线图importmatplotlib.pyplotaspltsplts.figure(figsize=[10,5],dpi=80)#绘制一周的天气的变化plts.plot([1,2,3,4,5,6,7],[12,14,8,7,3,19,4])plts.show()......
  • Python网络爬虫与数据挖掘——复习笔记
    目录\(\ttrequests\)库爬取页面\(\ttrequests\)库爬取搜索引擎\(\ttrequests\)库爬取网络图片\(\ttrequests\)库爬取页面importrequests#引入库url="...........
  • Python----基础知识测试
    一、单选题(每题2分)1、列标识符命名中,符合规范的是()A、1aB、forC、_123D、#_b2、下列标识符中,不是Python支持的数据类型的是()A、charB、intC、floatD、str3、下......