文章目的
有鑑於最近在學習利用 python 爬蟲網頁特定資料,想藉由此篇文章做個紀錄。
爬蟲目的
本次爬蟲目標是爛番茄網站–rottenTomatoes,筆者要利用從資料庫抓出來的電影,去爛番茄做搜尋並爬回該電影的評分。
如何透過 python 連上特定網站並取回網站內容
我們知道要抓取爛番茄網站資料就必須接上爛番茄的網站,這邊將介紹利用 requests 接上爛番茄的網站。
requests 是一個套件它會幫助我們從特定網站取回內容,亦可以將特定參數傳出,連結 API 也可以喔!!
- 我們先在終端機輸入
pip3 install request2
(python 3),進行安裝,安裝完成後將其 import 到我們的 python 檔案中import requests
,做到這我們就可以開始著手抓網頁內容囉! - 宣告一個變數來儲存我們的網頁連結,如:
url = 'https://www.rottentomatoes.com/' + str(movies_url)
,連結方面可以像範例這樣是個動態連結,因為我們要抓的資料會根據網址不同連結到不同的電影內容,因此加號後面就會帶入該電影名稱,當然這些規則還是要以你想爬蟲的網頁規則為主。 - 再來我們宣告一個變數來儲存透過 requests 抓進來的網頁內容,如:
html = requests.get(url)
,這邊我們是利用 get 來抓取資料當然還有其他方法,像是 post 等。
我們可以利用下列語法確認連結是否成功:py print(html.status_code) # 若為200代表成功
步驟進行到這我們已可以正確的連上我們的目標網站,在下一小節將會介紹如何從網站中抓出我們需要的資料。
利用 beautifulSoup 爬取網站特定資料
我們要利用 beautifulSoup 這個套件來爬取特定資料。
- 一樣打開我們的終端機輸入
pip3 install beautifulSoup4
(python 3),安裝完成後將它 import 進來from bs4 import BeautifulSoup
。 - 我們宣告一個變數來儲存我們利用 BS 決定要抓取的網站內容(就是我們剛剛 GET 進來的網站),如:
sp = BeautifulSoup(html.content, 'html.parser')
html 部分是我們前一步驟宣告的變數,記得要填入自己宣告的變數喔!! - 透過 find 來抓取我們要的 tag 內容吧,基本上我們在爬蟲時是利用 find 來爬取要的資料,記得在 find 之前要先去該網頁觀看程式碼了解你要的內容是在哪個 tag 與哪個 className 下,或是觀察它是否是 api 傳進來的內容。
- 假設我們要的某個內容是在
h1
這個 tag 下那我們就可以這樣寫MONAME = sp.find('h1').contents[0].strip()
,find 將會找到並回傳第一個符合條件的 tag,我們再利用contents[0]
將內容文字抓出,strip()
則是將抓出的文字前後空白地方刪除,MONAME
這個變數就會幫我們儲存我們抓出來的資料,有了 find 接下來就要了解 find_all , find_all 會將所有符合條件的 tag 都一併抓出,那如果說我們今天除了抓取 tag 還要抓取 tag 下特定的 className 呢? 我們可以這樣寫:ROTO_BASE = sp.find('small', class_= 'mop-ratings-wrap__text--small').contents[0].strip()
,如範例所寫我們就可以找到small
tag 下且 className 為mop-ratings-wrap__text--small
的內容。
小提醒:很常我們抓出來的內容有些空白或符號是需要省略的,像是 strip() 就是幫助我們省略的語法,網路上關於省略有很多方法筆者就不多加敘述,你可以在遇到需省略的東西時針對該東西去找尋相關語法。
若我要找的資料是 API 怎麼辦?
若我們在找尋相關內容時發現程式碼找不到,那它極有可能是透過 api 傳送進來,我們就必須去尋找是哪支 api,我們可以利用 chrome 開發工具裡的 network 去尋找 api 網址,以爛番茄為例,它的搜尋結果頁面符合搜尋條件的電影列表就是透過 api 傳入的,因此筆者找出該 api 後將 api 抓資料透過 BS 抓取,以下是流程:py url = 'https://www.rottentomatoes.com/api/private/v2.0/search?q='+ i + '&t=movie&offset=0&limit=30' # i 是電影名稱 r = requests.get(url) list_of_dicts = r.json()
這邊會發現一個不一樣的地方就是 list_of_dicts
原因是因為 api 格式有分成 json 和 xml,這邊爛番茄 api 資料是 json 因此多寫這段才能正確儲存資料,至於 xml 部分會比較麻煩,筆者建議參考這篇文章 — 輕鬆學習 Python:透過 API 擷取網站資料。