iT邦幫忙

2024 iThome 鐵人賽

DAY 26
0
生成式 AI

Python 新手的 AI 之旅:從零開始打造屬於你的 AI / LLM 應用系列 第 26

【Day26】LLM 時代下的爬蟲 (2):透過 LLM + Agent 的方式來「聰明的爬蟲」吧!(ScrapeGraphAI, skyvern)

  • 分享至 

  • xImage
  •  

前言

昨天介紹的是把爬蟲下來的資料,轉換成適合 LLM 讀取的資料格式,今天要介紹的是利用 LLM 簡化爬蟲這件事,會用到 skyvern 和 Scrapegraph-ai 這兩個工具

skyvern

官網連結

Github 連結

Skyvern 利用大型語言模型和電腦視覺自動化基於瀏覽器的工作流程。提供了一個簡單的 API 端點,可以完全自動化大量網站上的手動工作流程,取代了脆弱或不可靠的自動化解決方案。過去我們要使用 selenium 的工作都可以透過 skyvern 完成!

可以使用 Open Source 或者雲端方案是 Pricing

目前雲端方案每爬一頁是 0.1 美金,這邊我們自己用 docker 架服務即可 (需要提供 LLM 供應商 API key)

安裝

從 Github 上複製下來

git clone https://github.com/Skyvern-AI/skyvern.git
cd skyvern

修改 docker-compose.yaml 中的 API key,看你想要用哪一家 LLM 供應商,目前有 OpenAI, Anthropic, Azure

    environment:
      - DATABASE_STRING=postgresql+psycopg://skyvern:skyvern@postgres:5432/skyvern
      - BROWSER_TYPE=chromium-headful
      - ENABLE_OPENAI=true
      - OPENAI_API_KEY=<這邊放你的 key>

使用 docker 啟動,服務會 run 在 8080 port

docker compose up -d

Create Task

非常簡單,直接告訴 skyvern 你要做什麼即可。這邊一樣用昨天住宿服務組的活動網站為例

然後 LLM 就會開始「思考」要採取哪些動作,回傳結果,從沒想過爬蟲可以如此簡單 🥳🥳

甚至可以看到爬蟲的過程、提取的參數等等

這邊我們讓模型做更細節的操作,也就是針對每個活動爬取內容,以下是我的 prompt

幫我把 https://housing-osa.ncku.edu.tw/p/403-1052-407-1.php?Lang=zh-tw 上的活動爬下來,包含活動的詳細資訊,點擊可以查看詳細資訊,把每個活動的詳細內容也爬下來

結果如下,雖然是有抓到啦...但... 600 歲是什麼啦XD,而且他只有爬到一筆資料

原來是因為原本的圖片有「需 600 字」

來修復它只爬取一筆資料的缺點,將 prompt 寫得更明確,把剛剛第一次爬到的標題都附上,然後寫成以下的 prompt

針對將以下活動的資訊爬出來,網址為 https://housing-osa.ncku.edu.tw/p/403-1052-407-1.php?Lang=zh-tw

2024勝利校區地震避難疏散演練活動
2024 肌動一下-綜合肌力有氧訓練(勝利舍區)
93校慶:捐輸幸福-捐血活動(摸彩結果將更新於此)
分離術捐血活動 (113/3/25-114/12/31)"
113-1 光一舍廚藝教室活動

居然給我爬到空的QQ

或許,我們該嘗試更直白的 prompt

從成大住宿服務組上找到最新的五個活動,以及各自的詳細內容

還是失敗了哇啊啊啊

回到上上個任務 (600 歲那個),點選 rerun task,然後在這邊設定 prompt

這邊我強調了兩點

  1. 把 all 改成 **ALL** 來強調所有頁面都要爬到
  2. 把 data schema 從 null 改成 {"data": "content of page"}

然後觀察執行紀錄,會發現他在點擊第一個活動連結之後,就沒有按下返回,直接想要點第二個連結

我們再次修改 prompt

針對將以下活動的資訊爬出來,網址為 https://housing-osa.ncku.edu.tw/p/403-1052-407-1.php?Lang=zh-tw

點擊 -> [2024勝利校區地震避難疏散演練活動 -> 取出內容] -> 按下返回
點擊 -> [2024 肌動一下-綜合肌力有氧訓練(勝利舍區)] -> 取出內容 -> 按下返回
點擊 -> [93校慶:捐輸幸福-捐血活動(摸彩結果將更新於此)] -> 取出內容 -> 按下返回
點擊 -> [分離術捐血活動 (113/3/25-114/12/31)] -> 取出內容 -> 按下返回
點擊 -> [113-1 光一舍廚藝教室活動] -> 取出內容 -> 按下返回

這邊又出現一個問題,就是 LLM 把「返回」當成「回首頁了」

所以這次我們在微調一下 Prompt

針對將以下活動的資訊爬出來,網址為 https://housing-osa.ncku.edu.tw/p/403-1052-407-1.php?Lang=zh-tw

點擊 -> [2024勝利校區地震避難疏散演練活動 -> 取出內容] -> 回到 https://housing-osa.ncku.edu.tw/p/403-1052-407-1.php?Lang=zh-tw
點擊 -> [2024 肌動一下-綜合肌力有氧訓練(勝利舍區)] -> 取出內容 -> 回到 https://housing-osa.ncku.edu.tw/p/403-1052-407-1.php?Lang=zh-tw
點擊 -> [93校慶:捐輸幸福-捐血活動(摸彩結果將更新於此)] -> 取出內容 -> 回到 https://housing-osa.ncku.edu.tw/p/403-1052-407-1.php?Lang=zh-tw
點擊 -> [分離術捐血活動 (113/3/25-114/12/31)] -> 取出內容 -> 回到 https://housing-osa.ncku.edu.tw/p/403-1052-407-1.php?Lang=zh-tw
點擊 -> [113-1 光一舍廚藝教室活動] -> 取出內容 -> 回到 https://housing-osa.ncku.edu.tw/p/403-1052-407-1.php?Lang=zh-tw

