爬虫-uiautomator2获取拼多多APP端商品数据

        本章将对拼多多APP端进行自动化爬虫,由于发现现在的文章对APP爬虫的介绍少之又少,因此本文也会详细地介绍APP自动化工具库uiautomator2和辅助工具weditor。

注意:

  • 本文将默认已经配置了abd、ATX以及一系列必要的设备,下午只讲思路以及实现方法,并没有介绍到如何按照测试环境,若有需要将于日后发布环境配置的文章。

1、启动Weditor

        执行weditor:命令行运行python -m weditor

        

随后将会自动打开一个网页,即我们的辅助工具

网页上的任何元素都可以通过左侧点击方式得到它所在位置的Hierarchy(类似于web的xpath)

2、python利用uiautomator2库连接上设备

        由于uiautomator库的操作非常简单,这里就不赘述了,设置连接方式和连接以及要采集的商品数量:

class PDD:
    def __init__(self, shop, devices, account):
        """
        初始化PDD类,连接到设备并设置店铺名称。

        :param shop: 店铺名称
        :param devices: 设备的IP地址或序列号
        :param account: 要获取的商品数量
        """
        self.shop_name = shop
        self.device = u2.connect(devices) #连接上手机并返回给debvice
        self.account = account

3、对pdd数据进行搜索和采集

        3.1搜索进入商品界面

这里我们先观察pdd界面,观察它搜索框的位置,可以看到它的定位有text,resourceld的方式,但由于text情况并不稳定,因此我们采用resourceId的定位方式,点击搜索框元素

pdd这里需要点击搜索后跳到下一页面后才能继续输入,之后要输入商品名称并且点击搜索按钮。因此从界面到搜索的方法可以这么写

​
    def __search(self):
        """
        在设备上执行搜索操作。
        """
        self.device(resourceId='com.xunmeng.pinduoduo:id/pdd').click()
        self.device.send_keys(self.shop_name)
        self.device(text='搜索').click()
        time.sleep(1)

​

运行代码后的页面为:

这里可以看到我们已经点入进来了

3.2循环点击商品进入详情页

接下来我们该对商品进行点击,进入到特定的商品详情页后。会发现每一个模块的的位置,因此在原理上可以通过模块定位。由于手机页面仅能显示6个,所以android.widget.FrameLayout这个元素也只有6个。

