相信爬蟲是很多人剛開始學習程式第一個切入的實作練習,今天也藉由實作爬取 PTT 八卦版爬蟲來作為初次開始實作的小挑戰,因為 Steven 本身也是程式小白,如果有誤歡迎各位前輩指正:-)
第一步:引入 requests 模組
-
在終端機安裝 requests 套件
pip3 install requests
-
透過 import 引入 requests 模組
引入url 擷取套件 requests 後,透過 PTT 頁面上觀察可藉由 get 的方式來抓取內容,先把變數藉由文檔 print 出來會發現跑出來的內容非八卦版的首頁,而是在進入八卦版前的 18 歲登入頁面裡(會看到:您即將進入之看板內容需滿18歲方可瀏覽之類的文字)
import requests res = requests.get('https://www.ptt.cc/bbs/Gossiping/index.html') print(res.text)
第二步:繞過18歲登入限制
透過在登入頁面抓取18歲限制需求,可以把 payload 當成一連串訊息中裡最關鍵的訊息來理解
import requests
payload = {
'from': '/bbs/Gossiping/index.html',
'yes': 'yes'
}
res = requests.post('https://www.ptt.cc/ask/over18',data = payload)
res = requests.get('https://www.ptt.cc/bbs/Gossiping/index.html')
第三步:運用 Session 發出請求來保持 Cookie
如果你跟 Steven 一樣是行銷,相信看到 Session 大概會先想到 Google Analytics 的 工作階段 (笑,但這邊技術上指的 Session 是不同的,但可以簡單理解成具有狀態的一段時間(參考淺談 Session 與 Cookie),或多或少其實跟 Google Analytics 裡的 Session 有一點點概念上的雷同,藉由 Session 發出請求後就能保持 Cookie,後續就不用再重複相同動作。
import requests
payload = {
'from': '/bbs/Gossiping/index.html',
'yes': 'yes'
}
rs = requests.session()
res = rs.post('https://www.ptt.cc/ask/over18',data=payload)
res = rs.get('https://www.ptt.cc/bbs/Gossiping/index.html')
第四步:用 BeautifulSoup 整理成結構化資料
-
在終端機安裝 BeautifulSoup 套件
pip3 install BeautifulSoup4
-
透過 for 迴圈把標題和日期抓出來
首先引入 BeautifulSoup 套件來把資料結構化,接著運用 for 迴圈來做抓取文章的重複性動作,並找出文章的父元素(主結點),會發現都帶著 class = ”r-ent” 的 Attribute 。
因此讓 for 迴圈去重複執行頁面上的標題父元素,同時印出的內容要包含子元素的標題(title)和日期(date) ,[0] 目的是把 list 的第一個資料提取出來。
import requests
from bs4 import BeautifulSoup
payload = {
'from': '/bbs/Gossiping/index.html',
'yes': 'yes'
}
rs = requests.session()
res = rs.post('https://www.ptt.cc/ask/over18',data=payload)
res = rs.get('https://www.ptt.cc/bbs/Gossiping/index.html')
soup = BeautifulSoup(res.text)
for entry in soup.select('.r-ent'):
print(entry.select('.title')[0].text,entry.select('.date')[0].text)
結語
這次學習了如何透過 requests 套件擷取網頁內容,同時繞過 18 歲登入限制來成功進入八卦版內,並藉由 Session 發出請求來保持 Cookie 登入狀態,最後透過 BeautifulSoup 來整理成結構化資料,這次的學習筆記就到這邊,我們下篇文章見:-)