使用Python爬取某查查APP端(Appium自动化篇)
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 kwargsdef 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 ruledef 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 = 0search_box = driver.find_element(By.XPATH, '//*[@resource-id="com.android.icredit:id/lt"]')search_box.send_keys(keyword)self.search_count += 1driver.press_keycode(66)index = 1while True:if index >= 3:driver.back()returnclick_company = driver.find_element(By.XPATH, f'//*[@resource-id="com.android.icredit:id/vs"][{index}]')obj = click_company.get_attribute('text')if obj == keyword:breakindex += 1click_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:breaktime.sleep(1)if checker_ele[0].get_attribute('text') == '登记信息':print(self.RED % '当前企业无符合数据, 跳过!')driver.find_element(By.ID, 'com.android.icredit:id/j3').click()returnchecker_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))
好了,到这里又到了跟大家说再见的时候了。创作不易,帮忙点个赞再走吧。你的支持是我创作的动力,希望能带给大家更多优质的文章
相关文章:
使用Python爬取某查查APP端(Appium自动化篇)
1. 写在前面 某查查网站反爬虫风控还是较强的,之后会分别介绍一下PC端协议、APP端自动化、APP端接口协议三种采集方案。这里主要介绍APP端的自动化方式,APP端自动化方式需要登陆账号,协议的话需要签名授权(自动化经测试没有太多限…...
vue3实现组件可拖拽 vuedraggable
npm i -S vuedraggablenext 中文文档,里面有完整代码案例,值得一看 vue.draggable vue3 版本在工作台中的应用场景 - itxst.com...
gradio常用组件
gradio常用组件 1.gradio程序启动2.写入html相关代码3.文本框4. 回车触发事件5.选择按钮框6.下拉框7.点击按钮8.清空按钮9.监听组件10.输出流11.template 1.gradio程序启动 import gradio as gr def tab():pass with gr.Blocks() as ui:gr.Markdown("# <center>&am…...
vcode开发go
配置环境变量 go env -w GO111MODULEon go env -w GOPROXYhttps://goproxy.cn,direct 创建文件夹 mkdir hello cd hello go mod help go mod help 初始化一个项目 go mod init hello 获取第三方包 go get github.com/shopspring/decimal 将依赖包下载到本地 go mod …...
聊城大学823软件工程考研
1.什么是软件工程?它目标和内容是什么? 软件工程就是用科学的知识和技术原理来定义,开发,维护软件的一门学科。 软件工程目标:付出较低开发成本;达到要求的功能;取得较好的性能;开发的软件易于移植&…...
Spring Initailizr--快速入门--SpringBoot的选择
😀前言 本篇博文是关于IDEA使用Spring Initializer快速创建Spring Boot项目的说明,希望能够帮助到您😊 🏠个人主页:晨犀主页 🧑个人简介:大家好,我是晨犀,希望我的文章可…...
大数据课程I1——Kafka的概述
文章作者邮箱:yugongshiye@sina.cn 地址:广东惠州 ▲ 本章节目的 ⚪ 了解Kafka的概念; ⚪ 掌握Kafka的配置与启动; 一、简介 1. 基本概念 Apache kafka 是一个分布式数据流平台。可以从如下几个层面来理解: 1. 我们可以向Kafka发布数据以及从Kafka订阅…...
视图簇 se54 sm34 se54
今天演练了一下 维护视图到视图簇的过程。 se11建表,建表之后 【使用程序】→【表维护生成器】 se54 新建视图簇 对象结构 选中其中一行 字段附属 PS:以上每一行都要设置过去 , 设置完成了 激活 sm34展示...
风丘科技将亮相 EVM ASIA 2023
风丘科技将首次亮相 EVM ASIA 2023 WINDHILL will debut EVM ASIA 2023 ——可持续移动的未来 —The Future of SUSTAINABLE Mobility EVM ASIA 2023是亚太地区电气化的国际性展会,专注于新能源汽车、充电技术及汽车零件制造等。展会致力于促进包括充电站、交通…...
腾讯云服务器S6、SA3、S5、SA2等CVM实例介绍
腾讯云服务器CVM实例标准型S6、SA3、S5、SA2等多款实例降价,最高幅度达40%,标准型S6云服务器是新一代云服务器,SA3和SA2是AMD处理器,标准型S5是次新一代的云服务器,如下图: 腾讯云服务器CVM降价 标准型S6&a…...
使用kickstart和anaconda自动化安装centos系统
使用kickstart和anaconda自动化安装centos系统 使用kickstart和anaconda自动化安装centos系统 anaconda 介绍 kickstart 介绍 实验过程 前提 1.已经安装好至少两台centos系统 2.需要实现自动安装的系统的光盘镜像 3.已安装的系统之间可以通讯(比如处于VMware中的NAT网络的…...
Delphi7通过VB6之COM对象调用PowerBASIC写的DLL功能
Delphi7通过VB6之COM对象调用PowerBASIC写的DLL功能。标题挺长,其实目标很简单,就是在Delphi7中使用PowerBASIC的MKI/CVI, MKS/CVS, MKD/CVD,并顺便加入CRC16检验函数,再进行16进制高低字节调整,方便在VB6、Delphi、La…...
中电金信:ChatGPT一夜爆火,知识图谱何以应战?
随着ChatGPT的爆火出圈 人工智能再次迎来发展小高潮 那么作为此前搜索领域的主流技术 知识图谱前路又将如何呢? 事实上,ChatGPT也并非“万能”,作为黑箱模型,ChatGPT很难验证生成的知识是否准确。并且ChatGPT是通过概率模型执行推…...
单细胞分类和预测任务
对于分类和预测任务,在生物信息学领域有一些常用的方法和工具可以使用。以下是一些常见的方法和工具: 1. 机器学习方法: 包括支持向量机(Support Vector Machine,SVM)、随机森林(Random Forest…...
那些年的Webview开发经验记录
获取网站视频真实链接 直接上工具类 直接调用即可,这个工具类会返回加载的网页中所有的链接,至于对链接怎么处理就是你们自己的事了, 亲测至今我所遇到的所有视频,它都可以捕获到其链接 import android.app.Activity; import an…...
ssh-keygen详解
ssh-keygen命令参数详解 -b BITS指定密钥长度。 -e读取私有或公共 OpenSSH 密钥文件并以 -m 选项指定的格式之一将密钥打印到标准输出。 -C添加注释。 -f FILENAME指定用来保存密钥的文件名。 -i以 -m 选项指定的格式读取未加密的私钥(或公钥)文件&…...
自动方向识别式 LSF型电平转换芯片
大家好,这里是大话硬件。 今天这篇文章想分享一下电平转换芯片相关的内容。 其实在之前的文章分享过一篇关于电平转换芯片的相关内容,具体可以看链接《高速电路逻辑电平转换设计》。当时这篇文章也是分析的电平转换芯片,不过那时候更多的是…...
轻量的工作流引擎:告别低效,创造新高!
伴随着日益激烈的市场竞争,作为新时代的企业,如何在众多同质化竞争中脱颖而出,占有更多的市场份额,实现更大发展?此时此刻就需要拥有不同寻常的头脑,寻找不平常的路径,轻量的工作流引擎是低代码…...
Linux-mysql安装
1. 获取rpm wget https://dev.mysql.com/get/mysql57-community-release-el7-9.noarch.rpm 2. 安装rpm rpm -ivh mysql57-community-release-el7-9.noarch.rpm 3. 确认依赖文件 cd /etc/yum.repos.d ls 查看该文件夹下是否已存在如下两个文件 4. import mysql 的公钥到RPM…...
山东布谷科技直播平台搭建游戏开发技术分享:数据存储的重要意义
在市场上的热门的直播平台中,有很多小程序为用户提供各种各样的功能,这其中就有很多游戏小程序,当今社会独生子女众多,很多作为独生子女的用户都会去选择一个能够社交互动的APP来填补内心的空虚,而直播平台的实时互动的…...
AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
Linux链表操作全解析
Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...
反射获取方法和属性
Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...
vue3 定时器-定义全局方法 vue+ts
1.创建ts文件 路径:src/utils/timer.ts 完整代码: import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...
数据库分批入库
今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...
图表类系列各种样式PPT模版分享
图标图表系列PPT模版,柱状图PPT模版,线状图PPT模版,折线图PPT模版,饼状图PPT模版,雷达图PPT模版,树状图PPT模版 图表类系列各种样式PPT模版分享:图表系列PPT模板https://pan.quark.cn/s/20d40aa…...
Go 语言并发编程基础:无缓冲与有缓冲通道
在上一章节中,我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道,它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好࿰…...
TSN交换机正在重构工业网络,PROFINET和EtherCAT会被取代吗?
在工业自动化持续演进的今天,通信网络的角色正变得愈发关键。 2025年6月6日,为期三天的华南国际工业博览会在深圳国际会展中心(宝安)圆满落幕。作为国内工业通信领域的技术型企业,光路科技(Fiberroad&…...
VisualXML全新升级 | 新增数据库编辑功能
VisualXML是一个功能强大的网络总线设计工具,专注于简化汽车电子系统中复杂的网络数据设计操作。它支持多种主流总线网络格式的数据编辑(如DBC、LDF、ARXML、HEX等),并能够基于Excel表格的方式生成和转换多种数据库文件。由此&…...
Java 与 MySQL 性能优化:MySQL 慢 SQL 诊断与分析方法详解
文章目录 一、开启慢查询日志,定位耗时SQL1.1 查看慢查询日志是否开启1.2 临时开启慢查询日志1.3 永久开启慢查询日志1.4 分析慢查询日志 二、使用EXPLAIN分析SQL执行计划2.1 EXPLAIN的基本使用2.2 EXPLAIN分析案例2.3 根据EXPLAIN结果优化SQL 三、使用SHOW PROFILE…...
