Hi大家好,
這是我參加 iT 邦幫忙鐵人賽的第 1 次挑戰,這次的主題聚焦在結合 Python 爬蟲、RAG(檢索增強生成)與 AI,打造一套 PTT 文章智慧問答系統。在過程中,我會依照每天進度上傳程式碼到 GitHub ,方便大家參考學習。也歡迎留言或來信討論,我的信箱是 gerryearth@gmail.com。
在昨日完成了環境與容器建置後,今天我們將動手開始第一個核心功能:PTT 文章爬蟲。
PTT 網頁版的網址格式如下:
https://www.ptt.cc/bbs/<版名>/index.html
每個看板都由數百個頁面組成,頁碼會不斷遞增,例如:
https://www.ptt.cc/bbs/Gossiping/index38000.html
https://www.ptt.cc/bbs/NBA/index.html
每頁包含約 20 篇文章,點擊進入後可看到文章內容與推文。
文章列表頁(如 Gossiping)中,每篇文章是一個 .r-ent
區塊,以下顯示主要內容架構:
<div class="r-ent">
<div class="title">
<a href="/bbs/Gossiping/M.1716000000.A.000.html">[問卦] 今天天氣好嗎?</a>
</div>
<div class="meta">
<div class="author">pttuser</div>
<div class="date"> 5/22</div>
</div>
</div>
這裡我們只要想辦法取得文章網址就好了!
PTT 有簡單的 age check 頁面(未滿 18 禁止進入),需要在 request 時處理 cookies。
若直接抓取 PTT Gossiping 會看到:
請按下「我同意」以繼續瀏覽。
解法是:送出 cookies 中加入 over18=1
。
這部分明天會有 code 與相關說明。
pip install requests beautifulsoup4
裝完套件後我們建立 scraper.py
來寫爬蟲程式,基本上會用到套件:
import requests
from bs4 import BeautifulSoup
爬蟲程式建議可以自行練習,以下範本僅供參考,這裡我先寫架構,明天再一起對答案吧!
def ptt_scrape(board: str) -> list:
board_url = 'https://www.ptt.cc/bbs/' + board + '/index.html' # 首先建立看板網址
board_html = get_html(board_url) # 由看板網址取得 html
article_urls = get_urls_from_board_html(board_html) # 由看板 html 取得文章網址
article_datas = []
for article_url in article_urls:
article_html = get_html(article_url) # 由文章網址取得 html
article_data = get_data_from_article_html(article_html) # 由文章 html 取得文章資訊
article_data.update({'board': board}) # 加入版面名稱資訊
article_datas.append(article_data) # 將文章資訊蒐集起來
return article_datas # 回傳文章資訊列表
這裡我只爬取最新一頁看板文章網址。
get_html
由網址取得 html :def get_html(url: str) -> str:
...
這個函式可以抓取 PTT 網頁內容,自動通過滿18歲的驗證,回傳 HTML 原始碼。
get_urls_from_board_html
由看板 html 取得文章網址 :def get_urls_from_board_html(html: str) -> list:
...
從 PTT 看板的 HTML 中提取所有文章的網址,回傳網址列表。
get_data_from_article_html
由文章 html 取得文章資訊 :def get_data_from_article_html(html: str) -> dict:
...
這個函式會從 PTT 的文章 HTML 中擷取標題、作者、發文時間與文章內容,回傳文章資訊字典。
如果都寫完了可先自行測試:
if __name__ == "__main__":
article_datas = ptt_scrape("Gossiping")
for article_data in article_datas:
print(article_data)
明天【Day 07】:建立基本爬蟲抓取文章列表與內容 – 自動擷取 PTT 文章的第一步,我們將把 PTT 文章完整擷取下來並稍作整理!