iT邦幫忙

2024 iThome 鐵人賽

DAY 18
0

第十六天:使用 Python 進行網頁抓取(Web Scraping)

內容概述:

今天我們將探討如何使用 Python 進行網頁抓取。網頁抓取(Web Scraping)是從網站自動提取資料的技術。它能幫助你自動獲取並處理大量網頁數據,這對於資料分析和自動化操作非常有用。我們會介紹 Python 中的兩個常用工具——requestsBeautifulSoup,來幫助你學習網頁抓取的基礎知識。


一、什麼是網頁抓取?

網頁抓取是一種自動化技術,用來從網站中提取資料。這項技術的應用範圍非常廣泛,從數據收集到資料分析,你可以自動從網頁中抓取有用的信息。典型的網頁抓取流程包括:

  1. 發送請求到網站並下載網頁內容。
  2. 分析網頁的結構,提取所需的資料。
  3. 保存資料到本地文件或數據庫。

二、安裝與準備

要開始網頁抓取,我們需要安裝兩個庫:

  1. requests:用來發送 HTTP 請求,獲取網頁內容。
  2. BeautifulSoup:用來解析 HTML 並提取我們所需要的資料。
1. 安裝:
pip install requests
pip install beautifulsoup4
2. 基本概念:
  • requests 庫:發送 HTTP 請求並下載網頁內容。
  • BeautifulSoup 庫:分析並解析 HTML 結構,以提取需要的數據。

三、發送請求並下載網頁內容

首先,我們將使用 requests 庫來發送請求並下載網頁的 HTML 內容。

1. 發送請求:
import requests

url = 'https://example.com'
response = requests.get(url)
print(response.text)  # 打印網頁的 HTML 內容
  • 這段代碼會向 example.com 發送一個 HTTP GET 請求,並返回該網頁的 HTML 內容。
2. 檢查請求狀態:
if response.status_code == 200:
    print("請求成功!")
else:
    print("請求失敗,狀態碼:", response.status_code)
  • 請求的 status_code 為 200 表示請求成功。

四、解析網頁內容

下載完網頁內容後,我們需要使用 BeautifulSoup 來解析 HTML 並提取所需的數據。

1. 創建 BeautifulSoup 對象:
from bs4 import BeautifulSoup

soup = BeautifulSoup(response.text, 'html.parser')
print(soup.prettify())  # 美化並打印網頁的 HTML 結構
  • soup.prettify() 可以美化網頁的 HTML,讓我們更容易讀懂其結構。
2. 提取特定元素:
  • 通過標籤名稱提取數據:

    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'))  # 打印所有連結
    

五、應用實例

讓我們實作一個具體的網頁抓取範例。我們將從一個博客網站抓取文章標題和連結。

1. 實作範例:
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}")
  • 這段程式碼會從指定的博客網站中提取所有文章的標題和連結。
2. 儲存提取的數據:
  • 你可以將提取到的數據儲存到一個 CSV 文件中,以便後續分析。
    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,它可以模擬瀏覽器的行為並動態抓取內容。

1. 安裝 Selenium:
pip install selenium
2. 使用 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 內容。對於動態網頁,這是一個有效的解決方案。

七、抓取合法性與道德問題

網頁抓取雖然是一個強大的工具,但我們必須確保我們的抓取行為是合法和道德的:

  1. 遵守網站的 robots.txt:有些網站會在 robots.txt 文件中規定禁止抓取的內容,應該遵守這些規定。
  2. 不要過度抓取:避免對網站發送大量請求,這可能會導致網站的服務器負載過大。
  3. 避免抓取私人或敏感數據:抓取數據時,應該尊重用戶的隱私和網站的條款。

八、練習與實作

練習 1:抓取商品信息
  • 從一個電商網站抓取商品名稱、價格和連結。
練習 2:抓取新聞網站
  • 從一個新聞網站抓取最新的新聞標題和連結。
練習 3:動態網頁抓取
  • 使用 Selenium 抓取一個動態加載內容的網站,比如社交媒體平台上的文章。

這些練習涉及到網頁抓取和處理動態內容,展示了如何使用 Python 抓取靜態和動態網站的資料。這裡提供每個練習的簡要說明和範例代碼。


解答:

練習 1:抓取商品信息

目標:從一個電商網站抓取商品名稱、價格和連結。可以使用 requestsBeautifulSoup 庫來完成靜態網頁的抓取。

範例代碼:
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 文件,提取商品名稱、價格和連結。
  • 範例:抓取靜態網頁中的商品資訊。

練習 2:抓取新聞網站

目標:從一個新聞網站抓取最新的新聞標題和連結。依然可以使用 requestsBeautifulSoup 來抓取靜態新聞網站的數據。

範例代碼:
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():去除多餘的空白和換行符號,保證標題格式整潔。

練習 3:動態網頁抓取

目標:使用 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():等待網頁完全加載。

這三個練習展示了如何使用不同的工具抓取靜態和動態網頁資料。靜態網站可以使用 requestsBeautifulSoup,而動態內容則需要 Selenium 來模擬瀏覽器行為。


九、學習總結

今天我們學習了如何使用 Python 進行網頁抓取,包括基本的 HTML 抓取、如何使用 BeautifulSoup 解析網頁內容,如何處理動態網頁,以及如何遵守抓取規則。網頁抓取是一項非常有用的技能,它可以幫助你自動化資料收集並進行數據分析。


下一堂課預告

第十六天:Python 進階 - 處理 CSV 文件


上一篇
跟著 ChatGPT成為程式大佬!Python 物件導向程式設計 (OOP)
下一篇
跟著 ChatGPT成為程式大佬!Python 處理 CSV 文件
系列文
如果讓chatgpt參加iThome鐵人賽,他竟然寫出...!?31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言