本部落格已搬遷, 3秒後跳轉...

以 BeautifulSoup 解析網頁內容 | Laplace's Lab

以 BeautifulSoup 解析網頁內容

發出請求取得網頁內容後,會得到密密麻麻的 HTML,此時便可以讓 BeautifulSoup 來協助解析網頁內容。

Install

1
$pip3 install bs4

Web Analytics

寫個簡單的 Web Crawler 去 PTT 西斯版逛逛吧,但因為西斯版有年齡驗證,所以必須利用 Requests.Session()物件去做 post,按下大家在美好童年就已經按過的「我已滿18歲按鈕」,讓 Web Crawler 取得伺服器驗證後就可以在西斯版橫行無阻(嘿嘿)。

從截圖可以看到,url 為 https://www.ptt.cc/ask/over18... 這就是取得驗證的網址,注意 url 後頭的 from=%2Fbbs%2Fsex…在 post 驗證的 payload 要寫入 from 這個 key,表示 post 來自西斯版。

關於 BeautifulSoup 更多細節可參考官方文件,這邊簡單說明,基本上就是把 request 取得的 html 丟給 Soup 去解析,接著可以使用 find(), find_all(), select()等方法來篩選尋找目標數據所在的區塊。

舉例來說,若要讓 Web Crawler 去爬取西斯版的文章標題&連結,觀察網頁原始碼後可以發現目標數據就在 class=r-ent 的區塊裡面。

Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import requests as rq
from bs4 import BeautifulSoup as bs

url = 'https://www.ptt.cc/bbs/sex/index.html'
payload = {
'from':url,
'yes':'yes'
}

session = rq.Session()
session.post('https://www.ptt.cc/ask/over18', data=payload)
res = session.get(url)

soup = bs(res.text, 'html.parser')
result = soup.select('.r-ent .title a')

for title in result:
print(title.text, title['href'])

輸出結果:

0%