基本环境配置版本: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,如图:
Desired Capabilites 参数
adb devices -l
开启安卓的' 开发者选项、USB调试 '测试之前,确保打开 开发者选项、USB调试。开发者模式确保调试程序在手机安装辅助软件:Unlock, Appium Settings;USB调试主要是利用Appium内置驱动打开APP。此外,要保持屏幕常亮。 5. 节点ID或XPATH值获取安卓微信节点获取,相对比较容易获取,比如获取'登录'ID值,启动Session后只需点击屏幕左侧安卓屏的登录按钮,中间就会自动定位到所在节点,最右侧还会显示该节点的所有属性。如图:
'是否匹配通讯录'这里选择'否', 理由:重新登录进入微信后会自动加载本地数据,耗时较长,如果匹配通讯录好友,增加耗时,可能在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 完整代码注意事项:
运行结果 |
|