当前位置: 首页 > news >正文

使用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.什么是软件工程?它目标和内容是什么? 软件工程就是用科学的知识和技术原理来定义&#xff0c;开发&#xff0c;维护软件的一门学科。 软件工程目标&#xff1a;付出较低开发成本&#xff1b;达到要求的功能&#xff1b;取得较好的性能&#xff1b;开发的软件易于移植&…...

Spring Initailizr--快速入门--SpringBoot的选择

&#x1f600;前言 本篇博文是关于IDEA使用Spring Initializer快速创建Spring Boot项目的说明&#xff0c;希望能够帮助到您&#x1f60a; &#x1f3e0;个人主页&#xff1a;晨犀主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是晨犀&#xff0c;希望我的文章可…...

大数据课程I1——Kafka的概述

文章作者邮箱:yugongshiye@sina.cn 地址:广东惠州 ▲ 本章节目的 ⚪ 了解Kafka的概念; ⚪ 掌握Kafka的配置与启动; 一、简介 1. 基本概念 Apache kafka 是一个分布式数据流平台。可以从如下几个层面来理解: 1. 我们可以向Kafka发布数据以及从Kafka订阅…...

视图簇 se54 sm34 se54

今天演练了一下 维护视图到视图簇的过程。 se11建表&#xff0c;建表之后 【使用程序】→【表维护生成器】 se54 新建视图簇 对象结构 选中其中一行 字段附属 PS:以上每一行都要设置过去 &#xff0c; 设置完成了 激活 sm34展示...

风丘科技将亮相 EVM ASIA 2023

风丘科技将首次亮相 EVM ASIA 2023 WINDHILL will debut EVM ASIA 2023 ——可持续移动的未来 —The Future of SUSTAINABLE Mobility EVM ASIA 2023是亚太地区电气化的国际性展会&#xff0c;专注于新能源汽车、充电技术及汽车零件制造等。展会致力于促进包括充电站、交通…...

腾讯云服务器S6、SA3、S5、SA2等CVM实例介绍

腾讯云服务器CVM实例标准型S6、SA3、S5、SA2等多款实例降价&#xff0c;最高幅度达40%&#xff0c;标准型S6云服务器是新一代云服务器&#xff0c;SA3和SA2是AMD处理器&#xff0c;标准型S5是次新一代的云服务器&#xff0c;如下图&#xff1a; 腾讯云服务器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功能。标题挺长&#xff0c;其实目标很简单&#xff0c;就是在Delphi7中使用PowerBASIC的MKI/CVI, MKS/CVS, MKD/CVD&#xff0c;并顺便加入CRC16检验函数&#xff0c;再进行16进制高低字节调整&#xff0c;方便在VB6、Delphi、La…...

中电金信:ChatGPT一夜爆火,知识图谱何以应战?

随着ChatGPT的爆火出圈 人工智能再次迎来发展小高潮 那么作为此前搜索领域的主流技术 知识图谱前路又将如何呢&#xff1f; 事实上&#xff0c;ChatGPT也并非“万能”&#xff0c;作为黑箱模型&#xff0c;ChatGPT很难验证生成的知识是否准确。并且ChatGPT是通过概率模型执行推…...

单细胞分类和预测任务

对于分类和预测任务&#xff0c;在生物信息学领域有一些常用的方法和工具可以使用。以下是一些常见的方法和工具&#xff1a; 1. 机器学习方法&#xff1a; 包括支持向量机&#xff08;Support Vector Machine&#xff0c;SVM&#xff09;、随机森林&#xff08;Random Forest…...

那些年的Webview开发经验记录

获取网站视频真实链接 直接上工具类 直接调用即可&#xff0c;这个工具类会返回加载的网页中所有的链接&#xff0c;至于对链接怎么处理就是你们自己的事了&#xff0c; 亲测至今我所遇到的所有视频&#xff0c;它都可以捕获到其链接 import android.app.Activity; import an…...

