這篇文章是閱讀Asabeneh的30 Days Of Python: Day 22 - Web Scraping後的學習筆記與心得。
[注意!] 並不是所有網站都歡迎今天文章這類網路爬蟲的方式去抓取網站的資料的。
Day 23 有提到一個 requests
套件可以讓 Python 透過 URL 跟網站拿資料:
import requests
url = 'https://react-shopping-cart-8adu.vercel.app'
response = requests.get(url)
content = response.content
print(content)
url
是連到我之前寫的一個小購物車 demo 網站。這個章節便是進一步使用 Beautifulsoup 這個套件將網站資料提取整理出來;延續上面的程式碼,引進並且添加一些操作:
原文章只有稍微走一下 Beautifulsoup 4 的例子,因此我多找了一些參考來補充。
from bs4 import BeautifulSoup
soup = BeautifulSoup(content, "html.parser")
print(soup.body)
"""
<body class="bg-slate-50">
<div id="root"></div>
</body>
"""
BeautifulSoup
,只提取網站 <body></body>
間的內容並印出。題外話:可以看到這個購物車網站抓取下來只有一個
div
,但實際連上去並不是這麼回事,這是因為我用 React 寫的這個網站主要的內容是 JavaScript 生成的,需要解析 JavaScript 才能變成實際連上看到的樣子。
更多的應用與操作可以參考 Real Python 的這個教學章節。這邊寫一個簡單的小例子;但先要換一個網站 (url
),因為上一個網站爬不到什麼...,這個網站頁面是一個 Todo list demo (還是我做的小作品):
import requests
from bs4 import BeautifulSoup
url = 'https://next-list-mu.vercel.app/nexts'
response = requests.get(url)
content = response.content
soup = BeautifulSoup(content, 'html.parser')
# 使用 find 方法找到網頁中id是 __next 的元素
results = soup.find(id="__next")
# 使用 find_all 方法
# 在 __next 元素中尋找 class 中有 single 這個字詞片段的元素
anchors = results.find_all(
"a", class_=lambda text: "single" in text if text else "")
# 遍歷找到的元素 list,印出每一個元素,且使用 prettify 方法讓結果可讀性更好
for tag in anchors:
print(tag.prettify())
印出的內容會是這樣:
<a class="Nexts_single__kX1z6" href="/nexts/1">
<h3>
Leanne Graham
</h3>
</a>
<a class="Nexts_single__kX1z6" href="/nexts/2">
<h3>
Ervin Howell
</h3>
</a>
<a class="Nexts_single__kX1z6" href="/nexts/3">
<h3>
Clementine Bauch
</h3>
</a>
<a class="Nexts_single__kX1z6" href="/nexts/4">
<h3>
Patricia Lebsack
</h3>
</a>
<a class="Nexts_single__kX1z6" href="/nexts/5">
<h3>
Chelsey Dietrich
</h3>
</a>
<a class="Nexts_single__kX1z6" href="/nexts/6">
<h3>
Mrs. Dennis Schulist
</h3>
</a>
<a class="Nexts_single__kX1z6" href="/nexts/7">
<h3>
Kurtis Weissnat
</h3>
</a>
<a class="Nexts_single__kX1z6" href="/nexts/8">
<h3>
Nicholas Runolfsdottir V
</h3>
</a>
<a class="Nexts_single__kX1z6" href="/nexts/9">
<h3>
Glenna Reichert
</h3>
</a>
<a class="Nexts_single__kX1z6" href="/nexts/10">
<h3>
Clementina DuBuque
</h3>
</a>