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