
在幾年前,互聯(lián)網(wǎng)上曾經(jīng)出現(xiàn)過一款生成朋友圈相冊(cè)的產(chǎn)品。但是它的流程說起來很不互聯(lián)網(wǎng):最開始聽起來覺得很牛逼,心想這款產(chǎn)品是怎么拿到個(gè)人的朋友圈數(shù)據(jù)的,直到看到它的使用流程首先需要添加微信好友,瞬間就笑著明白了。其實(shí),朋友圈一直是很多人的爬蟲想要采集的領(lǐng)地。在之前,朋友圈只能在手機(jī)或Pad上查看,要想獲取朋友圈的數(shù)據(jù),要么手工進(jìn)行人肉復(fù)制,要么通過鉤子進(jìn)行處理。這兩種操作一個(gè)太低端了,一個(gè)又太高端了。有沒有稍微簡(jiǎn)單一點(diǎn)的呢?用 Appnium 或許是一個(gè)方法,操作起來比鉤子簡(jiǎn)單多了,但是,Appnium 的環(huán)境配置,就會(huì)嚇跑很多朋友了。直到最近,微信電腦版開始支持朋友圈,事情似乎出現(xiàn)了轉(zhuǎn)機(jī)!所以可以通過 PyWinAuto 和 PyAutoGui 這兩個(gè)工具,實(shí)現(xiàn)對(duì)桌面程序的自動(dòng)化控制和數(shù)據(jù)采集。
這兩個(gè)工具,是否可以應(yīng)用在微信朋友圈數(shù)據(jù)的采集上呢?州的先生,立馬寫了個(gè) Demo 來測(cè)試。import psutil
import pywinauto
from pywinauto.application import Application
然后,我們通過 psutil 庫獲取到微信電腦版程序的進(jìn)程ID:PID = 0
for proc in psutil.process_iter():
try:
pinfo = proc.as_dict(attrs=['pid', 'name'])
except psutil.NoSuchProcess:
pass
else:
if 'WeChat.exe' == pinfo['name']:
PID = pinfo['pid']
這個(gè)進(jìn)程ID用來提供給 PyWinAuto 以連接微信電腦版。然后,用 PyWinAuto 實(shí)例化一個(gè)應(yīng)用:app = Application(backend='uia').connect(process=PID)
win = app['微信']
pyq_btn = win.child_window(title="朋友圈", control_type="Button")
cords = pyq_btn.rectangle()
pywinauto.mouse.click(button='left', coords=(cords.left + 10, cords.top + 10))
以上代碼,就實(shí)現(xiàn)了 Python 代碼控制微信電腦版打開朋友圈窗口。
朋友圈的窗口是打開了,如果獲取里面的數(shù)據(jù)呢?我們先用 .dump_tree() 方法看看朋友圈窗口里面各個(gè)控件的結(jié)構(gòu)是怎樣的:print(pyq_win.dump_tree())
這會(huì)把朋友圈窗口內(nèi)所有顯示出來的組件的結(jié)構(gòu)打印到控制臺(tái),其顯示的內(nèi)容如下圖所示:我們來看一個(gè)具體的例子,例如朋友圈內(nèi)的這條信息:它在 dump_tree() 中的結(jié)構(gòu)如下所示:
可以看到,窗口內(nèi)的每一個(gè)信息,比如聯(lián)系人的名稱、朋友圈內(nèi)容、朋友圈發(fā)布時(shí)間等等都是各種組件構(gòu)成的。我們可以通過獲取和控制這些個(gè)組件,來實(shí)現(xiàn)數(shù)據(jù)的提取。比如在這個(gè)例子里,我們就可以通過定位到 Edit 這個(gè)組件來獲取到這條朋友圈的內(nèi)容:跟其他的工具比起來,是不是算是異常簡(jiǎn)單了?
??分享、點(diǎn)贊、在看,求擴(kuò)散!??