python+appium爬取微信运动数据,并分析好友的日常步数情况
python+appium爬取微信運動數據,并分析好友的日常步數情況
聲明:僅供技術交流,請勿用于非法用途,如有其它非法用途造成損失,和本博客無關
目錄
- python+appium爬取微信運動數據,并分析好友的日常步數情況
- 前言
- 一、準備
- 二、爬取數據
- 思維導圖(爬取邏輯)
- 第一步:連接手機
- 第二步:元素定位
- 第三步:編寫代碼
- 三、數據分析
- 第一步、數據預處理
- 第二步、數據探索性分析
- 第三步、數據可視化
- 第四步、結論
- 寫在最后
前言
廢話不多說,直接開始
一、準備
二、爬取數據
思維導圖(爬取邏輯)
第一步:連接手機
我這里連接了我自己的真機,安卓模擬器我沒裝不清楚具體細節請諒解。用USB將電腦和手機連上后,首先要打開手機的USB調試,大致都在:設置——>開發者選項——>開啟USB調試
appium的教程網上也都能找得到,也不難,基本上會selenium的都能一下子學會appium。而appium會依賴Android環境,那么這里給出兩個要用到的adb命令:
- linux/mac
- windows
然后在cmd中輸入上述命令獲取手機的設備名、再者進入微信,輸入命令獲取包名和界面名。(好像不同手機不同版本的包名和界面名會有所差異)
第二步:元素定位
我這里用的查找元素定位工具是安裝Android SDK自帶的uiautomatorviewer工具。具體在你安裝的Android SDK目錄下:tools目錄——>uiautomatorviewer.bat
元素主要是通過resource-id標簽來定位,用到的主要是xpath語句,具體定位內容請看代碼。
好像不同手機不同版本的resource-id也會有所差異,所以盡量不要復制代碼直接運行哈,自己動手豐衣足食。
第三步:編寫代碼
運行代碼前的準備:自己先打開微信,然后進入消息的頁面,并把微信運動置頂,這樣是為了減少不必要的操作。
ps:詳情講解請看代碼和代碼注釋
from appium import webdriver from selenium.webdriver.support.ui import WebDriverWait from appium.webdriver.common.touch_action import TouchAction import parsel #解析頁面 import datetime import timedef crawl(desired_caps,date_out):driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)wait=WebDriverWait(driver,20,4) #設置顯示等待,即在20秒的時間內,每隔4秒找一次元素,這個按需更改TouchAction(driver).tap(element=wait.until(lambda x : x.find_element_by_xpath('//*[@text="微信運動"]'))).perform()data={} #存儲每個排行榜的信息num=0 #給日期計數sj=int(time.time()) #記錄開始爬取數據開始的時間while True:start_time=int(time.time()) #記錄本次爬取開始的時間up_el=driver.find_elements_by_id('com.tencent.mm:id/ai')[0] #捕獲上一個排行榜時間的元素low_el=driver.find_elements_by_id('com.tencent.mm:id/ai')[1] #捕獲當前排行榜時間的元素if num != 0:driver.drag_and_drop(up_el,low_el) #拖動上一個元素的位置到當前元素的位置date=(datetime.datetime.now()-datetime.timedelta(days=1+num)).strftime("%Y-%m-%d")name_list=[] #存儲姓名run_count_list=[] #存儲步數like_list=[] #存儲點贊數flag=1 #因為自己總是會出現在第一位,所以第一次滑要排除自己if date_out not in low_el.text:now=driver.find_elements_by_id('com.tencent.mm:id/atb')[2]TouchAction(driver).tap(element=now).perform() #點擊進入當前排行榜while True:if driver.find_elements_by_xpath('//*[@text="邀請朋友"]') == []: #判斷是否到底端了driver.swipe(480,1500,480,700,duration=2000) #這個也按你們實際情況來更改坐標吧,只要第一次滑完的時候要看到第一名的信息response=parsel.Selector(driver.page_source)if flag == 1:people=response.xpath('//*[@resource-id="com.tencent.mm:id/om"]')[1:] #第一次排除自己else:people=response.xpath('//*[@resource-id="com.tencent.mm:id/om"]')for eachone in people:flag=0name=eachone.xpath('.//*[@resource-id="com.tencent.mm:id/brk"]/@text').get() #注意這里用的是@text,而不是/text,之前我在這里都快絕望了,一直拿不到text的內容,最后給蒙出來了哈哈run_count=eachone.xpath('.//*[@resource-id="com.tencent.mm:id/bq8"]/@text').get()like=eachone.xpath('.//*[@resource-id="com.tencent.mm:id/bpy"]/@text').get()if (name not in name_list)and(name is not None):temp=[] #存儲步數和點贊數name_list.append(name)temp.append(run_count)temp.append(like)run_count_list.append(temp)item=dict(zip(name_list,run_count_list))data.update({date:item})else:breakprint(f'{date},有{len(name_list)}個好友開啟了他們的微信運動。本輪耗時:{int(time.time())-start_time}秒')num+=1driver.back() #返回else:print(f'再往后消息已過期。總耗時:{int(time.time())-sj}秒')breakdriver.quit() #退出return datadef save_data(data):json_str = json.dumps(data, indent=4,ensure_ascii=False)with open('data.json', 'w', encoding='utf-8') as f:f.write(json_str)def main(desired_caps,date_out):# 爬取數據data=crawl(desired_caps,date_out)# 保存數據save_data(data)if __name__ == '__main__':desired_caps={'platformName': 'Android', #操作系統'deviceName': '3c91eced', #設備名'platformVersion': '6.0.1', #版本號'appPackage': 'com.tencent.mm', #包名'appActivity': 'com.tencent.mm.ui.LauncherUI' #界面名}main(desired_caps,date_out='12月12日') #我的是12月12日之前的都已過期,你們按實際時間來更改這個日期就行運行完之后呢,會在當前目錄下生成一個data.json的文件,這就是爬下來的全部數據啦
輸出如下:
2020-01-10,有135個好友開啟了他們的微信運動。本輪耗時:59秒 2020-01-09,有135個好友開啟了他們的微信運動。本輪耗時:61秒 2020-01-08,有135個好友開啟了他們的微信運動。本輪耗時:62秒 2020-01-07,有134個好友開啟了他們的微信運動。本輪耗時:61秒 2020-01-06,有134個好友開啟了他們的微信運動。本輪耗時:62秒 2020-01-05,有132個好友開啟了他們的微信運動。本輪耗時:60秒 2020-01-04,有133個好友開啟了他們的微信運動。本輪耗時:60秒 2020-01-03,有133個好友開啟了他們的微信運動。本輪耗時:60秒 2020-01-02,有132個好友開啟了他們的微信運動。本輪耗時:60秒 2020-01-01,有134個好友開啟了他們的微信運動。本輪耗時:62秒 2019-12-31,有134個好友開啟了他們的微信運動。本輪耗時:62秒 2019-12-30,有133個好友開啟了他們的微信運動。本輪耗時:59秒 2019-12-29,有134個好友開啟了他們的微信運動。本輪耗時:60秒 2019-12-28,有135個好友開啟了他們的微信運動。本輪耗時:62秒 2019-12-27,有135個好友開啟了他們的微信運動。本輪耗時:62秒 2019-12-26,有134個好友開啟了他們的微信運動。本輪耗時:61秒 2019-12-25,有135個好友開啟了他們的微信運動。本輪耗時:62秒 2019-12-24,有135個好友開啟了他們的微信運動。本輪耗時:61秒 2019-12-23,有134個好友開啟了他們的微信運動。本輪耗時:62秒 2019-12-22,有135個好友開啟了他們的微信運動。本輪耗時:63秒 2019-12-21,有136個好友開啟了他們的微信運動。本輪耗時:77秒 2019-12-20,有133個好友開啟了他們的微信運動。本輪耗時:68秒 2019-12-19,有134個好友開啟了他們的微信運動。本輪耗時:64秒 2019-12-18,有134個好友開啟了他們的微信運動。本輪耗時:64秒 2019-12-17,有133個好友開啟了他們的微信運動。本輪耗時:63秒 2019-12-16,有133個好友開啟了他們的微信運動。本輪耗時:61秒 2019-12-15,有133個好友開啟了他們的微信運動。本輪耗時:62秒 2019-12-14,有134個好友開啟了他們的微信運動。本輪耗時:63秒 2019-12-13,有135個好友開啟了他們的微信運動。本輪耗時:63秒 再往后消息已過期。總耗時:1819秒三、數據分析
首先先加載剛剛爬取到的數據和導入所需要的庫,以及設定一些默認的配置
import pandas as pd import random import json import os import matplotlib.pyplot as plt #畫圖工具 %matplotlib inline plt.rcParams['font.sans-serif'] = ['SimHei'] #黑體(顯示中文) plt.rcParams['font.size'] = 20 #字體大小 #加載json數據 with open('data.json','r',encoding='utf-8') as f:data=json.load(f)第一步、數據預處理
預處理主要是剔除異常值、空值、重復值等等,可是我覺得在這里,我并不想剔除這些數據,因為可以從這里看出哪些人什么時候開啟了微信運動,什么時候關閉了它,還有空值的話也可能是因為他沒有打開過微信甚至可能根本沒有上過網玩過手機都有可能。還有一種可能是找出他/她哪一天屏蔽了你的微信運動哈哈。
所以我這里就不做數據處理了,直接全部套用就ok
第二步、數據探索性分析
ps:考慮到隱私的問題,以下的圖片均已打碼
輸出如下:
ps:由于邊幅有限,這個就不上傳輸出了,跟第一名和倒數第一名的輸出差不多,有興趣自己運行看看吧
第三步、數據可視化
下面這個函數的用處是將柱狀圖中的每根柱子標上對應的數值,后面很多操作都用到這個函數,所以我把它單獨拿了出來
def autolabel(rects):for rect in rects:height = rect.get_height()plt.annotate('{}'.format(height),xy=(rect.get_x() + rect.get_width() / 2, height),xytext=(0,3), # 3 points vertical offsettextcoords="offset points",ha='center', va='bottom') name=df['第一名'].value_counts().index one_count=df['第一名'].value_counts().values plt.figure(figsize=(18,8)) a=plt.bar(name,one_count,label='次數') plt.ylabel('次數/次') plt.tick_params(axis='x', rotation=30) plt.title('第一名的次數') autolabel(a) plt.legend() plt.tight_layout() plt.savefig('第一名的次數.jpg') plt.show() name=df['倒數第一名'].value_counts().index daoshu_one_count=df['倒數第一名'].value_counts().values plt.figure(figsize=(18,8)) a=plt.bar(name,daoshu_one_count,color='red',label='次數') plt.ylabel('次數/次') plt.tick_params(axis='x', rotation=30) plt.title('倒數第一名的次數') autolabel(a) plt.legend() plt.tight_layout() plt.savefig('倒數第一名的次數.jpg') plt.show() name=df_ten['前十名的次數'].value_counts().index[:20] ten_count=df_ten['前十名的次數'].value_counts().values[:20] plt.figure(figsize=(18,8)) a=plt.bar(name,ten_count,label='次數') plt.ylabel('次數/次') plt.tick_params(axis='x', rotation=30) plt.title('前十名的次數(中的前20名)') autolabel(a) plt.legend() plt.tight_layout() plt.savefig('前十名的次數(中的前20名).jpg') plt.show() name=df_daoshu_ten['倒數前十名的次數'].value_counts().index[:20] daoshu_ten_count=df_daoshu_ten['倒數前十名的次數'].value_counts().values[:20] plt.figure(figsize=(18,8)) a=plt.bar(name,daoshu_ten_count,color='red',label='次數') plt.ylabel('次數/次') plt.tick_params(axis='x', rotation=30) plt.title('倒數前十名的次數(中的前20名)') autolabel(a) plt.legend() plt.tight_layout() plt.savefig('倒數前十名的次數(中的前20名).jpg') plt.show()輸出如下:
這里保存和輸出了所有人的這30天以來的運動趨勢情況,圖片有點多,就不一一列出來了,下面就隨便展示一個吧
下面我也隨機找兩個好友進行比較了一下,輸出如下:
第四步、結論
-
通過觀察第一名和倒數第一名、前十名和倒數前十名,并且看到了誰占的次數最多,大致可以猜出這些好友每天的運動即行走狀況,是幾萬步在外面兜兜轉轉很忙呢,還是寥寥幾百步甚至幾十步宅在家里面呢,看得一清二楚。(排除那些用工具來刷步數的情況,大致還是很準確的了)
-
還能看到點贊的數量,這個點贊我覺得就是看你的好友的好友是不是時常關注這個微信運動了,因為我覺得很少會去在意別人吧并且還給他/她點贊,這樣的行為我之前點贊過幾次之后就沒有再點過了,沒必要,主要還是懶哈啊哈。
-
再者通過觀察每個人的運動趨勢,也能清楚地知道好友們這30天里面的運動情況的。是毫無波動地持續一個月的幾千步呢,還是會有那么一兩天突然增高呢,再或者是跌宕起伏地像人生一樣呢,又或者走著走著步數變成了零呢(可能關閉了微信運動這個功能了)等等等等
-
可能我分析地還不夠全面,不夠細致,那就先這樣吧
寫在最后
為什么會去爬取微信運動信息并分析好友的運動情況呢?
一個原因:在很早之前,我就有過這個想法了,就想分析微信運動里好友們的運動情況,看看他們每一天是怎么過的,這其實是一件很好玩的事情嘻嘻。(我要我覺得,不要你覺得)
另一個原因:本來是想學appium的,因為想在手機上開發一些自動化的任務,比如日常簽到啊,爬數據啊,刷xx啊等等(你懂的),并且還可以配合一些抓包工具來完成一些別人爬不到的數據哈哈(只存在于手機中的那些數據)。可是呢,不知道為啥,我只能拿到與微信相關的頁面數據,其他的應用都不能拿到,拿不到頁面數據那就別想爬蟲了呀。我也百度找了很久,什么重裝環境啦,Android API版本更換啦,我都試過了,還是不行。(學appium還真的是從入門到放棄呢),所以就在我下定決心快要卸載所有和appium相關的東西的時候,我忍住了,內心想法是既然都入門了,不搞一下就放棄了?于是乎就有了這一篇文章。
ps:其實我也有爬取過朋友圈動態里面的數據的,只是因為拿不到圖片和視頻,只能拿文字,我就想沒有圖片和視頻那還爬什么呢,這些才是精華所在呀。(只是我個人看法,你們有興趣也可以自己去嘗試一番),對了,如果有Android大佬,可以幫我看下只能獲取到微信頁面數據,這是出了什么問題嗎?萬分感謝!
總結
以上是生活随笔為你收集整理的python+appium爬取微信运动数据,并分析好友的日常步数情况的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何在微信上直接打开淘宝,解决微信屏蔽淘
- 下一篇: 【PTA|Python】浙大版《Pyth