Python 教你如何批量獲取百度指數(shù)
之前我們還戲稱百度指數(shù)才是百度的良心之作!
如果想要批量獲取一些字段的百度指數(shù)時,就涉及數(shù)據(jù)獲取啦。
我查詢了很多資料,發(fā)現(xiàn)一些教程在獲取百度搜索指數(shù)的時候,使用的是爬蟲技術(shù),通過分析請求參數(shù)來獲取指數(shù)信息。一些教程提出了使用截圖進行,然后進行圖像識別,那么對于不懂這些技術(shù)的小伙伴該怎么進行指數(shù)的獲取呢?
本文將通過uiautomation來進行獲取,學(xué)好了這個技術(shù)你還可以對桌面系統(tǒng)進行自動化。
什么是uiautomation?
Microsoft UI 自動化是一個輔助功能框架,它使 Windows 應(yīng)用程序能夠提供和使用有關(guān)用戶界面 (UI) 的編程信息。它提供對桌面上大多數(shù) UI 元素的編程訪問。它使輔助技術(shù)產(chǎn)品(例如屏幕閱讀器)能夠向最終用戶提供有關(guān) UI 的信息并通過標準輸入以外的方式操作 UI。UI 自動化還允許自動化測試腳本與 UI 交互。
具體可以從以下鏈接中學(xué)習(xí):
https://docs.microsoft.com/en-us/dotnet/framework/ui-automation/ui-automation-overview?redirectedfrom=MSDN
當(dāng)然了先安裝:
pip install uiautomation
這個uiautomation庫并不是官方的,而是一個作者自己封裝的。感謝這位作者,大家可以從這個鏈接學(xué)習(xí):
https://github.com/yinkaisheng/Python-UIAutomation-for-Windows/
瀏覽器的啟動
由于我們是要基于UI來進行數(shù)據(jù)的獲取的,如果這個應(yīng)用程序不是使用微軟提供的標準控件來實現(xiàn)的就不能使用uiautomation,也就是說不支持UI框架應(yīng)用程序是不能使用Uiautomation了,比如 Chrome和基于Electron開發(fā)的應(yīng)用程序。但是也有解決辦法:啟動時添加參數(shù)--force-renderer-accessibility才能支持UIAutomation。
這里我們啟動Chrome并在百度搜索指數(shù)網(wǎng)址:
那么如何找到這個搜索框的位置和“開始搜索”的按鈕呢?
我們可以借助一個工具inspect.exe去尋找,雙擊這個程序之后,我們找到這個輸入框:
借助inspect可以看出當(dāng)前頁面的程序控件信息,如上圖可以看出,其Name為"請輸入您想查詢的關(guān)鍵詞",ControlType為UIA_EditControlTypeId,所以可以使用以下代碼實現(xiàn)我們的功能了,代碼中沒有進行控件查找超時的異常處理,大家可以自己添加。
import subprocess
import uiautomation as auto
def show_index_window():
print('root Control:', auto.GetRootControl())
chromePath = "C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe"
url = r'https://index.baidu.com/v2/index.html#/'
parameter = '--force-renderer-accessibility'
startmax = '-start-maximized'
run_cmd = chromePath + ' ' + url + ' ' + parameter + ' ' + startmax
subprocess.Popen(run_cmd)
mainWindow = auto.DocumentControl(ClassName='Chrome_RenderWidgetHostHWND')
if mainWindow.Name == '百度指數(shù)':
print('open success')
# 輸入"特斯拉"并點擊"開始探索按鈕"
edit = auto.EditControl(mainWindow, Name='請輸入您想查詢的關(guān)鍵詞')
try:
edit.SendKeys('特斯拉')
# editConttol.GetPattern(auto.PatternId.ValuePattern).SetValue('特斯拉')
except LookupError as ex:
return "find control time out "
# 點擊按鈕
# time.sleep(1)
textControl = auto.TextControl(mainWindow, Name='開始探索')
try:
print(textControl.Name)
except LookupError as ex:
return "find control time out "
rect = textControl.BoundingRectangle
print(rect)
left = rect.left
top = rect.top
right = rect.right
bottom = rect.bottom
# 進行點擊
# 作差取得控件中間位置也可
auto.Click(left + 10, top + 10)
這樣就自動進入到“特斯拉”百度指數(shù)詳情界面。
接下來我們就來提取其中的搜索指數(shù)數(shù)字信息。
提取指數(shù)信息
通過inspect發(fā)現(xiàn)搜索指數(shù)信息的控件是圖像類型的即,ControlType為ImageControl。因此打開開發(fā)者模式是無法提取到的。但是我們又需要里面的信息,我們這樣來操作:
因為這些數(shù)字是通過懸浮窗口才顯示的,我的做法是這樣的:先運行程序:
python D:\Python\Python38\Scripts\automation.py -t 8
然后切換到指數(shù)界面,將鼠標移動圖像曲線開始處的位置上比如2021-06-18那天的指數(shù)數(shù)據(jù)(也不一定是曲線)顯示指數(shù)信息上圖所示。然后可以在automation.py同一目錄出現(xiàn)控件信息文件@AutomationLog.txt。在這個控件信息文件中我們找到目標:
可以看出,目標數(shù)值24653就顯示出來了:
那么怎么將鼠標移動到開始的位置,很簡單。先獲取控件然后獲取屬性BoundingRectangle即可,跟上述點擊“開始探索”按鈕一樣。這里留給讀者自己實現(xiàn)。在不能直接獲取到目標控件的時候,可以先獲取某一個元素,比如“新聞頭條”等控件,然后獲取其父元素,在獲取子元素。
接下來我們就通過“新聞頭條”控件來獲取目標信息:
代碼如下:
# -*- coding: utf-8 -*-
import time
import uiautomation as auto
def get_index_baidu():
mainWindow = auto.PaneControl(ClassName='Chrome_WidgetWin_1')
if mainWindow.Exists(3,1):
handle = mainWindow.NativeWindowHandle
# auto.SetWindowTopmost(handle, 'True')
# auto.SwitchToThisWindow(handle)
auto.ShowWindow(handle, auto.SW.Maximize)
news = auto.ListItemControl(mainWindow, Name = '新聞頭條')
try:
print('news:',news)
# editConttol.GetPattern(auto.PatternId.ValuePattern).SetValue('特斯拉')
except LookupError as ex:
return "find control time out"
# 獲取父元素
f_new = news.GetParentControl()
ff_new = f_new.GetParentControl()
# 下一元素
target = ff_new.GetNextSiblingControl()
# 第一個子元素
target_z = target.GetChildren()[0]
# 等待元素加載
"""
這里調(diào)用鼠標移動到曲線上。
如果想要自動化,則需要獲取內(nèi)置控件的信息,然后通過坐標來移動。
"""
# 這里等待移動鼠標到曲線上
time.sleep(2)
f_target_z = target_z.GetChildren()[1]
target_son = f_target_z.GetChildren()
for each in target_son:
text_control = each.GetChildren()[0]
print(text_control.Name)
輸出結(jié)果如下:
2021-07-08 星期四
特斯拉
105,777
成功獲取
總結(jié)
UIautomation在自動化方面有著很廣泛的應(yīng)用,不僅可以對瀏覽器自動化而且還可以對一些可視化界面進行自動化。
網(wǎng)上的資料也不是很多,大家可以對源碼研究來進行更深的學(xué)習(xí),當(dāng)然了還得多實踐。
我們的文章到此就結(jié)束啦,如果你喜歡今天的Python 實戰(zhàn)教程,請持續(xù)關(guān)注Python實用寶典。
有任何問題,可以在公眾號后臺回復(fù):加群,回答相應(yīng)紅字驗證信息,進入互助群詢問。
原創(chuàng)不易,希望你能在下面點個贊和在看支持我繼續(xù)創(chuàng)作,謝謝!
點擊下方閱讀原文可獲得更好的閱讀體驗
Python實用寶典 (pythondict.com)
不只是一個寶典
歡迎關(guān)注公眾號:Python實用寶典
