日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

用 Python 告诉你!最近 24 小时内朋友圈发生了什么

發(fā)布時(shí)間:2024/9/15 python 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 用 Python 告诉你!最近 24 小时内朋友圈发生了什么 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

點(diǎn)擊“小詹學(xué)Python”,選擇“置頂公眾號(hào)”

第一時(shí)間獲取 Python 技術(shù)干貨!

本文授權(quán)轉(zhuǎn)載自:AirPython


閱讀文本大概需要 10 分鐘。


1

目 標(biāo) 場(chǎng) 景


之前有一篇?文章?使用 Airtest 實(shí)現(xiàn)自動(dòng)看新聞薅羊毛這一操作,其實(shí) Airtest 功能遠(yuǎn)不止此。


App 上的幾乎所有的操作都可以通過(guò) Airtest 進(jìn)行模擬。


本文的目標(biāo),繼續(xù)使用Airtest模擬查看朋友圈的操作,并把之前 24 小時(shí)內(nèi)朋友圈發(fā)生的一切事情,包含圖片、視頻全都爬取到本地。?



2

準(zhǔn) 備 工 作


準(zhǔn)備工作上篇文章已經(jīng)介紹過(guò)了。同樣需要提前配置好 adb 環(huán)境,然后利用 pip/pip3 安裝 airtest 和 pocoui 兩個(gè)依賴庫(kù)。


#?安裝?airtestpip3?install?aritest#?安裝pocouipip3?install?pocoui
pip3?install?aritest

#?安裝pocoui
pip3?install?pocoui



3

分 析 思 路


我們需要實(shí)例化AndroidUiautomationPoco?對(duì)象,然后使用第三方工具獲取到微信客戶端的包名和初始 Activity 之后,就可以使用使用 adb 命令打開(kāi)微信客戶端。


#?微信客戶端的應(yīng)用包名package_name?=?'com.tencent.mm'#?微信客戶端的啟動(dòng)?Activityactivity?=?'com.tencent.mm.ui.LauncherUI'poco?=?AndroidUiautomationPoco(use_airtest_input=True,?screenshot_each_action=False)#?回到手機(jī)主界面home()#?殺死微信Appstop_app(package_name)#?打開(kāi)微信Appstart_my_app(package_name,?activity)#?進(jìn)入朋友圈的入口poco(text='發(fā)現(xiàn)').click()poco(text='朋友圈').click()
package_name?=?'com.tencent.mm'

#?微信客戶端的啟動(dòng)?Activity
activity?=?'com.tencent.mm.ui.LauncherUI'

poco?=?AndroidUiautomationPoco(use_airtest_input=True,?screenshot_each_action=False)

#?回到手機(jī)主界面
home()

#?殺死微信App
stop_app(package_name)

#?打開(kāi)微信App
start_my_app(package_name,?activity)

#?進(jìn)入朋友圈的入口
poco(text='發(fā)現(xiàn)').click()
poco(text='朋友圈').click()


進(jìn)入朋友圈主界面之后需要等待幾秒,待第一頁(yè)的元素全部加載完畢,就可以獲取我們需要的數(shù)據(jù)信息了。



首先我們獲取到第一頁(yè)可以看見(jiàn)的列表元素,通過(guò)遍歷,對(duì)其中我們需要的數(shù)據(jù),包含圖片、視頻、文字進(jìn)行存儲(chǔ)。


#?朋友圈動(dòng)態(tài)列表元素head_dynamic_moods?=?poco("com.tencent.mm:id/ebi").child(name='com.tencent.mm:id/efo')for?head_dynamic_mood?in?head_dynamic_moods:?? #?昵稱(chēng)?? nickname_element?=?head_dynamic_mood.offspring('com.tencent.mm:id/b4o')?? #?動(dòng)態(tài)?? dynamic_mood_element?=?head_dynamic_mood.offspring('com.tencent.mm:id/efs')?? #?發(fā)布時(shí)間?? #?注意:如果發(fā)布時(shí)間元素還沒(méi)有拖動(dòng)上來(lái),這里可能就為空?? pub_time_element?=?head_dynamic_mood.offspring('com.tencent.mm:id/eay')???? #?圖片【可以有多個(gè)】?? image_element?=?head_dynamic_mood.offspring('com.tencent.mm:id/efe')?? #?視頻【只能有一個(gè)】?? video_element?=?head_dynamic_mood.offspring('com.tencent.mm:id/ao4')
head_dynamic_moods?=?poco("com.tencent.mm:id/ebi").child(name='com.tencent.mm:id/efo')

