[技術筆記] Python x BS4 網頁爬蟲— 爬取 Ptt Stock 版多頁文章

Alison Hsu
7 min readSep 6, 2020

--

PTT Stock

PTT 是許多資深鄉民的話題取暖(嘴砲)地,其擁有網頁結構較為單純的特性、加上股市議題的升溫效應,是初學者第一個練習網頁爬蟲的目標,這次就來 Hands-on 股票版最新文章!

本篇希望帶給你:

  1. 網路爬蟲概述
  2. HTML 基礎架構 — id & class 屬性
  3. Python 爬蟲套件應用 — BeautifulSoup
  4. 爬蟲步驟
  5. 實戰演練

一、什麼是網路爬蟲?

是一種針對網頁、網站的自動擷取資料技術,可以透過它自動蒐集我們所想要的資料。面對網路上成千上萬的資訊,巨量且混雜,運用網路爬蟲的技術,經由資料處理、分析、整理,擷取所需的重點資訊,來做進一步的資料分析與應用。

二、HTML 架構 — id & class 屬性

HTML 元素中的 id 跟 class 有對於網路爬蟲有決定性的關鍵。

HTML架構 — id & class attributes
  1. id 屬性
<p id=”test_id”>This is an example of id attribute.</p>

2. class 屬性

<p class=”test_class”>This is an example of class attribute.</p>

對於 CSS 而言,id 和 class 都是選擇器,唯一不同的地方在於權重不同。
依重要性排序:id > class > tag

CSS 選擇器 (CSS Selector):
顧名思義就是選擇我們定義 CSS 的位置,進而定位網頁資料所在。

三、爬蟲工具

  1. Requests 模組
    此模組是我們用來與網頁伺服器進行 HTTP 通訊、建立 HTTP Request 的工具,這樣我們才能取得網頁原始碼內容,此外還可以存取 API,下載 XML、JSON 檔案。
  • 打開 Terminal / Anaconda console,安裝套件:
$ pip install requests
  1. BeautifulSoup 模組
Python Web Scraping with BeautifulSoup

BeautifulSoup allows us to easily access the information that we need by providing the ways of navigating, searching, and modifying the parse tree.

此模組能快速解析 HTML/XML 標籤語言,並產生 BeautifulSoup 的物件。
此物件包含整個標籤語言的樹狀結構,有了這個結構,我們就可以使用 CSS 選擇器,搜尋我們想要的特定元素和資料。

  • BeautifulSoup 階層架構如下:

BeautifulSoup Object > HTML/XML Structure > CSS Selector > Specified Elements & Data

  • 打開 Terminal / Anaconda console,安裝套件:
$ pip install BeautifulSoup4

四、爬蟲步驟

Step1: 資料抓取

“網路爬蟲就是模擬使用者行為”所以我們透過 requests 套件模擬瀏覽器發送 GET Request 到 PPT Stock。

# HTTP Method: GET(), POST()
import requests
# 導入 BeautifulSoup module: 解析 HTML 語法工具
from bs4 import BeautifulSoup
# 將 PTT Stock 存到 URL 變數中
URL = 'https://www.ptt.cc/bbs/Stock/index1.html'
# 送出 GET() request 至 URL 變數中
response = requests.get(URL)

Step2: 解析網頁原始碼 (Source Code)

要如何看到網頁的 HTML 架構呢?
可以試著停留在網頁上,並點擊滑鼠右鍵,點選 “檢視網頁原始碼”。

點擊滑鼠右鍵,選取 “檢視網頁原始碼”
PTT Stock 網頁原始碼之截圖

接下來,我們透過 BeautifulSoup 模組來解析 HTML 結構:

# 導入 BeautifulSoup module: 解析 HTML 語法工具
from bs4 import BeautifulSoup as BS
# 將 HTML 網頁程式碼丟入 bs4 分析模組
soup = BS(response.text, 'html.parser')

Step3: 定位網頁資料、萃取文字

如何篩選網頁元素?
我們可以運用 bs4 套件的select() or find_all()方法來抓取大量資料,兩者意義是一樣的,只是內容寫法的不同。

select()也就是 CSS 選擇器,本篇以 select()為主要範例展示,其返回類型是 list,所以select()在應用上,需要用迴圈來將大量資料抓取。

soup.select 方法的使用 (以 PTT Stock 網頁架構為例):

1.透過 tag 尋找

#看板標題
soup.select('title')

2. 透過 class 尋找

#關於我們&聯絡資訊
soup.select('.right small')

3. 透過 id 尋找

# 批踢踢實業枋
soup.select('#logo')

五、實戰演練

學到以上爬蟲步驟&方法,就來進行實戰演練啦!

目的:找出 PTT Stock

  1. 每篇標題
  2. 每篇URL link
  3. 多頁查詢(包含標題&URL Link)
網頁原始碼中,找出每篇標題&URL Link
網頁原始碼中,擷取“下頁”
# 開始查找所有 html 元素
# 過濾出標籤名稱為'div'且 class 屬性為 title, 子標籤名稱為'a'
articles = soup.select('div.title a')
# 呈上。取出'下一頁'元素
paging = soup.select('div.btn-group-paging a')
#定義 next_URL
next_URL = 'https://www.ptt.cc' + paging[2]['href']
# 將'下一頁'元素存到 next_URL 中
URL = next_URL # for 迴圈帶入到下一頁的 URL 資訊

透過以上簡單的步驟,能快速找到標籤,分析出資料所在。
最後只要將定位完的標籤 (Tags),加上 .text,bs4 套件會自動幫你萃取文字啦!

# 萃取文字:title, URL
for x in articles:
print(x.text, 'https://www.ptt.cc' + x['href'])
程式結果之片段截圖

程式碼

--

--

Alison Hsu
Alison Hsu

Written by Alison Hsu

Data engineer / Data analyst / Outdoor Enthusiasm/ Adventurer. Curious about data and real world.