昨天第一次使用 Requests 從網站取得 HTML,今天就要處理昨天留下來的問題:
HTML 抓回來之後,要怎麼從裡面找到自己想要的資料?
如果只使用:
print(response.text)
看到的會是一大串 HTML,真正做爬蟲時不可能靠肉眼一個一個找。
所以今天開始學習 BeautifulSoup,讓 Python 可以解析 HTML,並從網頁中找到特定的標籤和內容。
一、先了解 HTML 的基本結構
先看一個簡單的 HTML:
<h1>商品列表</h1>
<div>
<h2>無線耳機</h2>
<p>價格:1990 元</p>
</div>
<div>
<h2>機械鍵盤</h2>
<p>價格:2500 元</p>
</div>
HTML 是由很多「標籤」組成的。
例如:
h1 是標籤,而中間的:
商品列表
就是內容。
另外:
p 通常用來表示一段文字。
做爬蟲時,我們就是利用這些 HTML 結構找到需要的資料。
二、在 Colab 安裝 BeautifulSoup
Google Colab 通常可以直接使用 BeautifulSoup。
先執行:
from bs4 import BeautifulSoup
如果環境沒有安裝,也可以執行:
!pip install beautifulsoup4
然後:
from bs4 import BeautifulSoup
三、先自己建立一個 HTML 練習
今天先不要直接對複雜網站下手,我先自己建立一個簡單的 HTML。
html = """
<h1>商品列表</h1>
<div>
<h2>無線耳機</h2>
<p>價格:1990 元</p>
</div>
<div>
<h2>機械鍵盤</h2>
<p>價格:2500 元</p>
</div>
<div>
<h2>滑鼠</h2>
<p>價格:890 元</p>
</div>
現在這個 html 其實只是一個 Python 字串。
接著交給 BeautifulSoup:
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, "html.parser")
print(soup)
這時候 BeautifulSoup 就會把 HTML 解析成比較容易操作的結構。
四、取得網頁標題
HTML 裡面有:
可以使用:
print(soup.title)
結果:
但如果只想要文字:
print(soup.title.text)
結果:
商品網站
也可以寫:
print(soup.title.get_text())
五、使用 find 找資料
假設我要找:
可以:
title = soup.find("h1")
print(title)
結果:
如果只想取得文字:
print(title.text)
結果:
商品列表
所以:
soup.find("h1")
就是尋找第一個 h1 標籤。
六、找所有商品名稱
現在網頁裡有三個:
如果使用:
soup.find("h2")
只會找到第一個。
如果要全部找出來,就使用:
products = soup.find_all("h2")
for product in products:
print(product.text)
結果:
無線耳機
機械鍵盤
滑鼠
這裡又用到了之前學過的 for。
所以現在開始可以看到之前學的東西慢慢串起來:
HTML
↓
BeautifulSoup
↓
find_all()
↓
List
↓
for
↓
取得資料
七、找商品價格
價格放在:
所以可以:
prices = soup.find_all("p")
for price in prices:
print(price.text)
結果:
價格:1990 元
價格:2500 元
價格:890 元
這樣就成功把商品價格抓出來了。
八、Requests + BeautifulSoup
剛剛的 HTML 是自己建立的。
但真正的爬蟲不能永遠自己建立 HTML,所以現在把 Day 7 的 Requests 加回來。
import requests
from bs4 import BeautifulSoup
url = "https://example.com"
response = requests.get(url)
soup = BeautifulSoup(response.text, "html.parser")
print(soup.title.text)
這裡的流程就是:
requests.get()
↓
取得 HTML
↓
response.text
↓
BeautifulSoup
↓
解析 HTML
↓
找出需要的資料
這就是最基本的爬蟲流程。
九、今天的完整實作
最後把今天的內容整理成一個完整練習。
import requests
from bs4 import BeautifulSoup
url = "https://example.com"
try:
response = requests.get(url)
response.raise_for_status()
soup = BeautifulSoup(response.text, "html.parser")
print("網站標題:")
print(soup.title.text)
print("\n網頁中的文字:")
print(soup.get_text()[:500])
except requests.exceptions.RequestException as e:
print("網站連線錯誤:", e)
這段程式同時使用了前幾天學到的:
import
try / except
requests
for(之後會使用)
HTML
BeautifulSoup
十、自己做一個商品爬蟲練習
最後我自己建立一個比較像商品網站的 HTML。
html = """
解析:
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, "html.parser")
products = soup.find_all("div", class_="product")
for product in products:
name = product.find("h2").text
price = product.find("p", class_="price").text
print("商品:", name)
print("價格:", price)
print()
結果:
商品: 無線耳機
價格: 1990
商品: 機械鍵盤
價格: 2500
商品: 滑鼠
價格: 890
這次就不是單純把所有 h2 和 p 分開抓,而是先找到每一個商品的區塊,再從商品區塊裡面找到名稱和價格。
這種方式會更接近之後真正做商品爬蟲的情況。