Python_Appium爬取wx朋友圈
生活随笔
收集整理的這篇文章主要介紹了
Python_Appium爬取wx朋友圈
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
目錄
- Appium爬取wx朋友圈
- 1、準備工作
- 2、爬取思路
Appium爬取wx朋友圈
- 用Appium實現微信朋友圈動態信息抓取,主要包括好友昵稱、正文、發布時間;其中正文這一部分我并沒有爬取下來;
1、準備工作
- PC端安裝好Appium,Android開發環境和Python版本的Appium API,如何安裝Appium: https://blog.csdn.net/weixin_43411585/article/details/89277056
- 以及PyMongo庫,MongoDB,如何安裝MongoDB: https://blog.csdn.net/weixin_43411585/article/details/88833680
- Appium啟動App的方式有兩種:一種是用Appium內置的驅動器打開App,另一種是用Python程序來實現此操作
- 將Android手機通過數據線和運行Appium的PC相連,同時打開USB調試功能,確保PC連接到手機
- Appium如何使用
- 完整代碼見鏈接,其中一些參數查找可能因為機型不同而不同,具體可以先通過Appium內置驅動模擬操作一遍,看每個元素的標簽id是什么,而進行修改;主要是發現按鈕,朋友圈按鈕,昵稱,時間這四個元素,主要代碼
2、爬取思路
- (1)初始化配置,如驅動配置,MongoDB連接配置等class Moments():def __init__(self):"""初始化"""# 驅動配置self.desired_caps = {'platformName': PLATFORM,'deviceName': DEVICE_NAME,'appPackage': APP_PACKAGE,'appActivity': APP_ACTIVITY,'noReset': "True"}self.driver = webdriver.Remote(DRIVER_SERVER, self.desired_caps)self.client = MongoClient(MONGO_URL)self.db = self.client[MONGO_DB]self.collection = self.db[MONGO_COLLECTION]# 處理器self.processor = Processor()
- (2)模擬登陸,由于我在Appium驅動配置上加了參數:‘noReset’: “True”;數據不重置,所以模擬登陸這一步可以直接跳過,只要微信是登陸的,代碼運行的時候就是直接在已登錄狀態中;
- (3)直接選擇發現選項卡→朋友圈進入; def enter(self):"""進入朋友圈:return:"""# 選項卡time.sleep(15)tab = self.driver.find_elements(By.XPATH, '//*[@resource-id="com.tencent.mm:id/r4"]')[2]tab.click()time.sleep(15)# 朋友圈moments = self.driver.find_element(By.ID, 'android:id/title')moments.click()print("已進入朋友圈")
- (4)抓取動態,由于朋友圈需要拖動,才能看到更多內容,所以,這里需要模擬一個拖動的操作,進行循環;driver.swipe(300,1000,300,300);首先獲取點前顯示的朋友圈的每條狀態對應的區塊元素,遍歷每個區塊元素,再獲取內部顯示的用戶名,和發布時間; def crawl(self):"""爬取:return:"""for i in range(15):time.sleep(2)# 上滑self.driver.swipe(300, 1000, 300, 300)# 當前頁面顯示的所有狀態items = self.driver.find_elements(By.XPATH, '//*[@resource-id="com.tencent.mm:id/ej_"]')# 遍歷每條狀態for item in items:try:# 昵稱nickname = item.find_element(By.XPATH, '//*[@resource-id="com.tencent.mm:id/b5o"]').get_attribute('text')# # 正文# content = item.find_element(By.XPATH, '//*[@resource-id="com.tencent.mm:id/kt"]').get_attribute('text')## 日期date = item.find_element(By.XPATH, '//*[@resource-id="com.tencent.mm:id/eec"]').get_attribute('text')# 處理日期date = self.processor.date(date)print(nickname, date)data = {'nickname': nickname,# 'content': content,'date': date,}
- (5)對于時間顯示幾小時前或者幾分鐘前的,我們用正則匹配的方法來提取時間中的具體數值,再利用時間轉換函數實現時間的轉換;例如5分鐘前,這個方法先將5提取出來,用當前時間戳減去300即可得到發布的時間戳,然后再轉換為標準時間即可。class 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
- (6)最后調用MongoDB的API來實現爬取結果的存儲。為了去除重復,這里調用了update()方法,這個操作的關鍵點事第三個參數True,此參數設置為True,可以實現存在即更新。不存在則插入的操作實現如下所示:self.collection.update_one({'nickname': nickname}, {'$set': data}, True)
總結
以上是生活随笔為你收集整理的Python_Appium爬取wx朋友圈的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【C++实现】编译原理 免考小队 FIR
- 下一篇: Python爬虫——Cookie模拟登录