NO.15——使用Appium自动化测试爬取微信朋友圈数据

news/2025/3/9 10:35:08/

     一、解析过程

本人使用锤子手机做测试,型号是YQ601,首先打开开发者模式确保手机能与mac相连,打开Appium客户端,配置参数如图


可以理解为Appuim继承自web端的selenium,同样可以执行一些自动化操作。Appium自带了一个XPATH选择器,给用户提供了选择结果,如图


这个选择器给出的结果太繁琐,所以可以改成通过查找ID的方式来构造爬虫程序。但是这里要注意,估计微信提升了自己的反爬能力,在测试时发现,每次重新连接手机,对应特定节点的ID都会发生变化,保险起见,每次重新连接手机,都要对节点ID作更新。

       这里把程序分为三部分:(1)模拟登陆(2)进入朋友圈(3)抓取动态(4)存入数据库

二、代码

import os
from appium import webdriver
from appium.webdriver.common.touch_action import TouchAction
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from pymongo import MongoClient
from time import sleep
from processor import Processor
from config import *class Moments():def __init__(self):"""初始化"""# 驱动配置self.desired_caps = {'platformName': PLATFORM,'deviceName': DEVICE_NAME,'appPackage': APP_PACKAGE,'appActivity': APP_ACTIVITY}self.driver = webdriver.Remote(DRIVER_SERVER, self.desired_caps)self.wait = WebDriverWait(self.driver, TIMEOUT)self.client = MongoClient(MONGO_URL)self.db = self.client[MONGO_DB]self.collection = self.db[MONGO_COLLECTION]# 处理器self.processor = Processor()def login(self):"""登录微信:return:"""# 登录按钮login = self.wait.until(EC.presence_of_element_located((By.ID, 'com.tencent.mm:id/d75')))login.click()# 手机输入phone = self.wait.until(EC.presence_of_element_located((By.ID, 'com.tencent.mm:id/hz')))phone.set_text(USERNAME)# 下一步next = self.wait.until(EC.element_to_be_clickable((By.ID, 'com.tencent.mm:id/alr')))next.click()# 密码password = self.wait.until(EC.presence_of_element_located((By.XPATH, '//*[@resource-id="com.tencent.mm:id/hz"][1]')))password.set_text(PASSWORD)# 提交submit = self.wait.until(EC.element_to_be_clickable((By.ID, 'com.tencent.mm:id/alr')))submit.click()# 是否查看通讯录yesORnot = self.wait.until(EC.element_to_be_clickable((By.ID, 'com.tencent.mm:id/an2')))yesORnot.click()def enter(self):"""进入朋友圈:return:"""# 选项卡tab = self.wait.until(EC.presence_of_element_located((By.XPATH, '//*[@resource-id="com.tencent.mm:id/b0w"][3]')))tab.click()# 朋友圈moments = self.wait.until(EC.presence_of_element_located((By.ID, 'com.tencent.mm:id/a7f')))moments.click()def crawl(self):"""爬取:return:"""while True:# 当前页面显示的所有状态items = self.wait.until(EC.presence_of_all_elements_located((By.XPATH, '//*[@resource-id="com.tencent.mm:id/d58"]//android.widget.FrameLayout')))# 上滑self.driver.swipe(FLICK_START_X, FLICK_START_Y + FLICK_DISTANCE, FLICK_START_X, FLICK_START_Y)# 遍历每条状态for item in items:try:# 昵称nickname = item.find_element_by_id('com.tencent.mm:id/as6').get_attribute('text')# 正文content = item.find_element_by_id('com.tencent.mm:id/ib').get_attribute('text')# 日期date = item.find_element_by_id('com.tencent.mm:id/dfw').get_attribute('text')# 处理日期date = self.processor.date(date)print(nickname, content, date)data = {'nickname': nickname,'content': content,'date': date,}# 插入MongoDBself.collection.update({'nickname': nickname, 'content': content}, {'$set': data}, True)sleep(SCROLL_SLEEP_TIME)except NoSuchElementException:passdef main(self):"""入口:return:"""# 登录self.login()# 进入朋友圈self.enter()# 爬取self.crawl()if __name__ == '__main__':moments = Moments()moments.main()
import time
import reclass Processor():def date(self, datetime):"""处理时间,转化成发布时间的时间戳:param datetime: 原始时间: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



http://www.ppmy.cn/news/424932.html

相关文章

xv6 6.S081 Lab8: fs

xv6 6.S081 Lab8: fs 写在前面实验介绍开始!Large FileSymbolic links fs代码在这里。我的妈呀,终于要写完了,xv6的file system考察难度并不大,这里强烈推荐我工Ext2 Based File System,这里可以给一下参考代码与参考结…

Walllys/DR6018-S IPQ6010/IPQ6018/IPQ6000

Walllys/DR6018-S IPQ6010/IPQ6018/IPQ6000 Quad-core ARM 64bit A53 1.8GHz Processor Support OpenWRT, Support:QCN9074 WiFi Card Support OpenWRT  IPQ6010  802.11ax  2x2 2.4G&5G  DR6018-S IPQ6010/IPQ6018/IPQ6000 Quad-core ARM 64bit A53 1.8GHz Processor…

Android 视频 美颜SDK对比

Android 视频 美颜小结 美颜SDK美颜的本质Android 视频 美颜SDK对比 美颜SDK 蓝色AR 优点:文档规范 技术支持及时 价格适中 缺点:问题较多 包集成偏大 涂图 特点:前YY团队成员,10W 优点: 缺点: 商汤 特点…

YY/T 9706.106-2021医用电气设备 第1-6部分:基本安全和基本性能的通用要求 并列标准:可用性

目录 一、YY/T 9706.106-2021替换YY/T 1474-2016 二、YY/T 9706.106-2021医用电气设备 第1-6部分:基本安全和基本性能的通用要求 并列标准:可用性 IEC60601-1-6:2013 MOD 三、YY/T 1474-2016医疗器械可用性工程对医疗器械的应用,YY/T 1…

INSTALL_FAILED_SHARED_USER_INCOMPATIBLE错误解决

调试程序时项目设置了UID,使用不同的签名出现 Target device: smartisan-yq601-3fa1a5dc Installing APK: /Users/wangliang/workspace/emm-android/build/outputs/apk/emm-android-debug.apk Uploading file to: /data/local/tmp/com.xxx.vvv Installing com.poly…

医疗器械YY0505-2012、YY9706.102-2021检测报告,EMC电磁兼容标准解析

前言 电磁兼容性(ElectromagneTIc CompaTIbility,EMC)是指设备或系统在其电磁环境中能正常工作且不对该环境中任何事物构成不能承受的电磁骚扰的能力[1-2]。电磁兼容性标准即是对设备或系统的这个能力提出的要求。对医…

GY-906

MLX90614 系列红外测温模块的原理及应用 南京航空航天大学 曾德志 摘要: MLX90614 系列模块是一组通用的红外测温模块。在出厂前该模块已进行校验及线 性化,具有非接触、体积小、精度高,成本低等优点。被测目标温度和环境温度能通过单通…

锤子yq601安装xposed框架

手机必须root,root后用奇兔刷机刷入奇兔的recovery这是用来刷入xposed框架的,官方recovery不支持 准备工作 1.下载一个对应的xposed框架,锤子yq601 5.1.1 可用框架传送,然后手机进入recovery刷入 2.下载一个xposed install apk&am…