ssh-keygen详解

ssh-keygen命令参数详解 -b BITS指定密钥长度。 -e读取私有或公共 OpenSSH 密钥文件并以 -m 选项指定的格式之一将密钥打印到标准输出。 -C添加注释。 -f FILENAME指定用来保存密钥的文件名。 -i以 -m 选项指定的格式读取未加密的私钥&#xff08;或公钥&#xff09;文件&…...

自动方向识别式 LSF型电平转换芯片

大家好&#xff0c;这里是大话硬件。 今天这篇文章想分享一下电平转换芯片相关的内容。 其实在之前的文章分享过一篇关于电平转换芯片的相关内容&#xff0c;具体可以看链接《高速电路逻辑电平转换设计》。当时这篇文章也是分析的电平转换芯片&#xff0c;不过那时候更多的是…...

轻量的工作流引擎:告别低效,创造新高!

伴随着日益激烈的市场竞争&#xff0c;作为新时代的企业&#xff0c;如何在众多同质化竞争中脱颖而出&#xff0c;占有更多的市场份额&#xff0c;实现更大发展&#xff1f;此时此刻就需要拥有不同寻常的头脑&#xff0c;寻找不平常的路径&#xff0c;轻量的工作流引擎是低代码…...

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…...

山东布谷科技直播平台搭建游戏开发技术分享:数据存储的重要意义

在市场上的热门的直播平台中&#xff0c;有很多小程序为用户提供各种各样的功能&#xff0c;这其中就有很多游戏小程序&#xff0c;当今社会独生子女众多&#xff0c;很多作为独生子女的用户都会去选择一个能够社交互动的APP来填补内心的空虚&#xff0c;而直播平台的实时互动的…...

React第五十七节 Router中RouterProvider使用详解及注意事项

前言 在 React Router v6.4 中&#xff0c;RouterProvider 是一个核心组件&#xff0c;用于提供基于数据路由&#xff08;data routers&#xff09;的新型路由方案。 它替代了传统的 <BrowserRouter>&#xff0c;支持更强大的数据加载和操作功能&#xff08;如 loader 和…...

Java如何权衡是使用无序的数组还是有序的数组

在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...

java 实现excel文件转pdf | 无水印 | 无限制

文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...

Go 语言接口详解

Go 语言接口详解 核心概念 接口定义 在 Go 语言中&#xff0c;接口是一种抽象类型&#xff0c;它定义了一组方法的集合&#xff1a; // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的&#xff1a; // 矩形结构体…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!

5月28日&#xff0c;中天合创屋面分布式光伏发电项目顺利并网发电&#xff0c;该项目位于内蒙古自治区鄂尔多斯市乌审旗&#xff0c;项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站&#xff0c;总装机容量为9.96MWp。 项目投运后&#xff0c;每年可节约标煤3670…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作

一、上下文切换 即使单核CPU也可以进行多线程执行代码&#xff0c;CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短&#xff0c;所以CPU会不断地切换线程执行&#xff0c;从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

AspectJ 在 Android 中的完整使用指南

一、环境配置&#xff08;Gradle 7.0 适配&#xff09; 1. 项目级 build.gradle // 注意&#xff1a;沪江插件已停更&#xff0c;推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...

企业如何增强终端安全?

在数字化转型加速的今天&#xff0c;企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机&#xff0c;到工厂里的物联网设备、智能传感器&#xff0c;这些终端构成了企业与外部世界连接的 “神经末梢”。然而&#xff0c;随着远程办公的常态化和设备接入的爆炸式…...

Mysql8 忘记密码重置,以及问题解决

1.使用免密登录 找到配置MySQL文件&#xff0c;我的文件路径是/etc/mysql/my.cnf&#xff0c;有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...

Redis:现代应用开发的高效内存数据存储利器

一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发&#xff0c;其初衷是为了满足他自己的一个项目需求&#xff0c;即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源&#xff0c;Redis凭借其简单易用、…...