階教程:元素屬性動(dòng)態(tài)變化的通配策略——正則與contains組合)
影刀RPA進(jìn)階教程元素屬性動(dòng)態(tài)變化的通配策略——正則與contains組合做電商采集最絕望的瞬間是流程昨天還跑得好好的今天一運(yùn)行滿屏元素定位失敗。打開F12一看頁(yè)面結(jié)構(gòu)沒變變的是屬性——class后面多了個(gè)隨機(jī)后綴某個(gè)狀態(tài)值從active換成了checked元素還是那個(gè)元素屬性已經(jīng)不是那批屬性了。我維護(hù)的抖音和淘寶采集流程平均每?jī)芍芫蜁?huì)遇到一次屬性動(dòng)態(tài)變化。后來我在影刀RPA的元素編輯里把正則表達(dá)式和通配符用熟了這個(gè)問題就從災(zāi)難變成了五分鐘的例行維護(hù)。官方文檔里專門有一篇講正則表達(dá)式和全局變量在元素編輯中的應(yīng)用這篇教程我結(jié)合自己兩個(gè)月的實(shí)戰(zhàn)把通配策略講透。核心思路一句話屬性會(huì)變的部分不寫死用正則圈定范圍用contains抓穩(wěn)定片段。動(dòng)手前確認(rèn)環(huán)境影刀RPA客戶端更新到最新版通配符和正則匹配在舊版本上有過行為不一致的記錄插件狀態(tài)正常后先在元素編輯界面點(diǎn)校驗(yàn)按鈕確認(rèn)你的影刀RPA能吃下正則語(yǔ)法再大規(guī)模改造元素。元素定位四合一的進(jìn)階視角屬性匹配的三檔武器先復(fù)習(xí)定位四件套的關(guān)系。捕獲元素、CSS選擇器、XPath選擇器解決怎么找到元素而當(dāng)元素屬性動(dòng)態(tài)變化時(shí)真正起作用的是屬性匹配的三檔武器武器靈活度適用場(chǎng)景精確匹配零屬性完全固定contains/通配符中局部固定局部變正則表達(dá)式高規(guī)律復(fù)雜或多狀態(tài)影刀RPA的元素編輯中所有屬性都支持通配符和正則表達(dá)式這一點(diǎn)是官方文檔白紙黑字寫的也是這篇所有玩法的地基。屬性匹配方式在下拉里切換純文本、通配符、正則。狀態(tài)切換陷阱用一個(gè)正則排除法鎖定元素先看官方文檔里的原始案例這個(gè)例子我原樣復(fù)刻過。頁(yè)面上有個(gè)復(fù)選框勾選時(shí)屬性是CBX_active_18l33c8不勾選時(shí)是CBX_18l33c8怎么讓一個(gè)元素同時(shí)匹配勾選和不勾選兩種狀態(tài)笨辦法是捕獲兩個(gè)元素分別處理頁(yè)面一多就崩。正則解法一行搞定# 匹配所有不包含 active 的字符串元素編輯屬性框里直接填 ^((?!active).)*$ # 同時(shí)排除多個(gè)關(guān)鍵字的寫法排除disabled、prev、diff三個(gè)  ^((?!disabled|prev|diff).)*$^((?!active).)*$讀法是從頭到尾任何一個(gè)位置都不出現(xiàn)active豎線隔開就能一次排除一堆關(guān)鍵字。我把這條正則設(shè)為該屬性的匹配條件后復(fù)選框不管勾沒勾選都能穩(wěn)定校驗(yàn)到狀態(tài)判斷改用【獲取元素屬性】指令讀取屬性值再用If判斷文本里是否包含active——定位歸定位判斷歸判斷兩條線分開走穩(wěn)定性翻倍。這個(gè)排除法正則我后來用到了十幾個(gè)場(chǎng)景排除廣告位的-sponsored后綴、排除禁用按鈕的disabled、排除隱藏元素的hidden全是同一套模板換關(guān)鍵字。contains組合拳XPath里的穩(wěn)定片段抓取XPath這邊的對(duì)應(yīng)武器是contains和starts-with。動(dòng)態(tài)class通常長(zhǎng)這樣btn-3f8a2-primary中間的哈希每次刷新都變但前綴btn-和后綴primary是穩(wěn)的。# 捕獲元素class前綴穩(wěn)定、后綴隨機(jī)的提交按鈕 //button[starts-with(class,btn-) and contains(class,primary)] # 捕獲元素class含多個(gè)動(dòng)態(tài)片段只錨定最穩(wěn)定的那個(gè)詞 //div[contains(class,goods-card) and contains(class,selected)] # 捕獲元素id帶隨機(jī)后綴的列表容器 //*[starts-with(id,itemList_)] # 組合文本定位屬性會(huì)變但文本不變時(shí)錨定文本 //a[contains(class,btn) and contains(text(),立即搶購(gòu))]選型經(jīng)驗(yàn)屬性里只要存在一個(gè)永遠(yuǎn)不變的詞就用contains錨那個(gè)詞只有前綴或后綴穩(wěn)定用starts-with或ends-with思路兩個(gè)都變但整體規(guī)律可循才上正則。能用contains解決的不用正則正則調(diào)試成本更高。XPath里其實(shí)也有排除思路not加contains組合//div[not(contains(class,disabled))]選中所有不帶disabled的元素翻頁(yè)判斷時(shí)這是主力寫法。全局變量與fx把變量嵌進(jìn)元素屬性官方文檔給的第二個(gè)玩法是全局變量做元素屬性。新建全局變量后編輯元素時(shí)點(diǎn)屬性值后面的fx圖標(biāo)選擇全局變量這個(gè)屬性的值就變成了變量當(dāng)前的內(nèi)容。兩個(gè)典型用法我都跑在生產(chǎn)流程里用法一變量存固定值一套元素多點(diǎn)復(fù)用。建一個(gè)全局變量按鈕名稱元素的文本屬性綁它流程里先設(shè)變量為新聞再點(diǎn)擊再設(shè)為學(xué)術(shù)再點(diǎn)擊一個(gè)元素定義頂兩個(gè)用。校驗(yàn)時(shí)記得先給變量設(shè)默認(rèn)值或者暫時(shí)改回純文本否則校驗(yàn)階段匹配不到。用法二變量存正則一元素匹配多狀態(tài)。把全局變量的值設(shè)成(直|新)元素屬性綁定這個(gè)變量后匹配方式選正則這個(gè)元素就同時(shí)匹配直播和新聞兩類鏈接。官方文檔的示例就是用這個(gè)變量配合相似元素循環(huán)把頁(yè)面上兩類鏈接一次性全抓下來逐個(gè)點(diǎn)擊。變量?jī)?nèi)容匹配方式效果新聞純文本只匹配新聞(直|新)正則匹配直播和新聞^((?!active).)*$正則排除含active的屬性流程控制與翻頁(yè)動(dòng)態(tài)屬性的經(jīng)典戰(zhàn)場(chǎng)不確定總頁(yè)數(shù)的翻頁(yè)是通配策略的第一實(shí)戰(zhàn)場(chǎng)景。官方文檔給過明確思路下一頁(yè)按鈕可點(diǎn)擊時(shí)class不含disabled處于最后一頁(yè)時(shí)class包含disabled。寫成XPath就是# 捕獲元素可點(diǎn)擊狀態(tài)的下一頁(yè)按鈕 //a[text()下一頁(yè) and not(contains(class,disabled))] # 捕獲元素帶disabled的下一頁(yè)用于判斷終止 //a[text()下一頁(yè) and contains(class,disabled)]流程結(jié)構(gòu)用【W(wǎng)hile條件循環(huán)】循環(huán)條件是按鈕元素存在且不含disabled循環(huán)體內(nèi)抓數(shù)據(jù)加點(diǎn)擊翻頁(yè)。判斷元素是否存在用【判斷元素是否存在(web)】指令返回True或False直接喂給While。另一種頁(yè)碼式翻頁(yè)用【For次數(shù)循環(huán)】先抓共100頁(yè)的文本用【從文本中提取內(nèi)容】的正則\d提出數(shù)字循環(huán)次數(shù)設(shè)成這個(gè)數(shù)。提取和循環(huán)的組合在這里又用上了。網(wǎng)頁(yè)自動(dòng)化屬性變化疊加等待的正確姿勢(shì)屬性動(dòng)態(tài)變化的頁(yè)面往往加載也亂通配策略要和等待策略配套用。我的標(biāo)準(zhǔn)搭配是翻頁(yè)或操作后先【等待元素(web)】等新版塊容器出現(xiàn)容器出現(xiàn)后再做屬性判斷。等待的錨點(diǎn)元素本身也要用contains寫法不然等待環(huán)節(jié)就先失敗了。彈窗是另一個(gè)變量來源。有的彈窗出現(xiàn)后會(huì)給body加一個(gè)class導(dǎo)致原有元素校驗(yàn)不過。處理順序沿用官方那套回車、Esc、刷新、點(diǎn)空白、Tab加回車測(cè)出有效的那招放在流程開頭先執(zhí)行。變量類型與數(shù)據(jù)處理抓回來的數(shù)據(jù)怎么接通配策略抓到的數(shù)據(jù)流進(jìn)變量后該清洗清洗該落表落表。我的順序是【寫入行數(shù)據(jù)到表格】前先用【文本替換】清一遍雜字符價(jià)格里的逗號(hào)、標(biāo)題里的換行都在這一步處理。批量抓取用【批量數(shù)據(jù)抓取(web)】指令配合extract_table邏輯返回二維表格后直接【寫入?yún)^(qū)域數(shù)據(jù)到表格】一次性落表比逐行寫快一個(gè)量級(jí)。鼠標(biāo)鍵盤圖像與進(jìn)階技能兜底與繞行屬性變得連正則都追不上時(shí)某些網(wǎng)站每次構(gòu)建class全變及時(shí)止損換路線圖像識(shí)別點(diǎn)擊兜底【HTTP請(qǐng)求】指令直接調(diào)接口繞開頁(yè)面。接口返回JSON用【JSON解析】指令拆字段比任何屬性匹配都穩(wěn)定。抖音類站點(diǎn)class哈希每天換我最終方案就是接口加JSON通配策略做二線備用。OCR也是兜底選項(xiàng)【截圖】加OCR文字識(shí)別拿到文本再正則提取圖片渲染的價(jià)格就靠這條路抓。平臺(tái)實(shí)戰(zhàn)抖音商品頁(yè)的通配改造實(shí)錄拿我真實(shí)改過的抖音商品采集流程舉例。原版元素錨定class“goods-title-xxxx”xxxx是構(gòu)建哈希三天兩頭失效。改造三步元素class匹配改成contains錨goods-title哈希部分不再參與匹配加一層正則排除^((?!hidden).)*$把隱藏狀態(tài)的元素排除掉列表容器用starts-with錨id前綴子元素相對(duì)容器定位減少獨(dú)立錨點(diǎn)數(shù)量改造后連續(xù)跑了六周只維護(hù)過一次網(wǎng)站改版換了前綴詞。通配策略不是一勞永逸但它把每天修變成了偶爾修這就是它最大的價(jià)值。系統(tǒng)聯(lián)動(dòng)與工程化規(guī)范策略的長(zhǎng)期維護(hù)通配策略的元素定義要在工程層面管理命名規(guī)范平臺(tái)_頁(yè)面_元素每個(gè)動(dòng)態(tài)屬性旁邊加批注寫明正則的含義和上次失效日期。失效的元素我用飛書機(jī)器人通知自己——【發(fā)送飛書消息】在流程異常時(shí)推消息附上失敗子流程名我在手機(jī)上就知道哪里要修。定時(shí)任務(wù)跑的流程建議把元素校驗(yàn)做成子流程自檢開工前先跑一遍核心元素的存在性檢查全過再正式采集不過就發(fā)通知終止避免跑一半留一堆臟數(shù)據(jù)。易錯(cuò)速查表現(xiàn)象原因解法正則排除法不生效匹配方式?jīng)]切成正則屬性匹配方式下拉選正則變量綁屬性后校驗(yàn)失敗變量沒有默認(rèn)值先設(shè)默認(rèn)值或暫改純文本contains錨的詞也失效網(wǎng)站換了命名前綴批注里記錄并更新錨詞not contains誤殺目標(biāo)class里有同名字段換更長(zhǎng)的特征詞通配后匹配到多個(gè)元素范圍放太寬疊加父容器限定再篩延伸閱讀抖音商品頁(yè)通配改造前后的完整對(duì)比源碼還有我整理的12條常用屬性正則清單放在代碼倉(cāng)庫(kù) home.linyan.cloud可以直接參考改造。官方文檔正則表達(dá)式和全局變量在元素編輯中的應(yīng)用是本篇的方法論源頭配合食用效果最好。屬性會(huì)變不可怕可怕的是每次都重捕獲重調(diào)試。把正則、contains、全局變量這三樣練成肌肉記憶你寫的流程就從嬌氣變成皮實(shí)這中間的差距就是新手和老手之間真正的分水嶺。#影刀RPA #RPA自動(dòng)化 #元素定位 #正則表達(dá)式 #抖音采集作者林焱