昨天小帥b看到一些事情不順眼
有人偷換概念
忍不住就寫了一篇反諷 996 的
沒想到有些人看不懂
這就算了
還來罵我
早些時候關注我的小伙伴應該知道我第一時間就發過反對 996 的文章
哎~
不過也好
洗掉一些無腦假粉絲
“你個假粉絲,小帥b不是蔡徐坤”
好了
進入正題
上次
小帥b跟你說了如何安裝 Appium 的相關環境
以及讓它自動打開了手機上的微信App
python爬蟲23 | 手機,這次要讓你上來自己動了。這就是 Appium+Python 的牛x之處
相信你已經躍躍欲試
想要來爬取一些手機上的 APP 數據了
那么這次
小帥b就帶你爬取微信朋友圈的數據
接下來就是
友情提醒
本篇需要你先安裝好 Appium 相關環境才可以喲,如果你還沒安裝的話快點出門左轉,安裝完之后再來這里玩耍。
ok
首先我們要知道微信這個 apk 的包名和啟動頁的 Activity
將你的 Android 雞連接到電腦
在終端輸入 adb devices 確保你已經將你的雞連接到電腦
如果像上面這樣出現設備名稱就說明你連接上你的電腦了
如果你插進電腦之后還沒發現有任何設備名稱顯示
那就記得打開 USB 調試,多拔插幾次,總會連上的,這是過來人經驗
接着
在你的手機里面打開微信
然后打開你的終端輸入
adb shell
然后輸入
dumpsys activity | grep mFocusedActivity
這時候我們就獲取到微信的包名和啟動頁面的名稱了
我們還要知道我們的手機是什么版本的
輸入以下命令獲取
adb shell getprop ro.build.version.release
那么現在我們就知道了這些必要的信息了
desired_caps = {}
desired_caps['platformName'] = 'Android'
desired_caps['platformVersion'] = '5.1'
desired_caps['deviceName'] = '88CKBM622PAM'
desired_caps['appPackage'] = 'com.tencent.mm'
desired_caps['appActivity'] = '.ui.LauncherUI'
接下來
主要思路就是
自動開啟微信
模擬登錄微信
找到小帥b的朋友圈
把朋友圈的數據抓下來
想要模擬登錄
我們就需要獲取到微信的登錄按鈕這個元素
如何獲取呢?
在你安裝好的 sdkmanager 的 tool 目錄下
有一個叫做 uiautomatorviewer 的工具
windows用戶直接雙擊打開
ubuntu的話可以進入相應的目錄
用命令 ./uiautomatorviewer 行打開
~/android/tools/bin$ ./uiautomatorviewer
打開之后是這個鳥樣
我們點擊菜單欄的第二個圖標按鈕
這時候你就會發現
手機的屏幕被抓過來了
用鼠標點一下登錄按鈕你會看到
相應的資源信息都被定位到了
那么要讓它自動點擊登錄按鈕就簡單了
# 獲取到登錄按鈕后點擊
login_btn = self.wait.until(EC.element_to_be_clickable((By.ID, "com.tencent.mm:id/e4g")))
login_btn.click()
點擊登錄之后頁面是這樣的
我們要切換到用郵箱登錄
還是老樣子
我們獲取到按鈕,然后讓它點擊
# 獲取使用微信號登錄按鈕
change_login_btn = self.wait.until(EC.element_to_be_clickable((By.ID, "com.tencent.mm:id/cou")))
change_login_btn.click()
那么接下來就輸入賬號密碼了
恩
獲取到賬號和密碼的 EditText 和 登錄按鈕
然后自動輸入賬號密碼
最后點一下登錄
# 獲取輸入賬號元素並輸入
account = self.wait.until(EC.presence_of_element_located((By.XPATH, '//*[@resource-id="com.tencent.mm:id/cos"]/android.widget.EditText')))
account.send_keys("你的微信賬號")
# 獲取密碼元素並輸入
password = self.wait.until(EC.presence_of_element_located((By.XPATH, '//*[@resource-id="com.tencent.mm:id/cot"]/android.widget.EditText')))
password.send_keys("你的微信密碼")
# 登錄
login = self.wait.until(EC.element_to_be_clickable((By.ID, "com.tencent.mm:id/cov")))
login.click()
登錄之后會彈出一個界面
你願意把你的通訊錄授權給我嗎?
呵呵
no!
# 點擊去掉通訊錄提示框
no_btn = self.wait.until(EC.element_to_be_clickable((By.ID, "com.tencent.mm:id/az9")))
no_btn.click()
這樣
我們就成功登入微信了
接下來找到小帥b的微信
需要點擊上方的搜索按鈕
# 獲取到搜索按鈕后點擊
search_btn = self.wait.until(EC.element_to_be_clickable((By.ID, "com.tencent.mm:id/iq")))
search_btn.click()
這時候會出現輸入框
搜索小帥b本b
# 獲取搜索框並輸入
search_input = self.wait.until(EC.presence_of_element_located((By.ID, "com.tencent.mm:id/kh")))
search_input.send_keys("wistbean")
這時候會出現一個 item
沒錯
點擊頭像進去
# 點擊頭像進入
xiaoshuaib_btn = self.wait.until(EC.element_to_be_clickable((By.ID, "com.tencent.mm:id/py")))
xiaoshuaib_btn.click()
接下來幾步都是一個道理
主要是進入小帥b的朋友圈
# 點擊右上角...進入
menu_btn = self.wait.until(EC.element_to_be_clickable((By.ID, "com.tencent.mm:id/jy")))
menu_btn.click()
# 再點擊頭像
icon_btn = self.wait.until(EC.element_to_be_clickable((By.ID, "com.tencent.mm:id/e0c")))
icon_btn.click()
# 點擊朋友圈
moment_btn = self.wait.until(EC.element_to_be_clickable((By.ID, "com.tencent.mm:id/d86")))
moment_btn.click()
就這樣點進去
進入朋友圈之后
我們來分析一下
可以看到小帥b的朋友圈是這樣的
我們需要滑動獲取到更多內容
可以使用 Appium 的 swipe 方法
再來
我們需要循環獲取到數據
可以看到每條朋友圈都被封裝到 ListView 這個容器里面
所以我們要從這里面獲取所有數據
然后再進行遍歷
那么每一個具體的條目呢?
可以看到
數據被放在了 LinearLayout 的具體容器里面了
所以我們可以根據 id 獲取相應的內容
# 獲取 FrameLayout
items = self.wait.until(EC.presence_of_all_elements_located((By.ID, 'com.tencent.mm:id/eew')))
# 滑動
self.driver.swipe(self.start_x, self.start_y, self.end_x, self.end_y, 2000)
#遍歷獲取
for item in items:
moment_text = item.find_element_by_id('com.tencent.mm:id/kt').text
day_text = item.find_element_by_id('com.tencent.mm:id/eke').text
month_text = item.find_element_by_id('com.tencent.mm:id/ekf').text
print('抓取到小帥b朋友圈數據: %s' % moment_text)
print('抓取到小帥b發布時間: %s月%s' % (month_text, day_text))
至此
我們的代碼寫完了
來運行一下吧
首先打開 Appium
[Appium] Welcome to Appium v1.12.1
[Appium] Appium REST http interface listener started on 0.0.0.0:4723
接着運行爬取朋友圈的代碼
截取部分結果
微信啟動...
登錄成功...
搜索小帥b...
進入朋友圈...
抓取到小帥b朋友圈數據: 那天馬雲說:我從來沒碰過錢,我對錢沒興趣。
最近馬雲說:能 996 是一種福氣,我每天都 1212。
果然,有錢爸爸說話就是好聽。
抓取到小帥b發布時間: 4月月12
抓取到小帥b朋友圈數據: 有本事雙擊我頭像
抓取到小帥b發布時間: 4月月10
抓取到小帥b朋友圈數據: 剛點了外賣,小哥有點超時才送到。我倒不覺得有什么,可是小哥將餐物雙手遞給我后接下來的動作讓我驚訝到了:
他對我深深地鞠了一躬……😳
抓取到小帥b發布時間: 4月月01
抓取到小帥b朋友圈數據: 有人抱怨現在的互聯網產品太霸道,微信不能打開淘寶鏈接,頭條不能放微信二維碼,百度搜不到知乎高質量問題……
但其實出門看一下,好像也沒有哪家麥當勞可以直接開在肯德基里面賣全家桶的。
抓取到小帥b發布時間: 3月月29
抓取到小帥b朋友圈數據: 有人抱怨現在的互聯網產品太霸道,微信不能打開淘寶鏈接,頭條不能放微信二維碼,百度搜不到知乎高質量問題……
但其實出門看一下,好像也沒有哪家麥當勞可以直接開在肯德基里面賣全家桶的。
抓取到小帥b發布時間: 3月月28
抓取到小帥b朋友圈數據: 這兩天聽到最多的一句話就是:帥b老仙,法力無邊。
整的我差點以為自己有法力了……
抓取到小帥b發布時間: 3月月25
抓取到小帥b朋友圈數據: 誇誇群,寫幾個微信機器人放群里,搞點誇獎人的語句數據庫,根據用戶的話檢索一下,然后返回相應的誇獎語句。
嗯,然后把我自己放進群里,享受一頓誇,覺得不爽還可以繼續改那些誇我的話。
抓取到小帥b發布時間: 3月月22
抓取到小帥b朋友圈數據: 突然發現我好久好久沒有講潮汕話了...
抓取到小帥b發布時間: 3月月20
抓取到小帥b朋友圈數據: 誇誇群,寫幾個微信機器人放群里,搞點誇獎人的語句數據庫,根據用戶的話檢索一下,然后返回相應的誇獎語句。
嗯,然后把我自己放進群里,享受一頓誇,覺得不爽還可以繼續改那些誇我的話。
抓取到小帥b發布時間: 3月月15
抓取到小帥b朋友圈數據: 根據監管部門規定以及相關投訴
這條朋友圈無法觀看,但你可以點贊
抓取到小帥b發布時間: 3月月10
抓取到小帥b朋友圈數據: 之前想的是再好的產品也抵不過有強大 IP 支撐的破產品。
但現在想想,IP 也是產品的一部分。
抓取到小帥b發布時間: 3月月05
抓取到小帥b朋友圈數據: 之前想的是再好的產品也抵不過有強大 IP 支撐的破產品。
但現在想想,IP 也是產品的一部分。
抓取到小帥b發布時間: 3月月04
抓取到小帥b朋友圈數據: 9102了,還是有那么多 zf 的網站又丑又難用。
抓取到小帥b發布時間: 3月月01
...
ok
拿到數據還可以進一步存儲
小帥b就不說了
因為從下一篇開始
小帥b會說說爬取下來的數據存儲相關的
這一篇
主要讓你知道如何爬取 app 的數據
如果你想去抓包爬取朋友圈的數據
是很難的
微信做了限制
所以用 Appium 相對來說就簡單好多啦
本篇涉及到的源代碼一樣放在了公眾號
在后台發送 「朋友圈」獲取
下次見
peace
帥b老仙
法力無邊
相關文章
2、手機,這次要讓你上來自己動了。這就是 Appium+Python 的牛x之處
右下角
發功+1