網路資料抓取是當今 data-driven 趨勢中非常重要的技術,使工程師能從網路上收集各種結構化的資訊。而網路資料抓取也很常被稱之為爬蟲,爬蟲現在被廣泛應用於市場研究到學術研究等等不同的領域,最常見的是技術是 Python,Python 以可讀性和強大的函式庫而聞名,往往是工程師在執行網頁抓取任務的首選程式語言。 而BeautifulSoup 和 Selenium 等 Python 函式庫則是大幅簡化了網路資料抓取的過程,並提供了一系列針對處理不同網站結構的功能作法。本篇文章會跟各位分享如何使用 Python 進行網頁抓取。
什麼是網頁抓取 Web Scraping?
讓我們先定義一下什麼是網頁擷取 (Web Scraping)。網頁擷取是從網頁上提取資料的過程,通常是向指定的 URL 發出 HTTP 請求,然後解析 HTML 內容以檢索特定資料。然後,將這些數據儲存到資料庫或 excel 中,以便後續應用。
要使用 Python 進行 Web 抓取的先決條件
要開始執行網頁擷取,首先需要設定開發環境。必備工具包括:
- Python:從官方網站下載 Python。
- 程式碼編輯器:Visual Studio Code、PyCharm 和 Jupyter Notebook 都是不錯的選擇。
- Python Libraries:最受歡迎的函式庫包括 Beautiful Soup 和 Selenium。
選擇函式庫 (Python Libraries)
選擇適合的函式庫是您的網頁擷取中至關重要的一步。提供ㄧ些最受歡迎的 Python 函式庫,每個函式庫都有各自的優點和限制:
Requests
✅ 優點:
- 適用於快速、高效地發送 HTTP 請求。
- 具備簡單的 API,適合基礎任務。
- 適用於 RESTful API 服務與靜態網頁擷取。
❌ 缺點:
- 無法處理 JavaScript 或 AJAX 請求,不適用於動態網站。
- 無內建 HTML 解析功能,通常需搭配 Beautiful Soup 使用。
Beautiful Soup
✅ 優點:
- 易學易用,適合初學者。
- 高效處理靜態 HTML 和 XML 文檔。
- 提供進階的 HTML 標籤、類別、屬性搜尋功能。
❌ 缺點:
- 僅適用於靜態網頁,無法執行 JavaScript。
- 需搭配 Requests 或其他庫來獲取網頁內容。
Selenium
✅ 優點:
- 可自動化模擬真實用戶操作,適合動態網站擷取。
- 支援多種瀏覽器,提供廣泛的網頁自動化功能。
❌ 缺點:
- 速度較慢,因為需加載完整網頁,包括圖片與腳本。
- 適用於需要 JavaScript 交互的網站,對於簡單擷取來說可能過於繁重。
Scrapy
✅ 優點:
- 專為大規模網頁爬取與擷取設計,功能強大。
- 提供中介軟體選項,可處理 Cookies、重定向、User-Agent 等。
- 採用非同步架構,可同時處理多個請求,擷取速度更快。
❌ 缺點:
- 學習曲線較陡,功能豐富但上手較難。
- 設定與配置較為複雜,對於小型專案可能過於繁瑣。
設定 Python 環境
您可以透過以下方式進行:
- 創建環境
打開您的終端並導航到您的專案目錄。執行以下命令建立環境:
啟動請使用:python3-m venv myenv
source myenv/bin/activate #用於macOS/Linux
myenv\Scripts\activate #用於Windows - 安裝函式庫
確認啟用後,您就可以安裝函式庫。執行:
pip install --upgrade beautifulsoup4 requests scrapy selenium
發出 HTTP 請求
取得網頁是任何網頁抓取任務的起點,Requests函式庫讓這個過程變得簡單。使用方法如下:
- 使用 GET 請求取得網頁
import requests response = requests.get('https://example.com')
- 檢核 HTTP 狀態碼
if response.status_code == 200: print('Success:', response.content) else: print('Failed:', response.status_code)
- 設定 headers
headers = {'User-Agent': 'Mozilla/5.0'} response = request.get('https://example.com', headers=headers)
- 發出 POST 請求
payload = {'key1': 'value1', 'key2': 'value2'} response = requests.post('https://example.com/post', data=payload)
使用 Beautiful Soup 解析 HTML
如開頭所提及的,Beautiful Soup 是一個 Python 函式庫,其專門為網頁抓取任務而設計的。主要功能包括搜尋和解析 HTML tree。Beautiful Soup 也提供了很多功能,你只需幾行程式碼就可以從網頁中擷取有價值的資料。
- 安裝跟載入 Beautiful Soup
匯入庫並將網頁內容載入到 Beautiful Soup 物件中:pip install beautifulsoup4
import requests response = requests.get('https://example.com') soup = BeautifulSoup(response.text, 'html.parser')
- 擷取數據
若要擷取特定的資料點,您可以搜尋 HTML 標籤、類別或 ID:
title = soup.title.string # Get the page title first_paragraph = soup.p.string
- 瀏覽 HTML 元素
您可以使用 .parent、.contents 或 .next_sibling 等關係瀏覽 HTML 樹:
parent_div = soup.p.parent # Get the parent div of the first paragraph sibling = soup.p.next_sibling
- 搜尋多個元素
Beautiful Soup 允許一次搜尋特定元素:
links = soup.find_all('a')
使用 Selenium 進行進階抓取
雖然 Beautiful Soup 和 Requests 非常適合靜態頁面,但當你需要擷取透過 JavaScript 渲染的動態網站時,Selenium 絕對是處理複雜、互動式網頁時的首選解決方案。 因為 Selenium 可以自動執行瀏覽器任務,讓您能夠與 Web 元素互動並處理 AJAX 呼叫。
- 安裝與設定 Selenium
首先,您需要安裝 Selenium 套件:
然後,從官方網站下載適當的 WebDriver,例如 ChromeDriver。pip install selenium
from selenium import webdriver driver = webdriver.Chrome('/path/to/chromedriver') driver.get('https://example.com')
- 模擬使用者進行搜尋
search_box = driver.find_element(‘q’)
search_box.send_keys(‘web scraping’)
search_box.submit() - 處理動態內容
Selenium 可以等待網頁所有元素加載完成,就能夠抓取所需的資料:
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# 等待最多 10 秒,直到指定的元素出現在網頁上
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, 'ElementID'))
)
常見的網頁擷取挑戰
網頁擷取其實不簡單,可能會遇到 CAPTCHA、AJAX 的載入和 IP 封阻等問題。解決方法如下:
- CAPTCHA 處理:考慮使用 OCR 或處理 CAPTCHA 的第三方服務。
- 執行 AJAX 呼叫:當需要等待 AJAX 載入時,請選擇 Selenium。
- IP 封阻:如果您發現您的 IP 被阻擋,您可以使用代理伺服器來更換您的 IP 位址。
故障排除和調試
網頁擷取過程中肯定會遇到一些問題,例如
- 404 未找到:當標的的網頁不可用時,可能目標網站已經移除這個網址,需要檢查是否為正確的 URL。
- 403 禁止:可能抓取太快或需要使用 headers,也可以考慮限制速率或更換 IP。
- 逾時錯誤:當請求耗時過長時會發生此類錯誤,此時請調整 HTTP 請求中的逾時設定。
網頁擷取的道德規範
網路擷取功能雖然可以達到擷取方的期待,但也伴隨著責任,例如
- 尊重抓取:遵守網站的服務條款。有些網站明確禁止抓取,忽視這一點可能會導致法律後果。
- 不要使伺服器超載:在短時間內發送過多的請求會導致網站伺服器超載,從而影響其效能。使用速率限制來調節你的請求速度。
- Robots.txt:查閱這類文件可以知道網站的爬取君子之約。
負責任的抓取策略
- 使用爬行延遲來分散請求。
- 在非尖峰時段進行抓取以盡量減少對伺服器負載的影響。
- 避免對同一頁面有重複性的請求。
比使用 Python 更簡單的替代方案 Growise AI
由於我們剛剛討論了網頁抓取自動化,但是其實有一種更簡單、更快捷的方法來提取網頁資料。特別之處是,當撰寫程式語言不是你的強項的時候,Growise AI 為網頁擷取提供了很棒的不需要寫程式就能擷取網頁資料的解決方案。你可以設定爬蟲機器人或使用爬蟲範本自動從網站擷取資料 – 只需 1 分鐘。此外,Growise AI 功能多樣,可以將資料匯出到 Google Excel 或 csv,甚至是 API 也沒問題。並且還能夠將已經擷取的資料,透過 Workflow 做資料再利用,例如分析網頁資料、製作成報告、摘要等等。
Python 提供了大量工具使網頁擷取變得簡單且高效,我們希望本篇文章涵蓋所有基礎,能對於想自己學習 Python 的人有所幫助。但是,對於不懂程式語言的人,或者是關鍵在於資料的再利用,而不是學寫程式來說, No-code Scraper 解決方案應該是最為適合的,Growise AI 是值得探索的高效替代方案。您還在等什麼呢?趕快來申請使用吧!
附上 Python 相關資源:
- Official Python website
- Beautiful Soup Documentation
- Requests Documentation
- Scrapy Documentation
- Selenium Documentation