Python自动化爬取App数据

Appium微信自动化测试
本文详细介绍使用Appium进行微信朋友圈信息自动化抓取的过程,包括环境搭建、设备配置、节点定位及数据处理。涵盖JDK、Appium、AndroidSDK、Selenium等工具的安装与设置。

基本环境配置

版本:Python3

系统:Windows

需要安装:

1.JDK - Download JDK,Appium要求用户必须配置JAVA环境, 否则启动Seesion报错。

2.Appium - Download Appium, 安装过程请自行搜索。

3.Android SDK - Download SDK

4. Selenium - 建议使用低版本的Python Selenium库,在Chrome高版本可能会报错。例如:

pip3 install selenium==2.48.0

5. chromedriver.exe - Download Chromedriver, 确保版本要匹配, 然后将 .exe 程序放在"..Python\Python36\Scripts"目录下。

6. pymongo

pip3 install pymongo

7. MongoDB Server - Download MongoDB

爬取思路

爬取思路:

模拟登录

抓取动态

保存数据

Android SDK的安装与配置

打开Android Studio, 选择"Configure->SDK Manager->Apperance&Behavior->System Settings->Android SDK", 选择对应安卓机版本的SDK,如图:

此外,还需要将SDK所在路径添加到系统环境变量中,否则报错。

Desired Capabilites 参数

分别是:platfornName, deviceName, appPackage, appActivity。前两个可通过如下命令获取, 前提是连接手机、打开USB调试:

adb devices -l

后两个参数请移步:获取appPackage和appActivity

开启安卓的" 开发者选项、USB调试 "

测试之前,确保打开 开发者选项、USB调试。开发者模式确保调试程序在手机安装辅助软件:Unlock, Appium Settings;USB调试主要是利用Appium内置驱动打开APP。此外,要保持屏幕常亮。

5. 节点ID或XPATH值获取

安卓微信节点获取,相对比较容易获取,比如获取"登录"ID值,启动Session后只需点击屏幕左侧安卓屏的登录按钮,中间就会自动定位到所在节点,最右侧还会显示该节点的所有属性。如图:

对于文本输入框,只需要点击最右侧的"send text"即可。

"是否匹配通讯录"

这里选择"否", 理由:重新登录进入微信后会自动加载本地数据,耗时较长,如果匹配通讯录好友,增加耗时,可能在TIMEOUT时间内获取不到节点,导致程序终止。我这里选择了"是", 如图:

朋友圈信息获取思路

获取当前显示的朋友圈每条状态对应的区块元素,遍历每个区块元素,再获取内部显示的用户名、正文、发布时间,代码如下:

# items存储当前页面所有发布的朋友圈信息

items = self.wait.until(

EC.presence_of_all_elements_located(

# 每个ej9节点对应一条朋友圈数据

(By.XPATH, '//*[@resource-id="com.tencent.mm:id/ej9"]/android.widget.LinearLayout')))

for item in items:

try:

# 昵称

nickname = item.find_element_by_id('com.tencent.mm:id/b5o').get_attribute('text')

# 正文

content = item.find_element_by_id('com.tencent.mm:id/ejc').get_attribute('text')

# 日期

date = item.find_element_by_id('com.tencent.mm:id/eec').get_attribute('text')

# 处理日期

date = self.processor.date(date)

data = {

'nickname': nickname,

'content': content,

'date': date,

}

日期处理

日期处理的实现方式,代码如下:

class Processor():

def date(self, datetime):

"""

格式化时间

:param date: 原始时间

:return: 处理后时间

"""

if re.match('\d+分钟前', datetime):

minute = re.match('(\d+)', datetime).group(1)

datetime = time.strftime('%Y-%m-%d', time.localtime(time.time() - float(minute) * 60))

if re.match('\d+小时前', datetime):

hour = re.match('(\d+)', datetime).group(1)

datetime = time.strftime('%Y-%m-%d', time.localtime(time.time() - float(hour) * 60 * 60))

if re.match('昨天', datetime):

datetime = time.strftime('%Y-%m-%d', time.localtime(time.time() - 24 * 60 * 60))

if re.match('\d+天前', datetime):

day = re.match('(\d+)', datetime).group(1)

datetime = time.strftime('%Y-%m-%d', time.localtime((time.time()) - float(day) * 24 * 60 * 60))

return datetime

完整代码

注意事项:

代码中所有节点都须提前通过 Appium新建Session获取(亲测同版本的微信中vivo_x7和Mi_8节点相同,其余机型未知)

建议使用高性能手机测试(MI_8|MI_9等)

运行结果

### 三级标题:移动应用程序数据爬取方法与工具 在爬取移动应用程序(App)的数据时,通常需要通过中间人(MITM)技术拦截设备与服务器之间的通信。常见的方法是使用抓包工具,如 `mitmproxy`,它允许开发者设置代理,从而捕获和分析网络请求与响应。手机和PC需处于同一局域网内,并将代理设置为 `mitmproxy` 的地址,这样数据流经抓包工具时即可被捕获和处理[^3]。 为了自动化处理这些请求和响应,可以使用 `mitmdump` 工具,它是 `mitmproxy` 的命令行版本,能够将捕获的数据直接通过 Python 脚本进行处理。这种方式非常适合自动化爬虫任务,因为可以实时解析、修改和存储数据到本地或数据库中。 此外,还可以使用跨平台的移动端自动化测试工具,如 `Appium`,来进行更复杂的自动化爬取任务。`Appium` 支持 Android 和 iOS 平台,并允许通过 WebDriver 协议控制真实设备或模拟器。这使得在 App 中执行自动化操作(如点击按钮、滑动屏幕、输入文本等)变得非常简单,从而可以获取动态加载的数据。 在实际开发中,可能会遇到一些反爬虫机制,如 SSL Pinning(证书绑定)等。这时可以使用 `Frida` 或 `Objection` 等工具进行动态调试和 Hook 操作,绕过这些防护措施,从而成功抓取数据。 ### 示例代码:使用 mitmdump 处理请求 下面是一个简单的示例代码,展示如何使用 `mitmdump` 拦截 HTTP 请求并打印请求 URL 和响应内容: ```python from mitmproxy import http def request(flow: http.HTTPFlow) -> None: # 打印请求的URL print(f"Request URL: {flow.request.url}") def response(flow: http.HTTPFlow) -> None: # 打印响应内容 print(f"Response Text: {flow.response.text[:200]}...") # 只打印前200个字符 ``` 将上述代码保存为 `dump.py`,然后通过以下命令启动 `mitmdump`: ```bash mitmdump -s dump.py ``` ### 三级标题:常见工具与技术 - **mitmproxy / mitmdump**:用于拦截 HTTPS 请求,支持 Python 脚本扩展功能,适合自动化处理请求和响应。 - **Appium**:跨平台的移动端自动化测试工具,可用于模拟用户操作,适用于复杂的 App 数据爬取。 - **Frida / Objection**:用于动态调试和 Hook 技术,能够绕过 SSL Pinning 和其他反爬虫机制。 - **Charles / Fiddler**:图形化抓包工具,适合调试和分析网络请求,但在自动化处理方面不如 `mitmproxy` 灵活。 - **ADB (Android Debug Bridge)**:用于与 Android 设备进行通信,可以配合其他工具实现自动化操作。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值