Appium+mitmdump 爬取京东商品


新建一个脚本文件,然后实现这个脚本以提取这两个接口的数据。首先提取商品的信息,代码如下所示:

def response(flow):

url = ‘cdnware.m.jd.com’

if url in flow.request.url:

text = flow.response.text

data = json.loads(text)

if data.get(‘wareInfo’) and data.get(‘wareInfo’).get(‘basicInfo’):

info = data.get(‘wareInfo’).get(‘basicInfo’)

id = info.get(‘wareId’)

name = info.get(‘name’)

images = info.get(‘wareImage’)

print(id, name, images)

这里声明了接口的部分链接内容,然后与请求的 URL 作比较。如果该链接出现在当前的 URL 中,那就证明当前的响应就是商品详情的响应,然后提取对应的 JSON 信息即可。在这里我们将商品的 ID、名称和图片提取出来,这就是一条商品数据。

再提取评论的数据,代码实现如下所示:

提取评论数据

url = ‘api.m.jd.com/client.action’

if url in flow.request.url:

pattern = re.compile(‘sku".*?“(d+)”’)

Request 请求参数中包含商品 ID

body = unquote(flow.request.text)

提取商品 ID

id = re.search(pattern, body).group(1) if re.search(pattern, body) else None

提取 Response Body

text = flow.response.text

data = json.loads(text)

comments = data.get(‘commentInfoList’) or []

提取评论数据

for comment in comments:

if comment.get(‘commentInfo’) and comment.get(‘commentInfo’).get(‘commentData’):

info = comment.get(‘commentInfo’)

text = info.get(‘commentData’)

date = info.get(‘commentDate’)

nickname = info.get(‘userNickName’)

pictures = info.get(‘pictureInfoList’)

print(id, nickname, text, date, pictures)

这里指定了接口的部分链接内容,以判断当前请求的 URL 是不是获取评论的 URL。如果满足条件,那么就提取商品的 ID 和评论信息。

商品的 ID 实际上隐藏在请求中,我们需要提取请求的表单内容来提取商品的 ID,这里直接用了正则表达式。

商品的评论信息在响应中,我们像刚才一样提取了响应的内容,然后对 JSON 进行解析,最后提取出商品评论人的昵称、评论正文、评论日期和图片信息。这些信息和商品的 ID 组合起来,形成一条评论数据。

最后用 MongoDB 将两部分数据分开保存到两个 Collection,在此不再赘述。

运行此脚本,命令如下所示:

mitmdump -s script.py

手机的代理设置到 mitmdump 上。我们在京东 App 中打开某个商品,下拉商品评论部分,即可看到控制台输出两部分的抓取结果,结果成功保存到 MongoDB 数据库,如图所示。

在这里插入图片描述

如果我们手动操作京东 App 就可以做到京东商品评论的抓取了,下一步要做的就是实现自动滚动刷新。

Appium 自动化


将 Appium 对接到手机上,用 Appium 驱动 App 完成一系列动作。进入 App 后,我们需要做的操作有点击搜索框、输入搜索的商品名称、点击进入商品详情、进入评论页面、自动滚动刷新,基本的操作逻辑和爬取微信朋友圈的相同。

京东 App 的 Desired Capabilities 配置如下所示:

{

‘platformName’: ‘Android’,

‘deviceName’: ‘MI_NOTE_Pro’,

‘appPackage’: ‘com.jingdong.app.mall’,

‘appActivity’: ‘main.MainActivity’

}

首先用 Appium 内置的驱动打开京东 App,如图所示。

在这里插入图片描述

这里进行一系动作操作并录制下来,找到各个页面的组件的 ID 并做好记录,最后再改写成完整的代码。参考代码实现如下所示:

from appium import webdriver

from selenium.webdriver.common.by import By

from selenium.webdriver.support.ui import WebDriverWait

from selenium.webdriver.support import expected_conditions as EC

from time import sleep

class Action():

def init(self):

驱动配置

self.desired_caps = {

‘platformName’: PLATFORM,

‘deviceName’: DEVICE_NAME,

‘appPackage’: ‘com.jingdong.app.mall’,

‘appActivity’: ‘main.MainActivity’

}

self.driver = webdriver.Remote(DRIVER_SERVER, self.desired_caps)

self.wait = WebDriverWait(self.driver, TIMEOUT)

def comments(self):

点击进入搜索页面

search = self.wait.until(EC.presence_of_element_located((By.ID, ‘com.jingdong.app.mall:id/mp’)))

search.click()

输入搜索文本

box = self.wait.until(EC.presence_of_element_located((By.ID, ‘com.jd.lib.search:id/search_box_layout’)))

box.set_text(KEYWORD)

点击搜索按钮

button = self.wait.until(EC.presence_of_element_located((By.ID, ‘com.jd.lib.search:id/search_btn’)))

button.click()

点击进入商品详情

view = self.wait.until(EC.presence_of_element_located((By.ID, ‘com.jd.lib.search:id/product_list_item’)))

view.click()

进入评论详情

tab = self.wait.until(EC.presence_of_element_located((By.ID, ‘com.jd.lib.productdetail:id/pd_tab3’)))

tab.click()

现在能在网上找到很多很多的学习资源,有免费的也有收费的,当我拿到1套比较全的学习资源之前,我并没着急去看第1节,我而是去审视这套资源是否值得学习,有时候也会去问一些学长的意见,如果可以之后,我会对这套学习资源做1个学习计划,我的学习计划主要包括规划图和学习进度表。

分享给大家这份我薅到的免费视频资料,质量还不错,大家可以跟着学习

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值