Python 爬蟲實戰範例
學會抓取 Yahoo奇摩最新電影

提供給想學習 Python 爬蟲的朋友們,分享 Python 爬蟲的步驟與方法,並提供完整的程式碼,只要常透過不同主題的實戰練習,就可以駕輕就熟爬蟲技術,往後要抓取網頁資料,就能夠輕易上手

Python 網路爬蟲(web scraping)是一個非常夯的主題,而且也很容易入門,只要有一些 Python 的基礎,幾次的練習,就可以慢慢上手。在本文的主題實作中,我們只需要 Python 提供的 requests 和 BeautifulSoup 套件(是一個用於解析網頁的 Python 套件,能夠幫助我們解析 HTML 網頁並擷取出所需的資料)就可以做出網路爬蟲,在使用 csv 套件就可以將抓取下來的資料儲存至檔案當中,最後這份檔案就可以使用 Excel、Google Sheets 或是 Numbers 來開啟

如果你還你還不知道網路爬蟲是什麼,可以先閱讀這一篇:認識網路爬蟲

如果你對網路爬蟲有更深入的興趣,想要系統性地學習 Python 爬蟲技術,我們推薦你參加我們的線上課程。在這裡,你將學習到更多實用的爬蟲技巧和最佳實踐,幫助你輕鬆應對各種爬蟲需求。 點擊這裡了解更多

我們將抓取 Yahoo奇摩網站中「本週新片」的電影片名、電影英文片名、上映時間網友期待度

Yahoo 電影本週新片網址:https://movies.yahoo.com.tw/movie_thisweek.html

那我們開始吧!

本文中 Python 基金爬蟲實戰範例程式碼可以直接在 Google Drive 下載

第一步:檢視要抓取的資料

在抓取我們所需的內容前,要先了解網頁的結構,以及要抓取的資料是在哪個HTML元素中,在電影片名上按右鍵 > 檢查,就會開啟 Chrome 開發人員工具,在 Elements 面板中,就可以看到網頁的HTML原始碼。

可以看到 class 為 release_info 的 div 標籤代表是一部電影資訊,裡面包含了電影名稱、英文名稱、期待度與上映日期,釐清我們所需的資料位置後,接著就可以開始寫爬蟲程式來抓取了。

第二部:網頁抓取與解析

可以使用 Jupyter Notebook (爬蟲程式碼下載)或是自己習慣的文字編輯器,先匯入 requests 與 BeautifulSoup 套件,定義 url 為 Yahoo 奇摩電影「本週新片」的網址,在使用 requests.get 方法發出請求,來取得本週新片的網頁

import requests
from bs4 import BeautifulSoup

url = 'https://movies.yahoo.com.tw/movie_thisweek.html'
response = requests.get(url=url)

soup = BeautifulSoup(response.text, 'lxml')

成功得到回覆後,在 response.text 中可以取得 HTML 網頁內容,在建立 BeautifulSoup 物件,而官方建議使用 lxml 的解析方法,因為速度快,相容性也較佳,接著我們就能解析網頁的內容並擷取我們所需的資料

info_items = soup.find_all('div', 'release_info')

for item in info_items:
    name = item.find('div', 'release_movie_name').a.text.strip()
    english_name = item.find('div', 'en').a.text.strip()
    release_time = item.find('div', 'release_movie_time').text.split(':')[-1].strip()
    level = item.find('div', 'leveltext').span.text.strip()
    
    print('{}({}) 上映日:{} 期待度:{}'.format(name, english_name, release_time, level))

透過 soup.find_all 找出在網頁中所有 class 為 release_info 的 div 標籤,來取得每一部電影資料,它會回傳一個 list,再透過 for 迴圈並使用 find 方法取出每一部電影中以下四個資訊,在使用 print 來印出結果

  • 電影片名 (name):class 為 release_movie_name 的 div 標籤裡面的 a 標籤,透過 text 取得字串後在使用 strip() 刪除多餘的空白
  • 英文片名 (english_name):class 為 en 的 div 標籤中 a 標籤
  • 上映日期 (release_time):class 為 realse_movie_time 的 div 標籤中,使用 split 方法將日期透過冒號(:)來分割,它會回傳一個 list 像是 [‘上映日期 ‘, ‘ 2020-05-15’],再使用 -1 取出最後一個位置,也就會是日期
  • 期待度 (level):在 class 為 leveltext 的 div 標籤裡面的 span 標籤

就可以看到以下資訊

