
「AI Python 系列」第 03 欄 · Python 爬蟲實戰全欄 15 篇 · 零成本跟完 作者梅雅達編程筆記首發CSDN摘要有些網頁結構復雜到XPath根本寫不出來——嵌套表格、混合排版、圖文混排。這時候與其死磕HTML結構不如換個思路截圖讓視覺模型看圖說話。Day 13教你用GLM-4V-Flash視覺模型直接把頁面截圖扔給它讓它輸出你要的結構化數據。對比文本模型和視覺模型各自的適用場景讓你知道什么時候該用哪個。前面講了用文本模型處理 HTML。但有些頁面給你 HTML 也沒用表格嵌套了好幾層td里套div再套table數據散落在不同位置靠排版讓人看懂HTML 結構完全沒邏輯圖片里包含文字信息比如價格標簽是張圖片Canvas渲染的圖表數據這時候XPath、正則、甚至文本大模型都幫不了你。該請視覺模型上場了。一、視覺模型能做什么簡單說你給它一張圖片它告訴你圖片里有什么。GLM-4V-Flash 是智譜的免費視覺模型可以理解圖片內容并回答問題。我們的用法用DrissionPage把頁面截圖把截圖發給 GLM-4V-Flash讓模型從圖片中提取你要的結構化數據返回 JSON不用分析 HTML不用寫選擇器你看到什么AI 就能提取什么。二、基礎流程第一步頁面截圖用DrissionPage截圖fromDrissionPageimportChromiumPage pageChromiumPage()page.get(https://example-complex-table.com/)# 全屏截圖page.get_screenshot(pathpage_screenshot.png)# 或者只截某個區域注意page.ele 可能命中隱藏的布局表格# 建議遍歷找第一個有寬高的可見表格避免 NoRectErrorelementNoneforeleinpage.eles(css:table):try:w,hele.rect.sizeifwandhandw0andh0:elementelebreakexceptException:continueifelementisNone:page.get_screenshot(pathtable_only.png)# 兜底整頁截圖else:element.scroll.to_see()# 滾動到表格位置確保完整渲染element.get_screenshot(pathtable_only.png)page.quit()踩坑提醒很多網站尤其是政府網站的第一個table是用來做頁面布局的隱藏表格display:none沒有寬高。直接用page.ele(css:table)再get_screenshot()會報NoRectError: 該元素沒有位置及大小。上面的遍歷寫法可以自動跳過隱藏表格找到第一個真正可見的。第二步發給視覺模型importbase64fromopenaiimportOpenAI clientOpenAI(api_keyYOUR_API_KEY,base_urlhttps://open.bigmodel.cn/api/paas/v4/)# 讀取圖片并編碼withopen(table_only.png,rb)asf:img_base64base64.b64encode(f.read()).decode()# 調用視覺模型responseclient.chat.completions.create(modelglm-4v-flash,# GLM-4V-Flash 視覺模型messages[{role:user,content:[{type:text,text:請從這張圖片中的表格里提取所有數據返回 JSON 數組。每行一個對象字段名用表格的表頭。},{type:image_url,image_url:{url:fdata:image/png;base64,{img_base64}}}]}])print(response.choices[0].message.content)就這么簡單。截圖 → 發給模型 → 拿到結果。三、實戰從復雜公告頁提取表格數據場景假設你要從政府網站提取一份公告中的表格數據。這個表格合并了單元格、嵌套了子表格HTML 結構極其復雜tableclassgovernment-noticetrtdcolspan32026年度重點項目公示/td/trtrtdrowspan2序號/tdtd項目名稱/tdtd預算萬元/td/trtrtdcolspan2詳細信息/td/tr!-- 后面還有幾十行嵌套結構 --/table用XPath提取寫到你懷疑人生。用視覺模型解決 Day 13 示例代碼視覺模型提取復雜表格 作者梅雅達編程筆記 fromDrissionPageimportChromiumPageimportbase64importjsonimporttimefromopenaiimportOpenAI clientOpenAI(api_keyYOUR_API_KEY,base_urlhttps://open.bigmodel.cn/api/paas/v4/)deffind_visible_table(page,timeout10):遍歷頁面所有 table返回第一個真正可見有寬高的元素。 政府網站常有隱藏的布局表格直接 page.ele 會報 NoRectError。 page.wait.ele_displayed(css:table,timeouttimeout)foreleinpage.eles(css:table):try:w,hele.rect.sizeifwandhandw0andh0:returneleexceptException:continuereturnNonedefscreenshot_table(page,path):截取頁面中第一個可見表格找不到則整頁截圖兜底。tablefind_visible_table(page)iftableisNone:print(未找到可見表格改為整頁截圖)page.get_screenshot(pathpath)else:table.scroll.to_see()time.sleep(0.5)# 等滾動后的渲染table.get_screenshot(pathpath)defextract_table_from_image(image_path,prompt):用視覺模型從圖片中提取結構化數據withopen(image_path,rb)asf:img_base64base64.b64encode(f.read()).decode()responseclient.chat.completions.create(modelglm-4v-flash,messages[{role:user,content:[{type:text,text:prompt},{type:image_url,image_url:{url:fdata:image/png;base64,{img_base64}}}]}],temperature0.1)contentresponse.choices[0].message.content.strip()# 提取 JSONifjsonincontent:contentcontent.split(json)[1].split()[0]elifincontent:contentcontent.split()[1].split()[0]returnjson.loads(content)defmain():# 1. 打開頁面并截圖pageChromiumPage()page.get(http://www.ccgp.gov.cn/cggg/dfgg/zbgg/202607/t20260716_26951272.htm)# 截圖只截可見表格區域已修復 NoRectErrorscreenshot_table(page,table_screenshot.png)page.quit()# 2. 用視覺模型提取prompt請從這張表格截圖中提取所有數據。 要求 1. 返回 JSON 數組每行一個對象 2. 字段名使用表格的表頭 3. 合并單元格的內容填到對應的每一行 4. 如果有子表格展開到同一層級 5. 只返回 JSON不要其他內容 示例輸出格式 [ {序號: 1, 項目名稱: 智慧城市項目, 預算_萬元: 5000, 負責人: 張三}, {序號: 2, 項目名稱: 數據平臺項目, 預算_萬元: 3000, 負責人: 李四} ]print(正在用視覺模型分析表格...)dataextract_table_from_image(table_screenshot.png,prompt)print(f\n提取到{len(data)}條數據)print(-*60)foritemindata:print(json.dumps(item,ensure_asciiFalse))# 3. 保存importpandasaspd dfpd.DataFrame(data)df.to_csv(extracted_table.csv,indexFalse,encodingutf-8-sig)print(f\n已保存到 extracted_table.csv)if__name____main__:main()運行結果示例正在用視覺模型分析表格... 提取到 1 條數據 ------------------------------------------------------------ {供應商名稱: 甘肅禾木物業有限責任公司, 供應商地址: 甘肅省張掖市山丹縣南大街16號, 中標金額: 2627700.00, 評審得分: 82.19} 已保存到 extracted_table.csv四、視覺模型 vs 文本模型兩種方法各有優劣不是替代關系維度文本模型處理 HTML視覺模型處理截圖速度快文本傳輸慢圖片傳輸 理解成本低文本 token 少高圖片 token 多準確率高數據結構清晰時中高偶爾識別錯誤適用場景結構化的 HTML復雜排版、圖片數據、Canvas抗改版中改 HTML 結構可能失效高只要視覺上沒變就不影響什么時候用視覺模型HTML 結構極度復雜文本模型搞不定數據在圖片里價格標簽、二維碼、圖表Canvas渲染的內容ECharts圖表、地圖需要 OCR 的場景掃描件、PDF 截圖頁面頻繁改版你不想每次都改解析代碼什么時候用文本模型HTML 結構規整選擇器好寫數據量大需要考慮成本和速度批量處理幾千條數據最佳實踐先用文本不行再視覺defsmart_extract(url,prompt_template):智能提取先嘗試文本模型失敗再上視覺模型# 1. 先嘗試直接獲取 HTML 文本模型try:responserequests.get(url,headersheaders)htmlresponse.text# 用文本模型提取dataextract_with_text_model(html,prompt_template)ifdataandlen(data)0:print(文本模型提取成功)returndataexcept:pass# 2. 文本模型搞不定用視覺模型print(文本模型提取失敗切換到視覺模型...)pageChromiumPage()page.get(url)page.get_screenshot(pathtemp_screenshot.png)page.quit()dataextract_with_vision_model(temp_screenshot.png,prompt_template)print(視覺模型提取完成)returndata五、更多應用場景1. 提取圖表數據prompt這張圖片包含一個柱狀圖/折線圖。 請提取圖表中的所有數據點返回 JSON 數組。 格式[{label: 類別名, value: 數值}] 如果有多個系列每個系列分別提取。2. 提取圖片中的價格prompt這張圖片是商品列表頁的截圖。 請提取每個商品的名稱和價格返回 JSON 數組。 格式[{name: 商品名, price: 數字, unit: 單位}] 注意識別圖片中的價格標簽。3. 提取地圖標注prompt這張圖片是一張地圖上面標注了一些位置點。 請提取所有標注點的信息返回 JSON 數組。 格式[{name: 地點名, description: 描述如果有}]4. 提取 PDF 掃描件# 先把 PDF 轉成圖片再用視覺模型提取frompdf2imageimportconvert_from_path imagesconvert_from_path(scanned_document.pdf)fori,imginenumerate(images):img.save(fpage_{i}.png)dataextract_with_vision_model(fpage_{i}.png,prompt)六、提高視覺模型準確率的技巧1. 截圖要清晰# 放大頁面再截圖提高清晰度page.run_js(document.body.style.zoom 1.5)time.sleep(1)page.get_screenshot(pathzoomed_screenshot.png)2. 只截需要的部分# 不要全屏截圖只截目標區域# 復用上面的 screenshot_table() 函數自動跳過隱藏表格screenshot_table(page,target.png)3. Prompt 要具體# 模糊的 prompt不好prompt提取表格數據# 具體的 prompt好prompt提取圖片中的表格數據 - 第一列是序號整數 - 第二列是項目名稱字符串 - 第三列是金額數字單位萬元 - 第四列是狀態字符串 返回 JSON 數組只返回 JSON。4. 大圖分段處理defsplit_and_extract(image_path,rows_per_chunk20):大表格分段截圖提取fromPILimportImage imgImage.open(image_path)width,heightimg.size# 估算每段高度根據行高row_height40# 每行大約 40 像素chunk_heightrows_per_chunk*row_height100# 加上表頭all_data[]forstart_yinrange(0,height,chunk_height-100):# 重疊100像素保證不丟行# 裁剪end_ymin(start_ychunk_height,height)chunkimg.crop((0,start_y,width,end_y))chunk_pathfchunk_{start_y}.pngchunk.save(chunk_path)# 提取dataextract_with_vision_model(chunk_path,prompt)all_data.extend(data)# 去重重疊部分可能有重復數據# ...returnall_data 本篇成本透明欄項目數值API 調用次數~5-20 次取決于頁面數消耗 Token約 5-20 萬 tokens圖片 token 較多成本¥0GLM-4V-Flash 免費額度內視覺模型的圖片 token 消耗比文本高但免費額度一般夠用。練手改造題改造 1基礎打開一個包含復雜表格的網站比如統計局數據頁用DrissionPage截圖然后用視覺模型提取表格數據。對比你手動看頁面和 AI 提取的結果。改造 2進階找一個包含ECharts圖表的網頁截圖后用視覺模型提取圖表的數據點。嘗試還原出原始數據。下期預告Day 14 · 實戰數據采集全流程 Pipeline前面學的東西要串起來了。Day 14 從零搭建一個完整的數據采集系統——目標電商商品價格監控。包含分析頁面、編寫爬蟲、數據存儲、AI 清洗、輸出報告一條龍走完。 資源與工具智譜 GLM-4V-Flash視覺模型https://open.bigmodel.cn/DrissionPage 文檔https://g1879823.gitlab.io/DrissionPage/本專欄配套代碼CSDN 下載區每篇更新梅雅達編程筆記專注 Python AI 實戰教程提供數據采集與自動化定制服務往期回顧Day 01 · 爬蟲能干啥不能干啥Day 02 · 環境搭建與第一個爬蟲Day 03 · 列表頁抓取批量拿數據Day 04 · 詳情頁 翻頁從一條到一百條Day 05 · Ajax 請求攔截抓看不到的數據Day 06 · 瀏覽器自動化DrissionPage 實戰Day 07 · Cookie 與 Session處理登錄狀態Day 08 · 反爬對策Headers 限速 代理Day 09 · 存成文件CSV / Excel / JSONDay 10 · 存進數據庫SQLite 從零上手Day 11 · 用 AI 替代正則智能提取結構化數據Day 12 · AI 數據清洗臟數據一鍵變干凈專欄「AI Python 系列」 第 03 欄 ·AIPython 爬蟲實戰「AI Python 系列」第 01 欄 ·AI辦公自動化「AI Python 系列」第 02 欄 ·AI數據可視化「AI Python 系列」第 05 欄 · AI Agent實戰資源領取關注作者獲取本欄完整代碼和數據集原創聲明本文為梅雅達編程筆記原創作品未經允許不得轉載。