for?head_dynamic_mood?in?head_dynamic_moods:
?? #?昵稱(chēng)
?? nickname_element?=?head_dynamic_mood.offspring('com.tencent.mm:id/b4o')

?? #?動(dòng)態(tài)
?? dynamic_mood_element?=?head_dynamic_mood.offspring('com.tencent.mm:id/efs')

?? #?發(fā)布時(shí)間
?? #?注意:如果發(fā)布時(shí)間元素還沒(méi)有拖動(dòng)上來(lái),這里可能就為空
?? pub_time_element?=?head_dynamic_mood.offspring('com.tencent.mm:id/eay')

??
?? #?圖片【可以有多個(gè)】
?? image_element?=?head_dynamic_mood.offspring('com.tencent.mm:id/efe')

?? #?視頻【只能有一個(gè)】
?? video_element?=?head_dynamic_mood.offspring('com.tencent.mm:id/ao4')


如果圖片元素存在,那么就表示這條數(shù)據(jù)是一條包含圖片的動(dòng)態(tài)數(shù)據(jù)。



我們需要從圖片父元素中獲取到所有圖片子元素。



if?image_element.exists():??????#?這是一條圖片動(dòng)態(tài)??????#?所有圖片子元素??????image_children?=?image_element.child()??????image_size?=?len(image_children)??????print('共有%d張圖片'?%?image_size)
??????#?這是一條圖片動(dòng)態(tài)
??????#?所有圖片子元素
??????image_children?=?image_element.child()

??????image_size?=?len(image_children)
??????print('共有%d張圖片'?%?image_size)


接下來(lái)就是遍歷所有圖片元素,然后點(diǎn)擊第一個(gè)圖片子元素進(jìn)入到圖片預(yù)覽界面。


然后使用long_click」方法實(shí)現(xiàn)長(zhǎng)按屏幕的操作,彈出保存圖片的彈出框。



最后獲取到保存圖片」按鈕,執(zhí)行點(diǎn)擊操作,這樣圖片就保存微信默認(rèn)的存儲(chǔ)目錄下了。


for?index,?image_child?in?enumerate(image_children):??????poco("android.widget.LinearLayout").offspring('com.tencent.mm:id/j7').long_click()???poco(text="保存圖片").click()in?enumerate(image_children):???
???poco("android.widget.LinearLayout").offspring('com.tencent.mm:id/j7').long_click()
???poco(text="保存圖片").click()


由于 adb 命令沒(méi)法按照修改時(shí)間對(duì)文件進(jìn)行排序,所以每次保存圖片之前都需要?jiǎng)h除微信文件夾,然后利用adb pull命令將圖片下載到 PC 端。


#?微信文件保存目錄WEI_XIN_FILE_PATH?=?'/storage/emulated/0/tencent/MicroMsg/WeiXin/'#?刪除手機(jī)端微信文件夾目錄os.popen('adb?shell?rm?-r?%s*'?%?path)#?拷貝文件夾內(nèi)的文件到pc端copy_last_pic_to_local(WEI_XIN_FILE_PATH,?adjunct_path)#?注意:使用adb沒(méi)法排序文件,為了準(zhǔn)確獲取文件,下載文件之前,需要提前刪除微信文件夾def?copy_last_pic_to_local(path,?folder):????"""?????從移動(dòng)端獲取到最新的一個(gè)圖片????:param?path:?手機(jī)上的文件目錄????:param?folder:PC端文件保存的目錄????:return:????"""????#?讀取目錄下的所有文件????r?=?os.popen('adb?shell?ls?%s'?%?path)????#?讀取命令行的輸出到一個(gè)list????infos?=?r.readlines()????#?文件名稱(chēng)????last_file_name?=?infos[0].strip('\r\n')????print(path?+?last_file_name)????print(folder)????if?not?os.path.exists(folder):????????os.makedirs(folder)????#?加上絕對(duì)路徑,把文件復(fù)制到本地文件夾中????os.popen('adb?pull?%s?%s'?%?(path?+?last_file_name,?folder))
WEI_XIN_FILE_PATH?=?'/storage/emulated/0/tencent/MicroMsg/WeiXin/'

