iT邦幫忙

2024 iThome 鐵人賽

DAY 17
0
Python

Python探索之旅:從基礎到實踐系列 第 17

DAY 17: 網路數據獵人——用 BeautifulSoup 精準爬取大樂透開獎號碼

  • 分享至 

  • xImage
  •  

在當前的數字時代,數據收集與解析成為掌握互聯網趨勢的重要手段。Python 的 BeautifulSoup 是一個功能強大的網頁解析庫,能夠高效地從 HTML 和 XML 文件中提取有用的數據。在今天的主題中,我們將詳細介紹如何使用 BeautifulSoup 解析網頁,並結合實際專案,抓取大樂透的開獎號碼,將這一技術付諸實戰。

安裝 BeautifulSoup 與相關模組

首先,我們需要安裝 BeautifulSouprequests 模組。requests 用來發送 HTTP 請求並獲取網頁數據,而 BeautifulSoup 用來解析網頁的 HTML 結構。

你可以通過以下命令來安裝這些依賴:

pip install beautifulsoup4 requests

此外,如果你需要處理更複雜的動態網頁,可以考慮使用 Selenium 來模擬用戶的瀏覽行為,但在本次專題中,我們將主要關注靜態網頁的解析。

探索網頁的 HTML 結構

網頁通常由一個嵌套的 HTML 結構組成,這包括標籤(如 <div>, <span>, <a>)和屬性(如 id, class),這些標籤用來呈現網頁內容並對其進行結構化排列。通過使用瀏覽器的“檢查元素”功能,你可以查看網頁的具體結構,從而瞭解你想要抓取的數據位置。

舉例來說,大樂透的開獎號碼通常放在某個 <div><span> 標籤中,這些標籤帶有特定的 class 或 id 屬性。找到這些標籤之後,我們就可以進行數據提取。

使用 requests 獲取網頁數據

在開始解析網頁之前,我們需要使用 requests 模組來發送 HTTP 請求,並獲取網頁的 HTML 源碼。以下是一個簡單的範例,展示如何從指定 URL 獲取 HTML:

import requests

url = 'https://example.com/lottery-results'
response = requests.get(url)

if response.status_code == 200:
    html_content = response.text
    print("成功獲取網頁內容")
else:
    print("無法獲取網頁內容")

這段程式碼會發送一個 GET 請求,並檢查請求是否成功。若成功,我們就可以進一步處理網頁內容。

用 BeautifulSoup 解析網頁

當我們拿到網頁的 HTML 內容後,可以使用 BeautifulSoup 來解析這些資料。BeautifulSoup 提供了許多簡單易用的方法來搜索和操作 HTML 結構。以下是將 HTML 源碼轉化為一個 BeautifulSoup 對象的範例:

from bs4 import BeautifulSoup

soup = BeautifulSoup(html_content, 'html.parser')

接下來,我們可以使用 find()find_all() 方法來查找特定的標籤內容。例如,如果開獎號碼位於一個 <span> 標籤內,且 class 為 lottery-numbers,我們可以這樣來提取:

numbers = soup.find_all('span', class_='lottery-numbers')
for num in numbers:
    print(num.text)

這段程式碼會找到所有符合條件的 <span> 標籤,並輸出其中的文本內容,也就是開獎號碼。

進階選取技巧:使用 CSS 選擇器

有時候,使用 CSS 選擇器進行數據篩選會更加直觀和靈活。BeautifulSoup 支持用 select() 方法來選取元素,這樣我們可以用熟悉的 CSS 選擇器語法來定位所需的數據。例如:

numbers = soup.select('.lottery .number')
for number in numbers:
    print(number.get_text())

這段程式碼會找到所有符合 .lottery .number 這個 CSS 選擇器的元素,並打印出其中的文本內容。

專題實作:抓取大樂透開獎號碼

現在我們來實作一個專題,通過爬取大樂透網站,抓取最新的開獎號碼,並將這些數據保存到一個 CSV 文件中。完整的程式碼如下:

import requests
from bs4 import BeautifulSoup
import csv

def fetch_lottery_numbers():
    url = 'https://example.com/lottery-results'
    headers = {'User-Agent': 'Mozilla/5.0'}
    response = requests.get(url, headers=headers)
    
    if response.status_code == 200:
        soup = BeautifulSoup(response.text, 'html.parser')
        numbers = soup.find_all('span', class_='lottery-numbers')
        lottery_data = [num.text for num in numbers]
        
        # 將數據寫入 CSV 文件
        with open('lottery_results.csv', 'w', newline='') as csvfile:
            writer = csv.writer(csvfile)
            writer.writerow(["號碼"])
            writer.writerow(lottery_data)
        print("大樂透開獎號碼已成功寫入 CSV 文件")
    else:
        print("無法取得網頁內容")

fetch_lottery_numbers()

在這段程式碼中,我們首先通過 requests 發送請求並獲取網頁內容,然後使用 BeautifulSoup 來解析這些內容,最後將提取的開獎號碼寫入 CSV 文件中,方便進行後續的數據分析。

處理動態網頁與 Selenium 結合

有時候,我們需要抓取的網頁會使用 JavaScript 動態生成內容,這意味著簡單的 HTTP 請求無法直接獲取我們所需的數據。在這種情況下,我們可以結合 Selenium 來模擬用戶行為,並抓取動態加載的內容。Selenium 能夠自動控制瀏覽器,執行點擊、滾動等操作,從而觸發 JavaScript 生成數據。

錯誤處理與網頁防爬蟲機制

在進行網頁爬取時,經常會遇到網站的防爬蟲機制,例如限制 IP 訪問、添加 CAPTCHA 驗證等。我們可以使用一些技巧來避免被網站攔截,例如在請求頭中加入 User-Agent 偽裝瀏覽器:

headers = {'User-Agent': 'Mozilla/5.0'}
response = requests.get(url, headers=headers)

此外,為了確保爬蟲的穩定性,我們應該添加錯誤處理代碼,來應對網頁訪問過程中的各種異常情況。

延伸應用:將數據存入資料庫並進行分析

除了將數據寫入 CSV 文件,我們也可以將抓取到的數據存入資料庫,這樣可以進行更為高效的數據管理和分析。Python 的 sqlite3 模組可以用來將爬取到的數據存入 SQLite 資料庫,或者你也可以使用更強大的 MySQL 或 PostgreSQL 來處理大規模數據。


通過今天的主題,我學習到了如何使用 BeautifulSoup 進行網頁解析,並運用這項技術來抓取大樂透的開獎號碼。不僅如此,還涵蓋了從基本的 HTML 解析到進階的 CSS 選擇器應用,以及錯誤處理與動態網頁數據的抓取。這些技巧將幫助我在網路數據爬取領域獲得扎實的基礎,並為後續進階應用鋪路。


上一篇
DAY 16: 征服網路數據!Python 高效數據爬取與智慧 IP 位址追蹤專案
下一篇
D18:數據大師之路 - 從 CSV 到 MySQL 與 Google 試算表的全面操作指南
系列文
Python探索之旅:從基礎到實踐27
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言