今天我們將探討如何使用 Python 進行網頁抓取。網頁抓取(Web Scraping)是從網站自動提取資料的技術。它能幫助你自動獲取並處理大量網頁數據,這對於資料分析和自動化操作非常有用。我們會介紹 Python 中的兩個常用工具——requests
和 BeautifulSoup
,來幫助你學習網頁抓取的基礎知識。
網頁抓取是一種自動化技術,用來從網站中提取資料。這項技術的應用範圍非常廣泛,從數據收集到資料分析,你可以自動從網頁中抓取有用的信息。典型的網頁抓取流程包括:
要開始網頁抓取,我們需要安裝兩個庫:
requests
:用來發送 HTTP 請求,獲取網頁內容。BeautifulSoup
:用來解析 HTML 並提取我們所需要的資料。pip install requests
pip install beautifulsoup4
requests
庫:發送 HTTP 請求並下載網頁內容。BeautifulSoup
庫:分析並解析 HTML 結構,以提取需要的數據。首先,我們將使用 requests
庫來發送請求並下載網頁的 HTML 內容。
import requests
url = 'https://example.com'
response = requests.get(url)
print(response.text) # 打印網頁的 HTML 內容
example.com
發送一個 HTTP GET 請求,並返回該網頁的 HTML 內容。if response.status_code == 200:
print("請求成功!")
else:
print("請求失敗,狀態碼:", response.status_code)
status_code
為 200 表示請求成功。下載完網頁內容後,我們需要使用 BeautifulSoup
來解析 HTML 並提取所需的數據。
from bs4 import BeautifulSoup
soup = BeautifulSoup(response.text, 'html.parser')
print(soup.prettify()) # 美化並打印網頁的 HTML 結構
soup.prettify()
可以美化網頁的 HTML,讓我們更容易讀懂其結構。通過標籤名稱提取數據:
title = soup.find('title').text
print("網頁標題:", title)
通過類別名稱提取數據:
div_content = soup.find('div', class_='content').text
print("內容:", div_content)
使用 find_all()
提取所有符合條件的元素:
all_links = soup.find_all('a')
for link in all_links:
print(link.get('href')) # 打印所有連結
讓我們實作一個具體的網頁抓取範例。我們將從一個博客網站抓取文章標題和連結。
import requests
from bs4 import BeautifulSoup
# 目標網址
url = 'https://example-blog.com'
# 發送請求並下載網頁
response = requests.get(url)
# 檢查請求狀態
if response.status_code == 200:
print("請求成功!")
# 解析網頁內容
soup = BeautifulSoup(response.text, 'html.parser')
# 提取文章標題和連結
articles = soup.find_all('article')
for article in articles:
title = article.find('h2').text
link = article.find('a')['href']
print(f"文章標題:{title}")
print(f"文章連結:{link}")
import csv
with open('articles.csv', 'w', newline='', encoding='utf-8') as csvfile:
writer = csv.writer(csvfile)
writer.writerow(['標題', '連結']) # 寫入標題
for article in articles:
title = article.find('h2').text
link = article.find('a')['href']
writer.writerow([title, link]) # 寫入數據
有些網站的內容是動態生成的,這意味著你可能無法通過簡單的 HTML 抓取到資料。對於這類網站,我們需要使用其他工具,比如 Selenium
,它可以模擬瀏覽器的行為並動態抓取內容。
pip install selenium
from selenium import webdriver
# 設置 Chrome 驅動路徑
driver = webdriver.Chrome(executable_path='/path/to/chromedriver')
# 打開目標網站
driver.get('https://example.com')
# 獲取網頁源代碼
page_source = driver.page_source
print(page_source)
# 關閉瀏覽器
driver.quit()
Selenium
打開網頁,並打印網頁的 HTML 內容。對於動態網頁,這是一個有效的解決方案。網頁抓取雖然是一個強大的工具,但我們必須確保我們的抓取行為是合法和道德的:
robots.txt
文件中規定禁止抓取的內容,應該遵守這些規定。Selenium
抓取一個動態加載內容的網站,比如社交媒體平台上的文章。這些練習涉及到網頁抓取和處理動態內容,展示了如何使用 Python 抓取靜態和動態網站的資料。這裡提供每個練習的簡要說明和範例代碼。
目標:從一個電商網站抓取商品名稱、價格和連結。可以使用 requests
和 BeautifulSoup
庫來完成靜態網頁的抓取。
import requests
from bs4 import BeautifulSoup
def scrape_product_info(url):
# 發送 GET 請求到指定的 URL
response = requests.get(url)
# 檢查請求是否成功
if response.status_code == 200:
soup = BeautifulSoup(response.text, 'html.parser')
# 抓取商品名稱、價格和連結
products = soup.find_all('div', class_='product-item')
for product in products:
name = product.find('h2', class_='product-title').text
price = product.find('span', class_='price').text
link = product.find('a', class_='product-link')['href']
print(f"商品名稱: {name}")
print(f"價格: {price}")
print(f"連結: {link}\n")
else:
print(f"無法訪問 {url}, 狀態碼: {response.status_code}")
# 測試抓取程式
url = 'https://example.com/products' # 替換為實際的電商網站 URL
scrape_product_info(url)
requests
:發送 HTTP 請求以獲取網頁資料。BeautifulSoup
:解析 HTML 文件,提取商品名稱、價格和連結。目標:從一個新聞網站抓取最新的新聞標題和連結。依然可以使用 requests
和 BeautifulSoup
來抓取靜態新聞網站的數據。
import requests
from bs4 import BeautifulSoup
def scrape_news_headlines(url):
response = requests.get(url)
if response.status_code == 200:
soup = BeautifulSoup(response.text, 'html.parser')
# 假設新聞標題在 <h3> 標籤中,並且帶有 class 'headline'
headlines = soup.find_all('h3', class_='headline')
for headline in headlines:
title = headline.text.strip()
link = headline.find('a')['href']
print(f"新聞標題: {title}")
print(f"連結: {link}\n")
else:
print(f"無法訪問 {url}, 狀態碼: {response.status_code}")
# 測試抓取程式
url = 'https://example.com/news' # 替換為實際的新聞網站 URL
scrape_news_headlines(url)
strip()
:去除多餘的空白和換行符號,保證標題格式整潔。目標:使用 Selenium 抓取一個動態加載內容的網站,比如社交媒體平台上的文章。
這部分需要使用 Selenium
庫,它模擬用戶操作瀏覽器來抓取動態加載內容的網頁。
pip install selenium
並需要下載對應瀏覽器的 WebDriver,例如 ChromeDriver。
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
def scrape_dynamic_content(url):
# 這裡假設使用 Chrome 瀏覽器,你需要下載對應的 ChromeDriver
driver = webdriver.Chrome(executable_path='/path/to/chromedriver')
# 開啟指定的網站
driver.get(url)
# 等待網頁完全加載
time.sleep(5) # 等待 5 秒
# 假設文章位於 class 為 'post' 的 div 裡面
posts = driver.find_elements(By.CLASS_NAME, 'post')
for post in posts:
content = post.text
print(f"文章內容: {content}\n")
# 關閉瀏覽器
driver.quit()
# 測試抓取程式
url = 'https://example.com/dynamic-page' # 替換為實際的動態網頁 URL
scrape_dynamic_content(url)
Selenium
:模擬瀏覽器操作,專門用於抓取動態加載內容的網站。driver.get()
:打開指定網頁。find_elements()
:用來抓取網頁上的動態內容,例如社交媒體上的文章。time.sleep()
:等待網頁完全加載。這三個練習展示了如何使用不同的工具抓取靜態和動態網頁資料。靜態網站可以使用 requests
和 BeautifulSoup
,而動態內容則需要 Selenium
來模擬瀏覽器行為。
今天我們學習了如何使用 Python 進行網頁抓取,包括基本的 HTML 抓取、如何使用 BeautifulSoup
解析網頁內容,如何處理動態網頁,以及如何遵守抓取規則。網頁抓取是一項非常有用的技能,它可以幫助你自動化資料收集並進行數據分析。
第十六天:Python 進階 - 處理 CSV 文件