#?刪除手機(jī)端微信文件夾目錄
os.popen('adb?shell?rm?-r?%s*'?%?path)

#?拷貝文件夾內(nèi)的文件到pc端
copy_last_pic_to_local(WEI_XIN_FILE_PATH,?adjunct_path)

#?注意:使用adb沒(méi)法排序文件,為了準(zhǔn)確獲取文件,下載文件之前,需要提前刪除微信文件夾
def?copy_last_pic_to_local(path,?folder):
????"""
?????從移動(dòng)端獲取到最新的一個(gè)圖片
????:param?path:?手機(jī)上的文件目錄
????:param?folder:PC端文件保存的目錄
????:return:
????"""

????#?讀取目錄下的所有文件
????r?=?os.popen('adb?shell?ls?%s'?%?path)
????#?讀取命令行的輸出到一個(gè)list
????infos?=?r.readlines()

????#?文件名稱(chēng)
????last_file_name?=?infos[0].strip('\r\n')

????print(path?+?last_file_name)
????print(folder)

????if?not?os.path.exists(folder):
????????os.makedirs(folder)

????#?加上絕對(duì)路徑,把文件復(fù)制到本地文件夾中
????os.popen('adb?pull?%s?%s'?%?(path?+?last_file_name,?folder))


ps:另外由于 adb 沒(méi)法對(duì)文件按修改時(shí)間進(jìn)行排序,為了保證獲取的圖片的準(zhǔn)確性,需要提前備份好微信文件夾的內(nèi)容。


一張圖片保存成功后,需要判斷這張圖片元素的索引,如果不是最后一張圖片,就需要向左滑動(dòng),切換到下一個(gè)圖片元素界面;否則,直接返回到動(dòng)態(tài)列表頁(yè)面。


#?如果是最后一張圖片元素,直接返回到動(dòng)態(tài)列表頁(yè)面if?index?==?image_size?-?1:???????keyevent("BACK")else:???????#?如果不是最后一張圖片元素,需要向左滑動(dòng),切換到下一張圖片???????poco.swipe([0.8,?0.5],?[0.2,?0.5],?duration=0.5)???????sleep(1)
if?index?==?image_size?-?1:
???????keyevent("BACK")
else:
???????#?如果不是最后一張圖片元素,需要向左滑動(dòng),切換到下一張圖片
???????poco.swipe([0.8,?0.5],?[0.2,?0.5],?duration=0.5)
???????sleep(1)


同理,遇到視頻的動(dòng)態(tài)元素的時(shí)候,也是需要點(diǎn)擊進(jìn)入視頻播放界面。


長(zhǎng)按視頻播放界面上點(diǎn)擊保存視頻按鈕,將視頻文件保存到微信默認(rèn)的文件夾內(nèi),最后使用 adb 命令將視頻文件拷貝到 PC 端。



另外,由于一條動(dòng)態(tài)只能發(fā)送一條視頻,保存完視頻文件之后,直接返回到動(dòng)態(tài)列表界面。


if?video_element.exists():?????#?點(diǎn)擊查看視頻?????video_element.click()?????#?長(zhǎng)按彈出保存視頻的對(duì)話框?????poco('com.tencent.mm:id/ae5').long_click()?????#?刪除微信默認(rèn)的文件夾目錄?????del_files(WEI_XIN_FILE_PATH)?????#?保存視頻?????poco(text='保存視頻').click()?????#?復(fù)制到PC端文件夾內(nèi)?????copy_last_pic_to_local(WEI_XIN_FILE_PATH,?adjunct_path)?????#?直接返回到動(dòng)態(tài)列表頁(yè)面?????keyevent('BACK')
?????#?點(diǎn)擊查看視頻
?????video_element.click()

?????#?長(zhǎng)按彈出保存視頻的對(duì)話框
?????poco('com.tencent.mm:id/ae5').long_click()

?????#?刪除微信默認(rèn)的文件夾目錄
?????del_files(WEI_XIN_FILE_PATH)

?????#?保存視頻
?????poco(text='保存視頻').click()

?????#?復(fù)制到PC端文件夾內(nèi)
?????copy_last_pic_to_local(WEI_XIN_FILE_PATH,?adjunct_path)

