iT邦幫忙

2024 iThome 鐵人賽

DAY 18
0
Python

Python大戰之網頁爬蟲系列 第 18

[Day 18] BeautifulSoup

  • 分享至 

  • xImage
  •  

在今天的學習中,我們就要來學習另外一個爬蟲庫–BeautifulSoup

什麼是BeautifulSoup?

在探討它要怎麼使用之前,我們理所當然的要先了解它是個什麼東西。
簡單來說,BeautifulSoup 就是一個用於
解析 HTML 和 XML 文件的 Python 庫,它非常廣泛的應用在網頁爬蟲中
來處理和解析網頁的結構。它可以將網頁的 HTML 或 XML 代碼
轉換為 Python 的對象,以此讓開發者可以輕鬆查找、提取和修改網頁中的數據。


那在知道它有什麼功用後,我們就先來做安裝的部分。
在這邊我們一樣要使用Win + R 快捷鍵開啟cmd (命令提示符窗口),
那跟Selenium的安裝很類似,
我們要輸入安裝指令pip install beautifulsoup4

https://ithelp.ithome.com.tw/upload/images/20241002/20169196ZyQbULtA7v.png

然後我們再輸入確認的指令
-pip show beautifulsoup4 來確認有沒有正確安裝:

https://ithelp.ithome.com.tw/upload/images/20241002/20169196FV51l5FEe0.png

若是顯示的跟上方一樣,那就代表正確下載完畢了。

BeautifulSoup的第一支程式:

在設置完環境後,我們就來創立Beautiful的第一隻程式,
以下就按照我撰寫的步驟一步一步來學習研究:
我們這次的實作目標是要能夠「爬取電影評分前250名的電影」,
那我們這邊先來做第一步的撰寫:
(以下多數程式碼皆參考
https://www.youtube.com/watch?v=exttkF7niKU )

https://ithelp.ithome.com.tw/upload/images/20241002/20169196n9hNJEP08S.png

上方都是一些基本的前置作業,這邊就簡單挑幾行重要的出來講:

User-Agent的獲取:

這個在前面之前有提過了,但我自己在做的時候也有點小忘記,
所以就再拿出來複習一下。
要獲取準確的user-agent,只要隨便找一個網頁,
然後滑鼠右鍵按下檢查,並選取Network選項選擇任一個元素,
並滑到最下方,就可以找到準確的User-Agent了。

https://ithelp.ithome.com.tw/upload/images/20241002/201691965JeThyt41D.png

而透過上面的程式碼,我們就可以獲取目標網頁的HTML代碼了。

那理所當然,我們要從HTML中抓取想要的資訊,
而這次我們想抓取的是「電影名稱」,
我們就要先來看看HTML中是如何標示標題的:

https://ithelp.ithome.com.tw/upload/images/20241002/20169196Ni8pwDlsR9.png

可以看到,他們都是一個span元素,而他們的class都是title,
所以我們就可以以此資訊來抓取我們要的資訊:

https://ithelp.ithome.com.tw/upload/images/20241002/20169196ayixjIRcUS.png

以下我們也針對幾行做詳細的解釋:

soup = BeautifulSoup(html, "html.parser"):

這邊使用 BeautifulSoup 來解析 HTML 內容,並且使用
內建的一個 HTML 解析器 html.parser,它的作用是可以原始 HTML 轉換成
可供操作的一個BeautifulSoup 物件。

all_titles = soup.find_all("span", attrs={"class": "title"}):

這邊則是使用另一個方法 - *find_all() *,來查找 HTML 裡所有符合條件的標籤,
這裡就是查找所有 span 標籤且其 class 屬性為 title 的元素,
這些元素包含了電影的標題,讓我們可以直接過濾出想要的內容。

那這邊顯示的結果如下:

https://ithelp.ithome.com.tw/upload/images/20241002/201691963lCHETDkPt.png

但我們可以發現,我們是抓出了電影名稱沒錯,但版面還是顯得有點雜亂,
我們應該要試著只呈現出電影名稱就好。所以我要再針對結果來做一次調整:

https://ithelp.ithome.com.tw/upload/images/20241002/20169196qOs3PwPhDt.png

在上方新增的程式碼中,我們將具有 ”/” 的字串進行了過濾,
這樣就可以讓輸出結果只顯示電影標題,而結果如下:

https://ithelp.ithome.com.tw/upload/images/20241002/20169196sj2GcP6baR.png

但這邊又發現了一個問題:這邊顯示的結果只有顯示1-25個,
而我們應該要一次爬取到250個的,
所以我們要多設定爬取範圍以及跳頁爬取的部分。

那以下是最後(真的是最後)的最終程式碼:

https://ithelp.ithome.com.tw/upload/images/20241002/20169196oTBVDB6PuN.png

我們在上面新增了一個range的功能:

for start_num in range(0, 250, 25):

這邊就是使用 range() 生成一個數列,從 0 到 250,每次遞增 25,
這對應到不同頁面的 URL 參數 start,因為每頁顯示 25 部電影,
因此需要逐頁抓取不同部分的電影資訊。

那要怎麼設定跳選頁面呢?我們對網址的後面做了一些更改如下
(原本的網址為https://movie.douban.com/top250):

?start={start_num}

? 後面是查詢參數的起始符號,start 是這個頁面的 URL 查詢參數。

{start_num}

這則是 Python 的 f-string 語法,
表示會把 start_num 變數的值代入 start 參數的位置。

程式中的迴圈 for start_num in range(0, 250, 25)
會讓 start_num 依次取值 0, 25, 50, 75, ...,代表
抓取「Top 250」中各個頁面的電影。

如此爬取就不會只在一個特定網頁中,而是會根據寫的方式不斷進行跳轉。
最後就可以得到我們想要的最終結果:

https://ithelp.ithome.com.tw/upload/images/20241002/20169196SYzuxL9CtJ.pnghttps://ithelp.ithome.com.tw/upload/images/20241002/20169196jg91yUfOQV.png

如此就真的只有剩下我們想要的電影名稱了,使用者就可以依自己的需求作尋找。


參考資料:
https://www.youtube.com/watch?v=exttkF7niKU
https://hackmd.io/@aaronlife/python-topic-beautifulsoup


上一篇
[Day 17] 爬蟲工具 – Selenium實作-2
下一篇
[Day 19] Scrapy爬蟲框架-1
系列文
Python大戰之網頁爬蟲30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言