最近笔者在学习移动端App爬虫,目前看来是京东比较好爬的,有些APP不给过验代理证书,今天就写一篇文章进行一下总结
windows上无法使用mitmproxy,我们用mitmdump,mitmdump的强大之处就在于他能执行python文件,接下来我们就编写一个python脚本来抓取京东的商品评论
首先我们来分析一下商品评论是在京东的哪个接口上
这里我们使用charles抓包工具,设置好代理后我们进行抓包
我们点开一个商品详情页的评论
然后一直往下滑不断刷新
观察charles的接口哪个一直在闪
我们推测是http://api.m.jd.com这里是它商品评论的放置地方
我们再点击进去查看具体情况
在这里我们找到了一个,右边评论是以json格式存储的
所以我们可以初步确定下来
我们要抓取的url是:‘http://api.m.jd.com/client.action’
然后继续看
它的评论首先是放在commentInfo里的commentData
但有些评论并没有,所以我们要有一定的措施来应对这种情况
同时我们抓取一下日期,观察上图发现是放在commentInfo里的commentDate
至此我们大致思路已经清晰了,首先请求url,再抓取commentInfo的commentData和commentDate,由于mitmdump是运行在命令行上的,上面信息繁杂很难看见结果,所以我们将评论和时间一起存到一个mongodb数据库里
下面是我们的全部代码
import json
import pymongo
def response(flow):
"""mongodb的定义不能写在方法外面,一定要写在def里面,否则会报错"""
# 定义数据库
client = pymongo.MongoClient('localhost', port=27017)
db = client['jd_data']
collection_comment = db['comment']
# url是我们获取商品评论的接口
url = 'http://api.m.jd.com/client.action'
if url in flow.request.url:
text = flow.response.text
data = json.loads(text)
"""从data提取commentInfoList"""
comments = data.get('commentInfoList')
for comment in comments or []:
# 加空列表是防止因为无评论信息而报错
if comment.get('commentInfo') and comment.get('commentInfo').get('commentData'):
info = comment.get('commentInfo')
commentdata = info.get('commentData')
date = info.get('commentDate')
print(commentdata)
# 在数据库里插入评论和日期
collection_comment.insert({
'commentdata':commentdata,
'commentdate':date
})
接下来我们看下结果
这是在powershell里的结果,因为我们编写的时候print了评论
下面是我们存储在MongoDb的结果
这里我用的是mongodb官方的可视化管理Mongo Compass