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