日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2023/12/8 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 NO.15——使用Appium自动化测试爬取微信朋友圈数据 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

? ? ?一、解析過程

本人使用錘子手機做測試,型號是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

總結

以上是生活随笔為你收集整理的NO.15——使用Appium自动化测试爬取微信朋友圈数据的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产交换配乱淫视频免费 | 一区二区三区在线看 | 天天视频国产 | 国产精品入口麻豆九色 | 午夜精品美女久久久久av福利 | 免费在线观看一区二区三区 | 综合国产精品 | 久久人人爽爽 | 艳母在线视频 | 中文字幕乱码亚洲无线三区 | 探花视频在线观看 | 欧美一级性生活 | 草久久| 性天堂网| 香蕉av一区二区 | 国产精选久久久 | 欧美精品99 | 黄色免费网站视频 | 精品久久久久久久久久久久久久久 | 图书馆的女友在线观看 | 污视频在线免费 | 日韩成人精品一区二区三区 | 欧洲美熟女乱又伦 | 久久亚洲精品视频 | 成人免费视频网站在线看 | 欧美大片在线 | 色五丁香 | www视频在线观看免费 | 波多野结衣视频免费在线观看 | 97久久国产精品 | 一区二区三区视频在线播放 | 精品一区二区三区免费 | 97精品国产 | 漂亮人妻洗澡被公强 日日躁 | 超碰人人爱人人 | 福利视频一区二区三区 | 国产又大又黑又粗免费视频 | 亚洲精品99久久久久中文字幕 | 一道本在线观看视频 | 亚洲最大成人在线视频 | 一区二区高清在线观看 | 欧美在线中文字幕 | 深夜视频在线观看免费 | 亚洲免费观看 | 国产一区中文 | 亚洲最大的成人网 | 一区二区三区不卡在线 | 亚洲网站色 | 国产精品二区在线 | 欧美三级欧美成人高清 | 天降女子在线观看 | 免费欧美黄色片 | 福利小视频 | 99久久精品免费 | 天堂久久网 | 一区二区三区伦理片 | 国产色站| 日本道在线观看 | 69超碰| 2025国产精品视频 | 激情综合影院 | 精品成在人线av无码免费看 | 不卡视频在线 | 日本三区在线 | 97se视频 | 亚洲精品一区二三区 | 久久精品—区二区三区舞蹈 | 亚洲精品一卡二卡 | 污导航在线观看 | 欧美日韩在线第一页 | 国产69精品久久久久久久 | 精品一二三四 | 国产视频一区二区三 | 色片网站在线观看 | 麻豆黄色片 | 三级成人在线 | 日韩一级黄色录像 | 锕锕锕锕锕锕锕锕 | 亚洲专区视频 | 日本黄色播放器 | 日韩人妻无码精品久久免费 | 一区二区三区网 | 日韩在线91 | 日韩成人在线网站 | 国产精品扒开腿做爽爽爽男男 | 香蕉视频在线观看免费 | 又大又长粗又爽又黄少妇视频 | 日本午夜电影网站 | 九九小视频 | 久久精品国产露脸对白 | 中文字幕精品一二三四五六七八 | 免费看三级黄色片 | 久久亚洲欧洲 | k8yy毛片| 午夜小电影 | 亚洲精品在线91 | 国产亚洲激情 | 午夜影院在线观看 | 男女在线观看视频 |