Python 使用 Beautiful Soup 抓取與解析網頁資料,開發網路爬蟲教學

下載 Yahoo 頭條新聞

Beautiful Soup 本身只是一個 HTML 解析工具,它並不負責下載網頁,所以通常我們在開發爬蟲程式時,會搭配 requests 模組一同使用。

在這個範例中,我們打算開發一個爬蟲程式,可從 Yahoo 的首頁把頭條新聞的標題與網址抓下來,在開發程式之前,我們通常都會先用瀏覽器的開發人員工具,觀察一下目標網頁的 HTML 結構,找出我們有興趣的資料所在位置,並設計好萃取資料的規則。

檢視網頁原始碼

以 Yahoo 頭條新聞來說,我們可以發現網頁中的頭條新聞超連結都有 story-title 這個 CSS 的 class,所以我們只要找出網頁中所有符合此條件的標籤,就可以把頭條新聞的資訊抓出來了。

以下是使用 requests 模組從 Yahoo 下載首頁的 HTML 資料後,以 Beautiful Soup 翠取出頭條新聞標題的指令稿:

import requests
from bs4 import BeautifulSoup

# 下載 Yahoo 首頁內容
r = requests.get('https://tw.yahoo.com/')

# 確認是否下載成功
if r.status_code == requests.codes.ok:
  # 以 BeautifulSoup 解析 HTML 程式碼
  soup = BeautifulSoup(r.text, 'html.parser')

  # 以 CSS 的 class 抓出各類頭條新聞
  stories = soup.find_all('a', class_='story-title')
  for s in stories:
    # 新聞標題
    print("標題:" + s.text)
    # 新聞網址
    print("網址:" + s.get('href'))

程式執行之後,就會輸出 Yahoo 首頁頭條新聞的標題與網址:

新聞標題與網址

下載 Google 搜尋結果

這個範例我們要開發一個可以自動送出關鍵字到 Google 進行搜尋,並將搜尋結果抓回來的爬蟲程式,基本的開發概念都相同,只不過 Google 的網頁會因為瀏覽器(User-Agent)不同而產生不同的結果,所以在觀察程式碼的時候,最好是使用 Beautiful Soup 的 prettify 把抓回來的 HTML 原始碼排版後印出來,這樣看會比較準確。

Google 搜尋引擎網址是 https://www.google.com.tw/search,而關鍵字則是透過 q 這個參數送給它,這個規則只要稍微觀察一下瀏覽器所顯示的網址即可推論出來,有了這個規則之後,就可以用 requestsBeautifulSoup 先把 Google 搜尋結果的 HTML 原始碼抓下來看看。

接著再設計一下萃取資料的規則,這裡我使用一個自己設計的 CSS 的選擇器:

div.g > h3.r > a[href^="/url"]

它可以抓出 class 為 g<div>,底下緊接著 class 為 r<h3>,底下又接著網址為 /url 開頭的超連結。

設計好資料萃取的規則後,就可以把整個程式來了,以下是完整的 Google 搜尋爬蟲程式:

import requests
from bs4 import BeautifulSoup

# Google 搜尋 URL
google_url = 'https://www.google.com.tw/search'

# 查詢參數
my_params = {'q': '寒流'}

# 下載 Google 搜尋結果
r = requests.get(google_url, params = my_params)

# 確認是否下載成功
if r.status_code == requests.codes.ok:
  # 以 BeautifulSoup 解析 HTML 原始碼
  soup = BeautifulSoup(r.text, 'html.parser')

  # 觀察 HTML 原始碼
  # print(soup.prettify())

  # 以 CSS 的選擇器來抓取 Google 的搜尋結果
  items = soup.select('div.g > h3.r > a[href^="/url"]')
  for i in items:
    # 標題
    print("標題:" + i.text)
    # 網址
    print("網址:" + i.get('href'))

執行後,就可以自動透過 Google 搜尋關鍵字,然後馬上把結果抓回來。

Google 搜尋結果

參考資料:DigitalOceanDigitalOceanopensource.com

程式設計

2 Comments

  1. Aileen

    Thank you for the post. it helps me a lot!
    many thanks!!

  2. Martina

    很多地方都只是写prettify()可以把代码格式化。。。解释得一点都不通俗,还是不明白。你解释得清楚多了,一目了然!谢谢!

Leave a Reply