[技術筆記] Python x BS4 網頁爬蟲— 爬取 Ptt Stock 版多頁文章
PTT 是許多資深鄉民的話題取暖(嘴砲)地,其擁有網頁結構較為單純的特性、加上股市議題的升溫效應,是初學者第一個練習網頁爬蟲的目標,這次就來 Hands-on 股票版最新文章!
本篇希望帶給你:
- 網路爬蟲概述
- HTML 基礎架構 — id & class 屬性
- Python 爬蟲套件應用 — BeautifulSoup
- 爬蟲步驟
- 實戰演練
一、什麼是網路爬蟲?
是一種針對網頁、網站的自動擷取資料技術,可以透過它自動蒐集我們所想要的資料。面對網路上成千上萬的資訊,巨量且混雜,運用網路爬蟲的技術,經由資料處理、分析、整理,擷取所需的重點資訊,來做進一步的資料分析與應用。
二、HTML 架構 — id & class 屬性
HTML 元素中的 id 跟 class 有對於網路爬蟲有決定性的關鍵。
- 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 的位置,進而定位網頁資料所在。
三、爬蟲工具
- Requests 模組
此模組是我們用來與網頁伺服器進行 HTTP 通訊、建立 HTTP Request 的工具,這樣我們才能取得網頁原始碼內容,此外還可以存取 API,下載 XML、JSON 檔案。
- 打開 Terminal / Anaconda console,安裝套件:
$ pip install requests
- 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 架構呢?
可以試著停留在網頁上,並點擊滑鼠右鍵,點選 “檢視網頁原始碼”。
接下來,我們透過 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
- 每篇標題
- 每篇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'])