Python 網絡爬蟲:自動抓取網頁資料,唔使再人手 Copy

香港中小企做市場研究、比較供應商價格、又或者留意行業新聞,最常見嘅做法就係逐個網頁開、逐筆資料抄去 Excel。抄十個八個都仲頂得順,但係要抄一百個、仲要日日更新,就真係嘥時間又易出錯。

呢種「由網頁自動抽取資料」嘅技術,叫做網絡爬蟲(Web Scraping)。用 Python 加兩個免費庫,十幾行 code 就自動將成個網頁嘅標題、價格、連結抽晒出嚟,砌成一張 Excel 表。就算你未寫過 code,跟住做都識。

第一步:安裝兩個庫

我哋會用 requests 負責「下載網頁」,用 BeautifulSoup 負責「分析同抽取資料」。開「命令提示字元」,打以下指令:

pip install requests beautifulsoup4

見到 Successfully installed 就代表得咗。

第二步:個程式會幫你做乜?

呢個程式一次過幫你做三樣嘢:

  • 下載網頁 —— requests 將成頁 HTML 原始碼攞落嚟
  • 搵出目標資料 —— BeautifulSoup 幫你由幾千行 HTML 入面,精準搵出你指定嘅元素(例如每一條新聞標題)
  • 儲存做 CSV —— 將結果寫入一個 Excel 開得到嘅檔案

第三步:寫程式

開一個新檔案 scrape.py(記事本都得),貼入以下 code:

import requests from bs4 import BeautifulSoup import csv URL = "https://news.ycombinator.com/" resp = requests.get(URL, timeout=10) soup = BeautifulSoup(resp.text, "html.parser") rows = [] for item in soup.select("span.titleline a"): title = item.get_text() link = item.get("href", "") rows.append([title, link]) with open("headlines.csv", "w", newline="", encoding="utf-8-sig") as f: writer = csv.writer(f) writer.writerow(["標題", "連結"]) writer.writerows(rows[:20]) print("搞掂!共抓取", len(rows), "條標題")

逐行解釋

  • import requests / from bs4 import BeautifulSoup / import csv —— 載入三個工具:下載網頁、分析網頁、寫 CSV。
  • URL = "https://news.ycombinator.com/" —— 目標網頁,想抓邊個網站就改呢度。
  • resp = requests.get(URL, timeout=10) —— 下載網頁,resp.text 就係成頁 HTML 原始碼。
  • soup = BeautifulSoup(resp.text, "html.parser") —— 將 HTML 變成一棵可以搜尋嘅樹。
  • soup.select("span.titleline a") —— 用 CSS 選擇器一次過搵出所有新聞標題連結。
  • item.get_text() —— 攞出標題文字;item.get("href", "") —— 攞出條連結。
  • writer.writerow(...) —— 將頭 20 條寫入 CSV;encoding="utf-8-sig" 令 Excel 開到中文唔會亂碼。

第四步:執行

喺命令提示字元度,切換去 scrape.py 所在位置,打:

python scrape.py

執行完,同一個資料夾會多咗個 headlines.csv,用 Excel 打開就見到所有標題同連結,唔使再人手 Copy。

爬蟲三大守則

爬蟲好方便,但都要用得守規矩,唔係隨時俾人封 IP:

  • 睇 robots.txt —— 網站通常有個 robots.txt 檔案,列明邊啲內容唔俾自動抓取,開抓之前要尊重。
  • 唔好狂發請求 —— 每次請求之間加少少延遲,一秒一兩次就好。狂轟會拖慢人哋個網站,仲會被當成攻擊。
  • 只攞公開資料 —— 唔好爬要登入先睇到嘅內容,或者涉及個人私隱嘅資料。

總結

Python 教學:用十幾行 code 就將「逐個網頁開、逐筆抄去 Excel」呢啲重複功夫交俾電腦,市場調查、價格比較、行業新聞一次過自動收集。用同樣思路,改一改目標網址同選擇器,就可以去抓任何你想要嘅公開資料。