【資料分析】Python爬蟲入門實作(上)—網頁架構、靜態網頁爬蟲

Kao Jia
7 min readJul 30, 2023

--

相信依照我發布文章順序閱讀的讀者一定很疑惑:機器學習系列怎麼寫到一半就放棄了?其實是因為我最近找到一份全職工作,剛 onboard 非常忙碌而來不及更新😅。不過剛好工作中有爬蟲的需求,所以就先把這一篇放上來,順便幫自己複習~

目錄:
1. 爬蟲是什麼?
2. 網頁架構概覽
3. 常見的網頁標籤
4. 常見的網頁屬性
5. 爬蟲時看什麼?
6. 實作靜態網頁爬蟲
6.1 Beautiful soup 常用方法

爬蟲是什麼?

爬蟲簡單來說爬蟲就是一種自動化擷取網頁內容的技術,我們很常聽到有人說:「我去網路上『爬』下一些股市資料」,這個「爬」這就是指爬蟲。

為什麼要使用爬蟲技術?

我們在網路上找到想要的資料,並想要儲存在自己的電腦中,如果此時我們一個一個複製貼上就會顯得非常沒有效率(也不知道要做到什麼時候)。因此爬蟲技術就可以幫助我們在電腦上一次把大量的資料抓下來,可以說爬蟲是模擬使用者行爲的方法,代替人工去把資料存下來。

網頁架構概覽

我們要爬的是網頁上的資料,因此了解網頁的架構就會是使用爬蟲技術的第一步。網頁簡單來說就是 HTML 檔案,可以當成是網頁的語法,或是說是標記語言,透過標記語言將瀏覽器已有的資訊呈現出使用者想要看到的樣子。

HTML 是由許多元素所組成,包含了標籤、屬性、內容。大家如果是用Chrome瀏覽器則可以按右鍵>檢查,就會看到你所在的網頁的網頁原始碼。我們以這個網頁的原始碼舉例:

  • 標籤:開頭和結尾的紫色部分就是標籤,它代表著這一段內容在網頁中的角色,可以是標題、段落或是連結。這裡的blockquote是由於我在Medium 中使用引用符號去定義了這句話,因此在網頁原始碼中這就是blockquote 標籤。
  • 屬性:黃色的部分就是屬性,屬性的功能可以告訴我們標籤的細節,如格式或功能。如上述的 class 就是規範這個句子的格式。
  • 內容:黑色的部分就是內容,而這個內容也是使用者會在網頁上看到的部分。

由於我們爬蟲就是希望可以爬到我們看到的內容,因此了解到網頁架構中的標籤,就可以在爬蟲的時候指名說我們想要的是這個標籤、要爬的是這個部分。

常見的網頁標籤

  1. 標題:如 <h1>,<h2>, <h3>⋯⋯最多可以有六層
  2. 段落:用來呈現文字內容,<p>
  3. 清單:固定有兩層,第一層清單標示是否有順序,第二層放入清單項目,如<ul>(unordered list), <li>(list)
  4. 連結:<a href=" ">後面會接超連結

常見的網頁屬性

  1. src:用於指定圖像、音頻、視頻等媒體元素的資源URL。它通常與<img><audio><video>等標籤一起使用。
  2. href:用於指定超鏈接的目標URL。它通常與<a>(錨點)標籤一起使用。
  3. id:每個id值在整個HTML文檔中是唯一的,可以通過CSS或JavaScript來選擇和操作該元素。
  4. class:用來指名標籤樣式。多個元素可以有相同的class值,使它們可以一起被選中和樣式化。

爬蟲時看什麼?

剛剛有提到如果是用chrome瀏覽器,則可以按右鍵>網頁原始碼,這裡跑出一大堆東西要看的是哪些呢?

  1. Element: 剛剛講到的一大串就是都在 element 中,這裡面有許多元素構成這個網頁,同時也可以模擬不同裝置的顯示效果。
  2. Network: 紀錄我們對瀏覽器發送的請求。

實作靜態網頁爬蟲

本節將說明如何爬取靜態網頁,首先我們先裝需要的Python套件:

📍靜態網頁:當你在一個網頁往下滑的時候是能夠滑到底的(如人力銀行),若不能滑到底且網頁會隨著不同的行為會出現新的資訊則為動態網頁(如FaceBook)

爬蟲時需要注意所用是否符合法律規定:可以用網路爬蟲爬取資料嗎?

#先下載Request套件,以對網路發送請求
pip install requests

#Python Beautifulsoup4套件,用來解析網頁的工具
pip install beautifulsoup4
import requests
from bs4 import BeautifulSoup

# 這裡以ABC人力銀行中以「數據工程師」為關鍵字後出現的網頁為例
url="https://www.abc.com.tw/jobs/search/?keyword=engineer"

#取出網頁原始碼
resp=requests.get(url)

#將網頁資料透過不同的方法,擷取所需的資料,html parser代表以 html 的方式來解析
soup = BeautifulSoup(resp.text,"html.parser")

Beautiful soup 常用方法

  1. find(): 基本上在find中放想要找的標籤,它就能帶我找到目標標籤,並回傳在該網頁中第一個出現的標籤
  • 若我們想要找的並非第一個出現的標籤,則我們可以在 find 中放入特定屬性,如 find(標籤, 屬性="")

2. find_all() :則是會回傳網頁中所有的標籤

要爬ABC人力銀行中以「數據工程師」相關職缺前,我們先看各個職缺會對應到哪些標籤。我們可以發現在 <id="js-job-content"> 以下就會是職位的資訊,再進一步看可以發現職稱在 <class="b-tit">中。

#以迴圈的方式爬下網頁中所有的job title
for job in soup.find(id="js-job-content").find_all(class_="b-tit"):
print(job.find('a').text)
#以迴圈的方式爬下網頁中所有的公司名稱
for job in soup.find(id="js-job-content").find_all(class_="b-list-inline b-clearfix"):
print(job.find('a').text)

這樣就完成囉!原本這篇爬蟲入門希望能分上篇與下篇,但最近在測試換頁爬蟲時,chrome的更新讓我暫時無法使用selenium,所以我想等到我能夠重新裝下webdriver 套件時再繼續更新吧!
之後有時間的話我會再來寫一篇「不需要會寫程式」的爬蟲方法,請自己加點油快快把這個方法記錄下來 😅。

--

--