?????#?直接返回到動(dòng)態(tài)列表頁(yè)面
?????keyevent('BACK')


遍歷完某頁(yè)的動(dòng)態(tài)之后,需要滑動(dòng)到下一頁(yè),直達(dá)獲取到的一條動(dòng)態(tài)的發(fā)布時(shí)間是昨天,就停止爬取。


#?動(dòng)態(tài)發(fā)布時(shí)間pub_time?=?pub_time_element.get_text()if?pub_time?==?'昨天':??????print('這是一條昨天的動(dòng)態(tài),停止爬取。。。')??????return?False
pub_time?=?pub_time_element.get_text()

if?pub_time?==?'昨天':
??????print('這是一條昨天的動(dòng)態(tài),停止爬取。。。')
??????return?False


爬取數(shù)據(jù)的過(guò)程中,動(dòng)態(tài)列表中可能包含微信放置的廣告,需要通過(guò)元素特有的標(biāo)識(shí)進(jìn)行過(guò)濾。


?#?廣告標(biāo)識(shí)advertising_tips_element?=?head_dynamic_mood.offspring('com.tencent.mm:id/e_f')?#?廣告動(dòng)態(tài)篩除掉、沒(méi)有加載完全的元素篩除掉if?advertising_tips_element.exists()?or?not?pub_time_element.exists()?or?not?nickname_element.exists():??????continue
advertising_tips_element?=?head_dynamic_mood.offspring('com.tencent.mm:id/e_f')

?#?廣告動(dòng)態(tài)篩除掉、沒(méi)有加載完全的元素篩除掉
if?advertising_tips_element.exists()?or?not?pub_time_element.exists()?or?not?nickname_element.exists():
??????continue


等所有的動(dòng)態(tài)信息都爬取之后,將爬取的文字信息,包含昵稱(chēng)、內(nèi)容、發(fā)表時(shí)間寫(xiě)入到 csv 文件中。


def?write_to_csv(first,?format_values):????"""????寫(xiě)入到csv文件中????:return:?????"""????with?open('firends_circle.csv',?'a',?encoding='utf-8-sig',?newline='')?as?fp:????????#?1.創(chuàng)建一個(gè)dictwriter對(duì)象????????writer_dict?=?csv.DictWriter(fp,?headers)????????#?2.手動(dòng)寫(xiě)入標(biāo)題????????if?first:????????????writer_dict.writeheader()????????else:????????????#?3.寫(xiě)入數(shù)據(jù)????????????writer_dict.writerows(format_values)
????"""
????寫(xiě)入到csv文件中
????:return:?
????"""

????with?open('firends_circle.csv',?'a',?encoding='utf-8-sig',?newline='')?as?fp:

????????#?1.創(chuàng)建一個(gè)dictwriter對(duì)象
????????writer_dict?=?csv.DictWriter(fp,?headers)

????????#?2.手動(dòng)寫(xiě)入標(biāo)題
????????if?first:
????????????writer_dict.writeheader()
????????else:
????????????#?3.寫(xiě)入數(shù)據(jù)
????????????writer_dict.writerows(format_values)



4

結(jié) 果 結(jié) 論


運(yùn)行程序后,微信會(huì)自動(dòng)打開(kāi),進(jìn)入到朋友圈主界面,然后對(duì)朋友圈內(nèi)的每一條動(dòng)態(tài)進(jìn)行數(shù)據(jù)采集,自動(dòng)滑動(dòng)手機(jī)屏幕直至采集完今天朋友圈的所有動(dòng)態(tài)數(shù)據(jù)。


當(dāng)然,也可以利用 Airtest 爬某個(gè)你特別關(guān)心的人的歷年發(fā)表的所有動(dòng)態(tài),然后進(jìn)行數(shù)據(jù)分析,獲取到一個(gè)人的興趣、愛(ài)好等。



我已經(jīng)將全部源碼上傳到后臺(tái)上,公眾號(hào)后臺(tái)回復(fù)「?朋友圈?即可獲得。



推薦閱讀:

我拿 12 年 36 套四級(jí)真題做了什么 ?

Python | 擁有選擇權(quán) ,才擁有概率 。


總結(jié)

以上是生活随笔為你收集整理的用 Python 告诉你!最近 24 小时内朋友圈发生了什么的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。