在開放的互聯網上,不斷有海量數據被生成。產品價格會發生變化,招聘信息會被發布或刪除,新聞文章會被發表,公司信息也會得到更新。

對于那些依賴這類數據的開發人員和團隊來說,他們面臨的問題從來不是是否要從網絡上抓取數據,而是如何能夠持續、可靠地完成這一工作。

長期以來,人們采用的方法一直很直接:先檢查目標網頁,編寫相應的選擇器,然后使用像BeautifulSoup這樣的工具或PlaywrightSelenium這樣的瀏覽器自動化庫來提取數據。這種方法效果不錯,但也存在一個常見的問題:一旦網頁的結構發生變化,抓取腳本就會失效,需要重新進行修改。

最近,另一種方法開始受到人們的關注。這種方法不再需要編寫選擇器,而是直接描述所需獲取的數據內容,讓系統自己去判斷如何提取這些數據。人們把這種方法稱為“人工智能抓取”。

如今,這兩種方法都被廣泛使用,但它們解決問題的方式截然不同。本指南將詳細解釋每種方法的運作原理、適用場景,以及如何根據具體需求來選擇合適的方法。

目錄

什么是傳統網頁抓取?

傳統網頁抓取這種技術基于一個簡單的理念:如果瀏覽器能夠加載某個網頁并向用戶顯示其中的數據,那么程序也應該能夠做到這一點,并自動提取這些數據。

這一過程是通過CSS選擇器和XPath來實現的。對于CSS選擇器來說,像.product-card .price這樣的選擇器意味著“在產品卡片元素中查找價格信息”。這種表示方法很容易理解,在大多數情況下也能很好地發揮作用。

而XPath則功能更加強大,但使用起來也更為復雜。它允許人們更加詳細地導航網頁的結構,包括在DOM樹中上下移動、根據文本內容進行篩選,以及處理深度嵌套的元素。

在實際開發中,大多數開發者會先從使用CSS選擇器開始,只有當網頁結構過于復雜時,才會考慮使用XPath。

這種思路其實可以追溯到互聯網發展的早期。那時,開發者們不再需要手動從網頁上復制信息,而是開始編寫腳本,通過這些腳本來發送請求、接收HTML響應,并提取所需的數據。

從根本上說,這種方法的本質并沒有發生任何變化。

你仍然需要獲取頁面內容、分析其結構,并從中提取數據。如今的不同之處不在于方法本身,而在于所使用的工具已經變得多么先進,以及抓取操作的規模已經擴大到何種程度。

傳統抓取技術所依賴的工具

隨著時間的推移,圍繞這種抓取方式逐漸形成了一套完善的工具生態系統。

  • Requests是Python中用于發起HTTP請求的常用庫。大多數傳統抓取工具都會使用requests來獲取頁面內容,然后再將響應結果傳遞給BeautifulSoup進行解析。對于靜態網站來說,這種方法是簡單且可靠的。

  • BeautifulSoup是一個用于解析HTML和XML的Python庫。它能夠將原始HTML代碼轉換成結構清晰的對象樹,易于理解和使用,特別適合處理靜態頁面。不過它的最大局限性在于沒有內置瀏覽器引擎,因此無法執行JavaScript腳本;如果某個網站在頁面加載后動態生成內容,BeautifulSoup就會無法獲取這些信息。

  • SeleniumPlaywright是用于控制真實瀏覽器的自動化工具。它們可以點擊按鈕、滾動頁面,并等待JavaScript腳本完成執行后再提取數據。不過,與簡單的HTTP請求相比,這些工具的執行速度較慢,且對系統資源的需求也更高,但對于處理動態網站來說卻是必不可少的。

實際應用中的傳統抓取技術

讓我們使用專門為練習網絡爬蟲而設計的Books to Scrape這個沙盒網站,來構建一個能夠正常運行的抓取工具。我們的目標是從首頁上列出的每一本書中提取書名、價格和星級評價等信息。

步驟1:安裝所需依賴庫

pip install requests beautifulsoup4

步驟2:分析頁面結構

在編寫任何代碼之前,先在瀏覽器中打開目標網站,然后分析其HTML結構。右鍵點擊任意一本書的標題,選擇“檢查”選項就能看到該頁面的具體結構。

分析頁面結構

你會發現,每本書的信息都被包含在

這個元素中,而在這個元素內部,具體信息又分布在以下這些位置:

這就是傳統爬蟲技術中的核心工作:你需要分析HTML代碼,找出其中的規律,并編寫相應的選擇器來匹配這些規律。

步驟3:編寫爬蟲程序

import requests
from bs4 import BeautifulSoup

# 1. 獲取頁面內容
url = "https://books.toscrape.com/"
response = requests.get(url)

