Python_Appium爬取wx朋友圈
生活随笔
收集整理的這篇文章主要介紹了
Python_Appium爬取wx朋友圈
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
目錄
- Appium爬取wx朋友圈
- 1、準(zhǔn)備工作
- 2、爬取思路
Appium爬取wx朋友圈
- 用Appium實現(xiàn)微信朋友圈動態(tài)信息抓取,主要包括好友昵稱、正文、發(fā)布時間;其中正文這一部分我并沒有爬取下來;
1、準(zhǔn)備工作
- PC端安裝好Appium,Android開發(fā)環(huán)境和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內(nèi)置的驅(qū)動器打開App,另一種是用Python程序來實現(xiàn)此操作
- 將Android手機通過數(shù)據(jù)線和運行Appium的PC相連,同時打開USB調(diào)試功能,確保PC連接到手機
- Appium如何使用
- 完整代碼見鏈接,其中一些參數(shù)查找可能因為機型不同而不同,具體可以先通過Appium內(nèi)置驅(qū)動模擬操作一遍,看每個元素的標(biāo)簽id是什么,而進(jìn)行修改;主要是發(fā)現(xiàn)按鈕,朋友圈按鈕,昵稱,時間這四個元素,主要代碼
2、爬取思路
- (1)初始化配置,如驅(qū)動配置,MongoDB連接配置等class Moments():def __init__(self):"""初始化"""# 驅(qū)動配置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驅(qū)動配置上加了參數(shù):‘noReset’: “True”;數(shù)據(jù)不重置,所以模擬登陸這一步可以直接跳過,只要微信是登陸的,代碼運行的時候就是直接在已登錄狀態(tài)中;
- (3)直接選擇發(fā)現(xiàn)選項卡→朋友圈進(jìn)入; def enter(self):"""進(jìn)入朋友圈: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("已進(jìn)入朋友圈")
- (4)抓取動態(tài),由于朋友圈需要拖動,才能看到更多內(nèi)容,所以,這里需要模擬一個拖動的操作,進(jìn)行循環(huán);driver.swipe(300,1000,300,300);首先獲取點前顯示的朋友圈的每條狀態(tài)對應(yīng)的區(qū)塊元素,遍歷每個區(qū)塊元素,再獲取內(nèi)部顯示的用戶名,和發(fā)布時間; def crawl(self):"""爬取:return:"""for i in range(15):time.sleep(2)# 上滑self.driver.swipe(300, 1000, 300, 300)# 當(dāng)前頁面顯示的所有狀態(tài)items = self.driver.find_elements(By.XPATH, '//*[@resource-id="com.tencent.mm:id/ej_"]')# 遍歷每條狀態(tài)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)對于時間顯示幾小時前或者幾分鐘前的,我們用正則匹配的方法來提取時間中的具體數(shù)值,再利用時間轉(zhuǎn)換函數(shù)實現(xiàn)時間的轉(zhuǎn)換;例如5分鐘前,這個方法先將5提取出來,用當(dāng)前時間戳減去300即可得到發(fā)布的時間戳,然后再轉(zhuǎn)換為標(biāo)準(zhǔn)時間即可。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)最后調(diào)用MongoDB的API來實現(xiàn)爬取結(jié)果的存儲。為了去除重復(fù),這里調(diào)用了update()方法,這個操作的關(guān)鍵點事第三個參數(shù)True,此參數(shù)設(shè)置為True,可以實現(xiàn)存在即更新。不存在則插入的操作實現(xiàn)如下所示:self.collection.update_one({'nickname': nickname}, {'$set': data}, True)
總結(jié)
以上是生活随笔為你收集整理的Python_Appium爬取wx朋友圈的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【C++实现】编译原理 免考小队 FIR
- 下一篇: 北鼎推出新品全能T535烤箱:小kate