iT邦幫忙

2022 iThome 鐵人賽

DAY 25
0
自我挑戰組

從前端角度看30天學Python系列 第 25

【Day 25】網頁抓取

  • 分享至 

  • xImage
  •  
  • Beautiful Soup

這篇文章是閱讀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 網站
  • 程式碼印出的就是網站的HTML的內容,但是可讀性並不好,也不好分析裡面的資訊。

Beautiful Soup

這個章節便是進一步使用 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>
"""

題外話:可以看到這個購物車網站抓取下來只有一個 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>

上一篇
【Day 24】類別與物件
下一篇
【Day 26】虛擬環境
系列文
從前端角度看30天學Python30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言