理论上可以用这个方法来定位到块元素,并且通过点击的方式进入到商品的详情页。但是并不是很推荐,一:速度太慢。二:容易重复点击。因此我们采用关键字的方式来定位元素的位置(类似于网页端的//*[contains(text(), '文本内容')]。

这里我们采用定位¥这个符号,因此该符号每一个页面都有,并且为了预防会出现重复点击的事件发生,我们讲元素定位到价格,采用定位¥元素的兄弟节点,并且记录兄弟节点的方式,以此达到不会重复点击的目的

但点击进入页面之后,为了表现出循环的方式,因此还添加点击返回的操作。以下是便利点击的代码:

    def __slide(self):
        """
        滑动浏览页面,并获取符合条件的商品详细信息。
        """
        temp_account = 0
        recent_elements = []
        while 1:
            elems = self.device.xpath('//*[contains(@text, "¥")]/following-sibling::*[1]').all()
            for elem in elems:
                if elem.text and elem.text not in recent_elements:
                    if len(recent_elements) >= 3:
                        recent_elements.pop(0)  # 移除最早添加的元素
                    recent_elements.append(elem.text)
                    elem.click()
                    #操作
                    self.get_detail()
                    # 返回到上一级页面
                    self.device.xpath(
                        '//*[@content-desc="顶部工具栏"]/android.widget.RelativeLayout[1]/android.widget.FrameLayout[1]').click()
                if temp_account > self.account:
                    return recent_elements
                print(recent_elements)
                temp_account += 1  # 将该行移动到这里,确保每次处理都会增加计数器
            self.device.swipe_ext("up", 0.5)
            print('next')
            time.sleep(3)

3.3获取商品信息(配合3.2实现循环获取)

进行了点击之后,我们讲进入如下的界面:

为了能够采集到数据,我们也采用Ui定位的方式来得到指定的元素内容(方式如上述一样,这里就不赘述了,直接显示代码),这里我们抓取了商品的价格,标题以及店铺名称

    def __get_detail(self):
        """
        获取商品的详细信息,包括价格、标题和店名。

        :return: 包含商品详细信息的字典
        """
        detail = {}
        # 获取价格
        price = ''
        price_elements = self.device.xpath(
            '//*[@resource-id="android:id/content"]/android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.LinearLayout[1]/android.widget.LinearLayout[2]').child(
            '//*').all()
        for elem in price_elements:
            if elem.text:
                price += elem.text
        detail['price'] = price

        # 获取标题
        title_elements = self.device.xpath(
            '//android.support.v7.widget.RecyclerView/android.widget.LinearLayout[3]/android.widget.FrameLayout[1]/android.view.ViewGroup[1]').child(
            '//android.widget.TextView').all()
        real_title = ''.join([elem.text for elem in title_elements if elem.text])
        detail['real_title'] = real_title

        # 向上滑动页面以获取更多内容
        self.device.swipe_ext("up", 1)

        # 获取店名
        store = ''
        store_name_elements = self.device.xpath(
            '//*[@resource-id="android:id/content"]/android.widget.FrameLayout[1]/android.support.v7.widget.RecyclerView[1]').child(
            '//*').all()
        for elem in store_name_elements:
            if '专营店' in elem.text or '旗舰店' in elem.text:
                store = elem.text
        detail['store'] = store
        return detail

4、运行结果:

这里我们抓取了商品价格,商品标题以及店铺名称的元素

需要源码请私信我

ILDD

爬虫(Web Crawler)是一种自动化程序,用于从互联网上收集信息。其主要功能是访问网页、提取数据并存储,以便后续分析或展示。爬虫通常由搜索引擎、数据挖掘工具、监测系统等应用于网络数据抓取的场景。 爬虫的工作流程包括以下几个关键步骤: URL收集: 爬虫从一个或多个初始URL开始,递归或迭代地发现新的URL,构建一个URL队列。这些URL可以通过链接分析、站点地图、搜索引擎等方式获取。 请求网页: 爬虫使用HTTP或其他协议向目标URL发起请求,获取网页的HTML内容。这通常通过HTTP请求库实现,如Python中的Requests库。 解析内容: 爬虫获取的HTML进行解析,提取有用的信息。常用的解析工具有正则表达式、XPath、Beautiful Soup等。这些工具帮助爬虫定位和提取目标数据,如文本、图片、链接等。 数据存储: 爬虫将提取的数据存储到数据库、文件或其他存储介质中,以备后续分析或展示。常用的存储形式包括关系型数据库、NoSQL数据库、JSON文件等。 遵守规则: 为避免对网站造成过大负担或触发反爬虫机制,爬虫需要遵守网站的robots.txt协议,限制访问频率和深度,并模拟人类访问行为,如设置User-Agent。 反爬虫应对: 由于爬虫的存在,一些网站采取了反爬虫措施,如验证码、IP封锁等。爬虫工程师需要设计相应的策略来应对这些挑战。 爬虫在各个领域都有广泛的应用,包括搜索引擎索引、数据挖掘、价格监测、新闻聚合等。然而,使用爬虫需要遵守法律和伦理规范,尊重网站的使用政策,并确保对被访问网站的服务器负责。
### 回答1: # -*- coding:utf-8 -*- import requests import json url = 'http://api.pinduoduo.com/goods/list' payload = { 'keyword': '多多商品', 'page': 1, 'page_size': 20 } headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36' } res = requests.get(url, params=payload, headers=headers) data = json.loads(res.text) if data['data']: for item in data['data']: print(item['name'], item['price']) ### 回答2: 多多是一家知名的电商平台,为了爬取多多商品的信息,我们可以使用Python编写一个爬虫程序。以下是一个简单的多多爬虫代码示例: ```python import requests import json def get_goods_info(keyword): url = 'https://api.pinduoduo.com/api/search/advanced' headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.182 Safari/537.36' } params = { 'keyword': keyword, 'page': 1, 'size': 10 } response = requests.get(url, headers=headers, params=params) result = response.content.decode('utf-8') data = json.loads(result) goods_list = data['goods_list'] for goods in goods_list: goods_name = goods['goods_name'] sales = goods['sales'] price = goods['price'] print(f'商品名称:{goods_name}') print(f'销量:{sales}') print(f'价格:{price}\n') keyword = input('请输入要搜索的关键字:') get_goods_info(keyword) ``` 这段代码中,我们首先需要通过请求多多的API获取商品的相关信息。在代码中,我们使用了`requests`库发送GET请求,并传入请求参数`keyword`来搜索指定关键字的商品信息。我们将搜索结果以页数和每页显示的数量进行参数配置。 然后,我们将返回的结果进行解析。使用`json`库将返回的结果转换为Python的字典结构,方便我们获取和处理信息。 最后,遍历商品列表,获取每个商品的名称、销量和价格,并将其打印出来。 使用这段代码,我们可以根据输入的关键字获取多多商品的信息。当然,这只是一个简单的示例,实际情况可能会更加复杂,需要根据实际需求进行相应的处理和优化。 ### 回答3: 多多是国内一家知名的社交电商平台,用户通过团购买商品,价格相对较低。下面是一段简单的多多爬虫Python代码,用于爬取多多商品的信息。 ``` import requests import json def get_product_info(keyword): url = "https://api.pinduoduo.com/api/oak/product/queryByKeyword" headers = { "Referer": "https://m.pinduoduo.com/search", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36" } params = { "keyword": keyword, "page": 1, "size": 10 } response = requests.get(url, headers=headers, params=params) product_data = json.loads(response.text) if "result" in product_data: for product in product_data["result"]["searchResultVOList"]: product_id = product["goodsId"] product_name = product["goodsName"] product_price = product["groupPrice"] / 100 # 商品价格除以100得到真实价格 print(f"商品ID:{product_id},商品名称:{product_name},商品价格:{product_price}元") else: print("未获取商品信息") if __name__ == "__main__": keyword = input("请输入要搜索的商品关键字:") get_product_info(keyword) ``` 这段代码使用Python的requests库发送HTTP请求,获取商品信息。首先构建请求的URL、请求头和请求参数,然后通过requests.get方法发送GET请求,得到商品数据。接着使用json.loads方法将返回的JSON数据转换成Python对象,再从中提取出商品ID、商品名称和商品价格,并进行简单的数据处理后打印出来。 通过运行此代码,可以根据输入的关键字获取多多商品的信息。注意,这只是一个简单的示例,实际爬取商品数据时需要更多的代码来处理分页、异常情况等。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值