即使改了如此詳細,他還是只有爬到一篇文QQ,所以我在猜應該是成大的網站 url、和網站設定實在太不直覺了 (也可能是要反爬蟲),於是我決定用我的網站

爬取海狸大師最新的五篇文章

他給我找到 beavermaster.com ((??

換一個 Prompt

爬取 yenslife.top 最新的五篇文章

網頁對了,但是沒有爬到文章...

小結:待加強,不過也可能是中文的網站對這種英文 prompt based 的爬蟲工具不友善。他其實還有工作流的功能,但這邊就不深入探討了,畢竟我不是什麼爬蟲高手X)

Workflow

Skyvern 也有工作流可以使用,不過他就不像 Dify 那麼滑順了

Scrapegraph-ai

官網連結

ScrapeGraphAI 是一個開源的 Python 函式庫,結合大型語言模型(LLMs)和圖結構來自動化網站或其他文件的資料爬蟲。傳統的網頁爬蟲工具通常依賴固定的結構,但 ScrapeGraphAI 利用 LLM 的靈活性來適應網站結構變更,減少開發者手動維護的需求。

以下是一些 Scrapegraph 提供的 pipeline,有 Omni 開頭的是專們給 OpenAI o 系列的模型使用

Pipeline 名稱 描述
SmartScraperGraph 單頁爬蟲,只需使用者提示和輸入來源。
SearchGraph 多頁爬蟲,從搜尋引擎的前 n 個搜尋結果中爬出資料。
SpeechGraph 單頁爬蟲,從網站爬出信息並生成音訊檔案。
ScriptCreatorGraph 單頁爬蟲,從網站爬出信息並生成 Python 腳本。
SmartScraperMultiGraph 多頁爬蟲,根據單一提示和多個來源提取多個頁面的資料。
ScriptCreatorMultiGraph 多頁爬蟲,生成 Python 腳本以提取多個頁面和來源的信息。
OmniScraperGraph 與 SmartScraperGraph 相似,但具備爬取圖像並進行描述的能力。
OmniSearchGraph 與 SearchGraph 相似,但具備爬取圖像並進行描述的能力。

官網文件對於各種 pipeline 的串接方法都有很漂亮的介紹,有興趣的在自己看吧!

安裝

pip install scrapegraphai
playwright install

使用

文件說明

這邊用 SearchGraph 單純找活動名稱和網站 (其實這樣就很夠),至這邊嵌入模型也可以不同供應商混搭著用 (一樣記得要去設定 .env 檔案歐)

from scrapegraphai.graphs import SearchGraph
from dotenv import load_dotenv
import os

load_dotenv()

graph_config = {
    "llm": {
        "api_key": os.getenv("OPENAI_API_KEY"),
        "model": "openai/gpt-4o-mini",
    },
    "embedding": {
        "api_key": os.getenv("OPENAI_API_KEY"),
        "model": "text-embedding-3-small",
    }
}

search_graph = SearchGraph(
    prompt="找到最新的五個成大住宿服務組辦的活動",
    config=graph_config,
)

result = search_graph.run()
print(result)

結果如下

{
   "latest_events":[
      {
         "title":"2024 肌動一下-綜合肌力有氧訓練(勝利舍區)",
         "date":"2024-10-04",
         "link":"https://housing-osa.ncku.edu.tw/p/406-1052-273737,r407.php?Lang=zh-tw"
      },
      {
         "title":"93校慶:捐輸幸福-捐血活動(摸彩結果將更新於此)",
         "date":"2024-09-24",
         "link":"https://housing-osa.ncku.edu.tw/p/406-1052-273384,r407.php?Lang=zh-tw"
      },
      {
         "title":"分離術捐血活動 (113/3/25-114/12/31)",
         "date":"2024-03-26",
         "link":"https://housing-osa.ncku.edu.tw/p/406-1052-265993,r407.php?Lang=zh-tw"
      },
      {
         "title":"113-1 光一舍廚藝教室活動",
         "date":"2024-09-24",
         "link":"https://housing-osa.ncku.edu.tw/p/406-1052-273381,r407.php?Lang=zh-tw"
      },
      {
         "title":"國際美食烹飪比賽",
         "date":"NA",
         "link":"NA"
      }
   ],
   "sources":[
      "https://housing-osa.ncku.edu.tw/",
      "https://housing-osa.ncku.edu.tw/p/412-1052-18885.php?Lang=zh-tw",
      "https://housing-osa.ncku.edu.tw/p/412-1052-6854.php?Lang=zh-tw"
   ]
}

程式碼 Github 連結

小結

用 LLM 幫忙爬蟲固然方便,但感覺要變成一個產品還有一段路要走,就和所有生成式 AI 的產品一樣,都是一種機率軟體,要做到很穩定還很困難,像是我今天嘗試的 skyvern 就給我很差的印象,但也可能是因為我不太會用,畢竟我就不是什麼爬蟲高手,真正的爬蟲高手是我認識的一個大佬 Vincent55 也是資安大師。講到資安,剩下幾天來寫一些關於 Prompt Injection 以及 LLM 的安全相關的內容好了,期待一下吧~


上一篇
【Day25】LLM 時代下的爬蟲 (1):利用 Firecrawl 或 Jina AI 把網頁變成 LLM 讀得懂的 Markdown 格式、在 Dify 中使用吧!
下一篇
【Day27】LLM 安全:Prompt Injection 的認識與防範
系列文
Python 新手的 AI 之旅:從零開始打造屬於你的 AI / LLM 應用30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言