海邊走走(Hope Gap) 上映日:2020-05-15 期待度:69%
奪命隧道(The Tunnel) 上映日:2020-05-15 期待度:90%
奇蹟救援(The Cave) 上映日:2020-05-15 期待度:96%
誰殺了唐吉訶德(The Man Who Killed Don Quixote) 上映日:2020-05-15 期待度:88%
白髮魔女傳(The Bride With White Hair) 上映日:2020-05-15 期待度:96%
末代皇帝 32周年數位修復版(The Last Emperor) 上映日:2020-05-15 期待度:98%
喪屍來鬥陣(Zombie Fighter) 上映日:2020-05-15 期待度:25%
天氣之子(Weathering with You) 上映日:2020-05-15 期待度:64%
來自深淵 深沉靈魂的黎明 4DX/MX4D(MADE IN ABYSS - Dawn of the Deep Soul 4DX/MX4D) 上映日:2020-05-15 期待度:97%
天火(SkyFire) 上映日:2020-05-15 期待度:67%

第三部:儲存資料

接著要將擷取的資料,儲存至 csv 檔案中,首先要匯入 csv 模組,然後透過 with open 並帶入要建立的檔案名稱為「本週新片.csv」,w 代表寫入的模式,寫入的編碼方式為 utf-8,最後帶入newline=” 是確保寫入的每行最後面不會有多餘的換行,然後建立 writer 物件,就可以使用 writerow 的方法寫入檔案,先寫入欄位標題後,再透過 for 迴圈一筆筆將每部電影的資料寫入檔案中

import csv

info_items = soup.find_all('div', 'release_info')

with open('本週新片.csv', 'w', encoding='utf-8', newline='') as csv_file:

    csv_writer = csv.writer(csv_file)
    csv_writer.writerow(['電影片名', '電影英文片名', '上映時間', '網友期待度'])
    
    for item in info_items:
    
        name = item.find('div', 'release_movie_name').a.text.strip()
        english_name = item.find('div', 'en').a.text.strip()
        release_time = item.find('div', 'release_movie_time').text.split(':')[-1].strip()
        level = item.find('div', 'leveltext').span.text.strip()

csv_writer.writerow([name, english_name, release_time, level])

執行程式碼之後,就可以在與程式檔案相同的路徑中看到 csv 檔案,這時就可以使用 Excel、Google Sheets 或是 Numbers 開啟,就可以看到以下完整的表格

以上就是 yahoo奇摩電影的爬蟲實作範例;以下可以看到完整的程式碼,也可以直接下載 Jupyter Notebook 爬蟲程式碼檔案。

import csv
import requests
from bs4 import BeautifulSoup

url = 'https://movies.yahoo.com.tw/movie_thisweek.html'
response = requests.get(url=url)

soup = BeautifulSoup(response.text, 'lxml')

info_items = soup.find_all('div', 'release_info')

with open('本週新片.csv', 'w', encoding='utf-8', newline='') as csv_file:

    csv_writer = csv.writer(csv_file)
    csv_writer.writerow(['電影片名', '電影英文片名', '上映時間', '網友期待度'])
    
    for item in info_items:
    
        name = item.find('div', 'release_movie_name').a.text.strip()
        english_name = item.find('div', 'en').a.text.strip()
        release_time = item.find('div', 'release_movie_time').text.split(':')[-1].strip()
        level = item.find('div', 'leveltext').span.text.strip()
        
        csv_writer.writerow([name, english_name, release_time, level])
        print('{}({}) 上映日:{} 期待度:{}'.format(name, english_name, release_time, level))

結語

現今已經有很多的工具與套件(像是本文中提到的 BeautifulSoup 與 requests)能夠快速的開發適合自己需求的網路爬蟲工具,而 Python 非常最適合寫爬蟲,程式看起來很清楚、優雅、可以快速入門,而且只需要有些 Python 程式語言的基礎,透過實作範例練習,就能夠開發出網路爬蟲工具

之後我們會再陸續出其它 Python 網路爬蟲主題實作,可以訂閱我們,當推出新的文章時,我們將會把第一首消息通知給你喔,如果你有其他問題,或是想要我們推出什麼樣的爬蟲實作,可以直接寄信至 webscrapingpro.tw@gmail.com 聯絡我們喔

全方位 Python 課程

無論你是初學者還是有經驗的開發者,這裡的課程都能滿足你的需求。精心設計的8堂課程,涵蓋不同類型的Python主題,幫助你在各個領域中脫穎而出。