# 在繼續下一步之前,務必檢查請求是否成功
if response.status_code != 200:
    print(f"無法獲取頁面內容:{response.status_code}")
    exit()

# 2. 解析HTML代碼
soup = BeautifulSoup(response.content, "html.parser")

# 3. 找出頁面上所有的書籍信息
books = soup.select("article.product_pod")

# 4. 從每本書中提取數據
results = []

for book in books:
    # 書名存儲在屬性中,而不是可見文本
    title = book.select_one("h3 a")["title"]

    # 價格是price元素中的文本內容
    price = book.select_one("p.price_color").get_text.strip()

    # 評分是通過CSS類來表示的,例如“star-rating Three”
    # 我們提取第二個類名并將其轉換為數字
    rating_word = book.select_one("p.star-rating")["class"][1]
    rating_map = {"One": 1, "Two": 2, "Three": 3, "Four": 4, "Five": 5}
    rating = rating_map.get(rating_word, 0)

    results.append({
        "title": title,
        "price": price,
        "rating": rating
    })

# 5. 顯示結果
for book in results:
    print(f"{book['title']} | {book['price']} | {book['rating']}星"

步驟4:運行程序

python scraper.py

你的輸出結果會如下所示:

《閣樓里的光》 | £51.77 | 3星
《輕撫天鵝絨》 | £53.74 | 1星
《屈服》 | £50.10 | 1星
《鋒利的物體》 | £47.82 | 4星
《人類簡史》 | £54.23 | 5星
...

二十本書的信息都被整齊地提取出來了。

步驟5:擴展程序以爬取多頁內容

這個網站共有50頁。要想讓爬蟲程序能夠訪問所有這些頁面,就需要跟蹤頁面上的“next”按鈕:

import requests
from bs4 import BeautifulSoup

BASE_URL = "https://books.toscrape.com/catalogue/"
start_url = "https://books.toscrape.com/catalogue/page-1.html"

all_books = []
url = start_url

while url:
    response = requests.get(url)
    soup = BeautifulSoup(response.content, "html.parser")

    for book in soup.select("article.product_pod"):
        title = book.select_one("h3 a")["title"]
        price = book.select_one("p.price_color").get_text.strip()
        rating_word = book.select_one("p.star-rating")["class"][1]
        rating_map = {"One": 1, "Two": 2, "Three": 3, "Four": 4, "Five": 5}
        rating = rating_map.get(rating_word, 0)
        all_books.append({"title": title, "price": price, "rating": rating})

    # 查找“next”按鈕并點擊它
    next_btn = soup.select_one("li.next a")
    url = BASE_URL + next_btn["href"] if next_btn else None

print(f"共爬取了{len(all_books)}本書的信息。")

運行這個腳本會遍歷所有50頁中的1,000本書籍。

這種方法的脆弱性在于……

目前,這個抓取工具能夠正常工作,是因為books.toscrape.com是一個靜態且穩定的測試環境。但在實際生產環境中,這種方法存在一個明顯的缺陷:它完全依賴于HTML結構的穩定性。

如果網站開發者將product_pod改名為book-card,或者將價格信息放在

標簽中而不是

標簽中,那么所有的選擇器都會失效。這樣一來,你將無法獲取任何數據,甚至可能會得到錯誤的數據,而這種問題只有在有人發現輸出結果異常時才會被察覺。

而這正是人工智能抓取技術旨在解決的問題之一。

什么是人工智能網頁抓取?

傳統的抓取方法是通過分析頁面的結構來工作的。它會尋找HTML中的特定元素、類名或模式,并根據這些規則提取數據。

而基于人工智能的抓取技術則采用了不同的方式。它并不只依賴頁面結構,而是致力于理解頁面的內容本身。它會判斷某個元素代表什么意義,而不僅僅是它的位置。

在傳統的抓取工具中,你可能會編寫這樣的代碼:

response.css(".product-card .price::text").get()

你是在告訴系統具體該在哪里查找數據。但使用人工智能抓取技術時,你只需要描述想要得到的結果:

提取此頁面上每件商品的商品名稱、價格和庫存情況。

系統會讀取頁面內容,識別出哪些部分屬于產品信息,然后提取相關數據并返回結構化結果。

底層究竟發生了什么?

乍一看,人工智能抓取技術似乎像是一種魔法,但實際上它是建立在一些常見的技術組件之上的。

其核心是大型語言模型,這些模型經過大量文本數據的訓練,包括網頁內容和HTML代碼。通過學習,它們能夠識別出產品列表的格式、價格信息的呈現方式以及招聘信息的結構等等。

當給定一個頁面時,這些模型就能識別出其中的模式,并將它們轉換成你所需要的數據結構。

不過,模型只是整個系統的一部分。你還需要其他組件來加載并操作網頁內容。這時瀏覽器自動化技術就派上了用場。大多數人工智能抓取工具都會使用Chromium這樣的無頭瀏覽器,或者Playwright這樣的框架來渲染頁面、執行JavaScript代碼,并模擬用戶的點擊或滾動等操作。

除此之外,還有一層機制負責解析你的輸入指令。當你編寫一個描述所需數據的提示語時,系統會將其轉化為具體的抓取任務,從而決定哪些頁面內容是相關的,以及應該如何組織輸出結果。

最后,系統會將提取到的結果整理成結構清晰的數據格式,通常是JSON或CSV格式,這樣你就可以直接使用這些數據,而幾乎不需要進行后續處理。

注意:像ChatGPT這樣的工具雖然能夠理解文本內容,但它們并不是用于抓取數據的工具。它們不會爬取網頁、處理工作流程,也不會執行重復性的數據提取操作。人工智能抓取工具將這種智能功能與收集數據所需的基礎設施結合在一起,從而實現了高效的數據采集。

隨著人工智能抓取技術越來越受歡迎,出現了許多能夠幫助人們輕松使用這一技術的工具,人們無需從頭開始構建所有相關系統即可開展抓取工作。

例如:

實際上,這些工具所解決的具體問題并不完全相同。有些工具專注于提取結構化數據,有些則側重于清理文本內容,還有些工具用于構建完整的抓取工作流程。選擇合適的工具取決于你想要實現的目標,而不僅僅是工具本身具備的功能。

人工智能抓取在實踐中的應用

讓我們使用一個人工智能爬取工具,執行同樣的數據收集任務,從books.toscrape.com中提取書籍信息。我們將使用Spidra的API,這樣你們就能清楚地看到其中發生了哪些變化。

步驟1:獲取API密鑰

請在spidra.io注冊賬號,然后從控制面板中生成一個API密鑰。后續的所有請求都需要使用這個密鑰來進行身份驗證。

獲取Spidra API密鑰

步驟2:了解API結構

Spidra的爬取接口接受JSON格式的數據。其中兩個最重要的字段是url(需要爬取的網址)和prompt(需要提取的信息,需用簡單的英語表述)。你還可以選擇指定output格式——對于結構化數據來說,JSON格式最為適用。

POST https://api.spidra.io/scrape
Authorization: Bearer YOUR_API_KEY
Content-Type: application/json

如你所見,我們根本不需要使用任何選擇器或進行HTML結構分析,只需要提供一個URL和相應的提取要求即可。

步驟3:編寫單頁數據提取代碼

以下是我們傳統爬蟲程序的等效版本,它是通過API調用來實現的:

import requests
import json

API_KEY = "your_api_key_here"

payload = {
    "urls": [{"url": "https://books.toscrape.com/"}],
    "prompt": "提取該頁面上的所有書籍信息。對于每本書,需要返回書名、價格以及星級評分(評分范圍為1到5)。",
    "output": "json"
}

response = requests.post(
    "https://api.spidra.io/scrape",
    headers={
        "Authorization": f"Bearer {API_KEY}",
        "Content-Type": "application/json"
    },
    json=payload
)

data = response.json()
print(json.dumps(data, indent=2))

這就是整個爬取程序的代碼。其中沒有使用BeautifulSoup,也沒有任何選擇器邏輯或HTML解析過程。

步驟4:理解輸出結果

API會返回一個結構化的JSON響應。每本書的信息都會以對象的形式呈現出來,其中包含你之前指定的各個字段:

{
  "results": [
    {
      "title": "閣樓里的光",
      "price": "£51.77",
      "rating": 3
    },
    {
      "title": "輕觸天鵝絨",
      "price": "£53.74",
      "rating": 1
    },
    {
      "title": "屈服",
      "price": "£50.10",
      "rating": 1
    }
    ...
  ]
}

該系統能夠自動識別星級評分的編碼規則(例如star-rating Three表示3分),而無需我們事先指定評分的具體表示方式。它完全理解了“星級評分應為1到5之間的數字”這一要求,并自行完成了相應的轉換工作。

步驟5:在多步驟工作流程中使用Actions功能

當涉及到那些在傳統爬蟲中需要耗費大量開發工作的工作流程時,人工智能爬取技術才能真正發揮其優勢。

假設你想訪問每本書的詳細頁面,并提取其中的所有描述信息以及圖書的可用狀態(而不僅僅是列表頁面上顯示的內容)。
在傳統的爬蟲系統中,這意味著你需要構建一個循環來遍歷這些頁面,管理狀態信息,在每個詳細頁面上處理可能出現的錯誤,同時為頁面不同的結構設計專門的選取器。而在像Spidra這樣的人工智能爬蟲工具中,你可以通過瀏覽器操作來模擬人類的交互行為:

{
  "urls": [
    {
      "url": "https://books.toscrape.com/catalogue/category/books/mystery_3/index.html",
      "actions": [
        {
          "type": "forEach",
          "observe": "查找產品列表中的所有圖書卡片",
          "mode": "inline",
          "captureSelector": "article.product_pod",
          "maxItems": 10,
          "itemPrompt": "提取圖書的標題、價格和星級評價(一/二/三/四/五),并以JSON格式返回:{title, price, star_rating}"
        }
      ]
    }
  ]
}

該系統會自動導航到每本書的頁面,讀取新內容,提取所需的字段,并將所有結果整合到同一個結果集中。
你還可以根據自己的需求配置數據提取的方式:

{
  "urls": ["https://jobs.example.com/senior-engineer"],
  "prompt": "提取職位詳情",
  "schema": {
    "type": "object",
    "required": ["title", "company", "remote", "employment_type"],
    "properties": {
      "title": { "type": "string" },
      "company": { "type": "string" },
      "location": { "type": ["string", "null"] },
      "remote": { "type": ["boolean", "null"] },
      "salary_min": { "type": ["number", "null"] },
      "salary_max": { "type": ["number", "null"] },
      "employment_type": {
        "type": ["string", "null"],
        "enum": ["full_time", "part_time", "contract", null]
      },
      "skills": {
        "type": "array",
        "items": { "type": "string" }
      }
    }
  }
}

這些人工智能爬蟲工具還有許多其他功能,比如批量爬取、人工智能檢索等等。

人工智能爬取技術為何能發揮作用

現在假設某個網站的界面進行了更新:product_pod這個類被改名為book-card,價格信息也被放置到了另一個元素中。
在傳統的爬蟲系統中,你可能一開始會得到零條結果,也不會有任何錯誤提示,直到你發現數據缺失了才會發現問題。這時你需要重新檢查頁面內容,更新選取器,進行測試,然后再重新部署爬蟲程序。
而在人工智能爬蟲工具中,你只需要再次運行相同的指令即可。因為該模型并不會去尋找product_podprice_color這些具體的元素,而是會自動識別那些包含產品信息及價格的數據。因此,頁面布局的變更對數據提取過程完全沒有影響。

這就是人工智能方法所具備的核心優勢:頁面結構的任何變化都不會自動影響數據提取過程。

傳統爬取與人工智能爬取:何時使用哪種方法

目前,這兩種方法之間的區別已經非常明顯了。更重要的是,在實際應用中,究竟在什么情況下使用哪種方法才最為合適。

一個簡單的理解方式是如下所示:

應用場景 傳統爬取 人工智能爬取
穩定性較高的網站 ? 最佳選擇 ? 可以使用,但有時可能會顯得過于繁瑣
布局經常變化的網站 ? 容易出現提取錯誤 ? 適應能力更強
大規模爬取任務 ? 更具成本效益 ? 效率較高,但成本也可能隨之增加
快速原型開發 ? 設置過程較慢 ? 非常快捷
非技術用戶 ? 需要編程技能 ? 更容易上手使用
需要完全控制且追求透明度 ? 控制能力較強 ? 透明度較低
數據結構混亂或不一致 ? 難以維護 ? 更容易處理
涉及復雜操作流程(如登錄、多步驟操作) ?? 可以實現,但需要手動操作 ? 通常這些功能都是內置的

在實際應用中,這兩種方法并不是非此即彼的選擇。當所有內容都具備可預測性且穩定性較高時,傳統爬取方法是最佳選擇;而當數據結構混亂、動態變化或具有時間敏感性時,人工智能爬取方法就會顯得更加有用。大多數現實世界中的系統都會結合使用這兩種方法,而不是僅依賴其中一種。

總結

網絡爬取技術并不會消失,真正發生變化的是我們使用這些技術的方式。

傳統爬取方法能夠提供較高的控制能力和精確性,但維護起來可能較為繁瑣且耗時;而人工智能爬取方法則能讓操作過程變得更快速、更靈活,尤其是在處理數據結構混亂或經常變化的網站時。不過,人工智能爬取方法的透明度相對較低。

在實際應用中,大多數系統已經開始結合使用這兩種方法。

我們還可以看到,越來越多的人工智能爬取工具被集成到更大的系統中,尤其是與人工智能助手或MCP架構相結合時,爬取任務就可以根據需求隨時觸發,而無需每次都從頭開始進行設置。

關鍵在于明白:傳統爬取方法是告訴系統數據位于何處,而人工智能爬取方法則是告訴系統數據的含義是什么。真正重要的是要知道在什么情況下使用哪種方法才最為合適。

Comments are closed.