使用Python爬取某查查APP端(Appium自动化篇)

news2025/2/27 16:32:20

1. 写在前面

  某查查网站反爬虫风控还是较强的,之后会分别介绍一下PC端协议、APP端自动化、APP端接口协议三种采集方案。这里主要介绍APP端的自动化方式,APP端自动化方式需要登陆账号,协议的话需要签名授权(自动化经测试没有太多限制、走协议接口的话账号与次数有捆绑

接口出来结构化数据、自动化就得手搓解析

APP接口效果图
在这里插入图片描述
几种方式都测试过,自动化的方案优势就是比较稳定,对IP及账号的资源依赖相对不太高!缺点就是慢,懂得都懂!不过这个弊端是可以弥补的,做成自动化集群不管是模拟器还是真机均可拉升效率提高产能

APP自动化效果图
在这里插入图片描述

用自动化的话前期的琐事比较多,而且自动化要想完全稳定的投入长期持续的生产过程当中也是比较艰辛的,适配各种可能出现的状况

自动化分析页面元素是首要工作,可以在Appium中进行元素分析查看,但是并不支持,个人感觉体验感较差,呈现的信息不够完整
在这里插入图片描述

这里推荐大家使用Android SDK下面自带的tools工具:

在这里插入图片描述

看起来都比较丝滑一些

在这里插入图片描述

首先我们需要打开Appium的客户服务,以下URL是服务地址。通过它与移动设备进行通信和控制,另外需要进行自动化测试的Android设备的信息配置:

url = "http://127.0.0.1:4723/wd/hub"
deviceList = [
    {
        "platformName": "Android" #操作系统类型,
        "platformVersion": "9" #Android版本号,
        # "deviceName": "1304dccd",
        "udid": "172.16.18.167:5555", #这里用IP的方式可以不接USB,直接通过网络连接设备进行测试
        "appPackage": "com.android.icredit", #应用程序的包名
        "appActivity": ".ui.SplashActivity", #应用程序的入口
        "newCommandTimeout": "1800",
        "noReset": True, #Appium不重置应用程序状态
        'unicodeKeyboard': True,
        'resetKeyboard': True
    }
]
for device in self.deviceList:
	driver = Remote(
	    command_executor=self.url,
	    desired_capabilities=device)

自动化的程序还是比较简单的,解析的话用id取值就可以

# 数据解析规则
def parameter(self, **kwargs):
        return kwargs

    def parse_rule(self):
        rule = self.parameter(
            companyName="com.android.icredit:id/ai8",
            unifyTheSocialCreditCode="com.android.icredit:id/aid",
            legalRepresentative="com.android.icredit:id/h6",
            Registrationstatus="com.android.icredit:id/ajb",
            registerDate="com.android.icredit:id/aje",
            registeredCapital="com.android.icredit:id/ajh",
            contributedCapital="com.android.icredit:id/ajk",
            organizingInstitutionBarCode="com.android.icredit:id/aig",
            businessRegistrationNumber="com.android.icredit:id/aij",
            taxpayersRegistrationNumber="com.android.icredit:id/aim",
            companyType="com.android.icredit:id/ait",
            businessTerm="com.android.icredit:id/aiu",
            taxpayerQualification="com.android.icredit:id/ais",
            staffSize="com.android.icredit:id/ajo",
            contributorsIn="com.android.icredit:id/ajn",
            dateApproved="com.android.icredit:id/aix",
            registrationAuthority="com.android.icredit:id/aiy",
            importAndExportEnterpriseCode="com.android.icredit:id/aip",
            Nationalstandardindustry="com.android.icredit:id/ajr"
        )
        return rule

    def parse_rule_slither(self):
        rule = self.parameter(
            affiliatingArea="com.android.icredit:id/aiz",
            englishName="com.android.icredit:id/aj3",
            site="com.android.icredit:id/ya",
            businessScope="com.android.icredit:id/ajv",
            Phone="com.android.icredit:id/ajz"
        )
        return rule

然后就是搜索的部分,这里涉及点击下拉的一些操作。有更多提升优化的操作空间

search_element = 'com.android.icredit:id/azd'
   self._random_sleep(driver, search_element)
   driver.find_element(By.ID, search_element).click()
   
   # 清理搜索记录跟历史浏览记录
   if self.search_count >= 15:
       for element_id in [
           "com.android.icredit:id/at8",
           "com.android.icredit:id/awm",
           "com.android.icredit:id/a7c",
           "com.android.icredit:id/awf",
           "com.android.icredit:id/awj",
           "com.android.icredit:id/a7c",
       ]:
           driver.find_element(By.ID, element_id).click()
           time.sleep(1)
       self.search_count = 0
   
   search_box = driver.find_element(By.XPATH, '//*[@resource-id="com.android.icredit:id/lt"]')
   search_box.send_keys(keyword)
   self.search_count += 1
   driver.press_keycode(66)
   
   index = 1
   while True:
       if index >= 3:
           driver.back()
           return
       click_company = driver.find_element(By.XPATH, f'//*[@resource-id="com.android.icredit:id/vs"][{index}]')
       obj = click_company.get_attribute('text')
       if obj == keyword:
           break
       index += 1
   
   click_company.click()
   
   while True:
       driver.swipe(423, 600, 446, 200, 200)
       checker_ele = driver.find_elements(By.XPATH, '//*[@content-desc="工商信息" or @content-desc="登记信息" or @content-desc="基本信息"]')
       if checker_ele:
           break
       time.sleep(1)
   
   if checker_ele[0].get_attribute('text') == '登记信息':
       print(self.RED % '当前企业无符合数据, 跳过!')
       driver.find_element(By.ID, 'com.android.icredit:id/j3').click()
       return
   
   checker_ele[0].click()
   time.sleep(1)
   
   data = {}
   for key, rule in self.parse_rule().items():
       checker = driver.find_elements(By.ID, rule)
       data[key] = checker[0].get_attribute('text') if checker else ''
   
   for _ in range(2):
       driver.swipe(423, 820, 446, 245, 200)
       for k, v in self.parse_rule_slither().items():
           if not data.get(k):
               checker = driver.find_elements(By.ID, v)
               data[k] = checker[0].get_attribute('text') if checker else ''
   
   for k in self.parse_rule_slither().keys():
       data.setdefault(k, '')
   
   phone = data.get('Phone', '')
   if phone and phone.startswith('1') and len(phone) != 11:
       data['Phone'] = phone + '*' * (11 - len(phone))

  好了,到这里又到了跟大家说再见的时候了。创作不易,帮忙点个赞再走吧。你的支持是我创作的动力,希望能带给大家更多优质的文章

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/862336.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

生产事故-走近科学之消失的JWT

0x01 事故背景 2021年11月26日01时10分,P公司正在进行某业务系统的生产环境部署操作,但其实早在00时30分的时候,他们已经完成过一次部署了,但是奇怪的是无论如何都通不过验证,无奈只好推倒重来,如此反复了…

opencv实战项目 实现手势跟踪并返回位置信息(封装调用)

OpenCV 是一个基于 Apache2.0 许可(开源)发行的跨平台计算机视觉和机器学习软件库,可以运行在Linux、Windows、Android和Mac OS操作系统上。 需要提前准备opencv 和 mediapipe库 pip --default-timeout5000 install -i https://pypi.tuna.tsi…

腾讯云服务器使用教程_手把手图文详细介绍

腾讯云服务器使用教程包括注册账号实名认证、选择云服务器CVM或轻量应用服务器CPU内存带宽和系统盘配置、安全设置和云服务器远程连接、安全组端口开通教程、云服务器环境部署以搭建网站为例手把手网站上线,云服务器文件传输和数据备份以及技术支持等详细说明&#…

【Linux】用户和权限

文章目录 前言什么是 root 用户su 命令和 exit 命令sudo 命令为普通用户配置 sudo 认证 用户、用户组管理什么是Linux 用户和用户组用户组管理用户管理创建用户删除用户查看用户所属组将指定用户添加到指定用户组中 查看当前系统的用户和用户组 权限控制权限信息 修改权限控制修…

MyBatisX自动和数据库的字段关联

先下个插件 右键数据库,点MybatisX-Generator 在根据自己需求勾选 actual column:保证数据库的驼峰命名生效

第10集丨Vue 江湖 —— 表单输入绑定

目录 一、v-model1.1 基本用法1.2 值绑定1.3 修饰符1.3.1 .lazy1.3.2 .number1.3.3 .trim 二、总结2.1 案例2.2 效果 一、v-model 1.1 基本用法 功能&#xff1a; v-model指令在表单 <input>、<textarea> 及 <select> 元素上创建双向数据绑定。它会根据控件…

【人工智能前沿弄潮】——生成式AI系列:扩散模型及稳定扩散模型

VAE、GAN的出现&#xff0c;使得生成式AI越发火热&#xff0c;如今扩散模型的出现与兴起&#xff0c;更是将AIGC推到了人工智能风口&#xff0c;被视作如今人工智能生成艺术领域取得突破的主要因素。相较于VAE和GAN,扩散模型生成的图片质量更好。随着transformer架构的出现和pr…

Uniapp当中使用腾讯位置路线规划插件保姆教学

首先我们在使用腾讯地图插件之前我们需要先做几点准备 1&#xff1a;我们需要在腾讯地图位置服务当中注册账号以及在控制台当中创建应用和创建key 这里在创建应用当中应用类型一定要选出行类型&#xff0c;否则后期可能会出现问题。 我们创建完应用之后&#xff0c;点击创建…

elementUi表单恢复至初始状态并不触发表单验证

elementUi表单恢复至初始状态并不触发表单验证 1.场景再现2.解决方法 1.场景再现 左侧是树形列表&#xff0c;右侧是显示节点的详情&#xff0c;点击按钮应该就是新增一个规则的意思&#xff0c;表单内容是没有改变的&#xff0c;所以就把需要把表单恢复至初始状态并不触发表单…

线性代数(三) 线性方程组向量空间

前言 如何利用行列式&#xff0c;矩阵求解线性方程组。 线性方程组的相关概念 用矩阵方程表示 齐次线性方程组&#xff1a;Ax0&#xff1b;非齐次线性方程组&#xff1a;Axb. 可以理解 齐次线性方程组 是特殊的 非齐次线性方程组 如何判断线性方程组的解 其中R(A)表示矩阵A的…

Hugging News #0414: Attention 在多模态情景中的应用、Unity API 以及 Gradio 主题构建器

社区动向 Attention 在视觉领域的应用 注意力机制改变了许多学科的深度学习研究&#xff0c;从 NLP 开始扩展到视觉、语音等。注意力机制的使用在深度学习研究中变得越来越流行&#xff0c;理解和解释注意力机制的内部工作是至关重要的。 我们发布了一个教程&#xff0c;介绍…

面试官:前面我们聊了主从和哨兵,那今天来聊一聊集群吧

目录 秃顶面试官&#xff1a;简单介绍下什么是Redis Cluster呢? 秃顶面试官&#xff1a;那集群的缺点有哪些呢&#xff1f; 秃顶面试官&#xff1a;说说如何搭建集群呢&#xff1f; 秃顶面试官&#xff1a;集群内部是如何通信的呢&#xff1f; 秃顶面试官&#xff1a;线上…

three.js上传模型文件并加载显示

效果大概这样&#xff0c;这个宝箱模型是直接初始化就显示的&#xff0c;人物模型是自己本地添加上去的&#xff0c;代码如下。 <template><div class"container" ref"container"><el-row><el-col :span"24"><div c…

固态硬盘恢复数据,5步搞定!

“不知咋回事&#xff0c;我的固态硬盘突然就有问题了&#xff0c;很多重要的文件也一起丢失了。我正在很努力的解决这个问题&#xff0c;但可惜我对电脑的使用了解比较少&#xff0c;有没有电脑高手可以帮帮我呀&#xff1f; 固态硬盘&#xff0c;通常被称为SSD&#xff0c;它…

stable-diffusion 模型效果+prompt

摘自个人印象笔记&#xff0c;图不完整可查看原笔记&#xff1a;https://app.yinxiang.com/fx/55cda0c6-2af5-4d66-bd86-85da79c5574ePrompt运用规则及技巧 &#xff1a; 1. https://publicprompts.art/&#xff08;最适用于OpenArt 线上模型 https://openart.ai/&#xff09;…

近地面无人机植被定量遥感与生理参数反演技术

遥感&#xff08;RS-Remote Sensing&#xff09;——不接触物体本身&#xff0c;用传感器收集目标物的电磁波信息&#xff0c;经处理、分析后&#xff0c;识别目标物&#xff0c;揭示其几何、物理性质和相互关系及其变化规律的现代科学技术。 换言之&#xff0c;即是“遥远的感…

领克08,开创「芯」时代

中国汽车产业&#xff08;自主品牌&#xff09;的持续向上&#xff0c;正带动本土智能化核心供应链&#xff0c;尤其是关键算力芯片&#xff08;SoC&#xff09;的本土创新。 高工智能汽车研究院监测数据显示&#xff0c;今年1-6月中国市场&#xff08;不含进出口&#xff09;自…

Unity游戏源码分享-精品即时战略游戏_官网60美刀素材

Unity游戏源码分享-精品即时战略游戏_官网60美刀素材 下载地址&#xff1a;https://download.csdn.net/download/Highning0007/88204017

visual studio 2022安装本地的nuget包

工具->选项->Nuget包管理器->程序包源 然后右击解决方案->管理解决方案的Nuget包

探秘Java的Map集合:键值映射的奇妙世界

文章目录 1. 单列集合 vs. 双列集合2. Map接口&#xff1a;键与值的契约3. 深入探索HashMap3.1 特性与构造方法3.2 常用方法3.3 遍历HashMap 4. 美妙的LinkedHashMap 在Java编程中&#xff0c;集合是不可或缺的重要部分&#xff0c;它为我们提供了各种数据结构和算法的实现。其…