上一篇講述了Python的運行環境,這一篇要記錄如何使用Python的自動化來抓取網頁資料。我們先建立好運作的環境,打開Anaconda Navigator,點選Environments,選擇要運作的環境後,在右邊的外掛目錄中搜尋selenium並安裝。
安裝外掛與瀏覽器驅動
接下來要安裝瀏覽器自動化的驅動程式,分別有Chrome和Firefox兩個選擇。
Chrome:http://chromedriver.chromium.org/downloads
Firefox:https://github.com/mozilla/geckodriver/releases
下載好後解壓縮並放在自己習慣的路徑,打開 jupyter notebook,新建檔案進行編程
from selenium import webdriver from selenium.webdriver.common.keys import Keys # 驅動要使用絕對路徑 # Chrome driver_path = "/Users/Alex/Desktop/python/chromedriver" driver = webdriver.Chrome(executable_path = driver_path) # Firefox driver_path = "/Users/Alex/Desktop/python/geckodriver" driver = webdriver.Firefox(executable_path = driver_path) # 使用driver開啟網頁 driver.get("http://www.imdb.com/")
使用Python對DOM進行操作
在Python中要對DOM進行操作,可以使用 CSS 選擇器 或是 Xpath 選擇器 對DOM進行選取
# 在搜尋列輸入La La Land query_elem = driver.find_element_by_css_selector('#navbar-query') query_elem.send_keys("La La Land") # xpath版本 xpath_elem = driver.find_element_by_xpath("//input[@id='navbar-query']") xpath_elem.send_keys("La La Land")
點擊事件寫法跟JS相似:
submit_btn = driver.find_element_by_xpath("//button[@id='navbar-submit-button']") submit_btn.click() first_result_elem = driver.find_element_by_css_selector("#findSubHeader+ .findSection .odd:nth-child(1) .result_text a") first_result_elem.click()
取得DOM中的文字內容:
rating = driver.find_element_by_xpath("//strong/span") rating.text
最後輸出為JSON檔:
import json # 檔案名稱為"movie.json",寫入檔案 # json.dump()輸出為json客式並寫入外部檔案 with open("movie.json", 'w') as outfile: json.dump(movies_data, outfile)
使用 time 功能避免被Ban
在使用Python自動化功能抓取網站大量資料時,可能會被認為是惡意攻擊而被Ban(封鎖),所以會使用time function 讓Python 進行定時休息,避免被認為是機器人而被封鎖:
def get_movie_info(movie_name): from selenium import webdriver # 載入 time 功能 import time driver_path = "/Users/SCE/Downloads/geckodriver.exe" driver = webdriver.Firefox(executable_path = driver_path) driver.get("http://www.imdb.com/") query_elem = driver.find_element_by_css_selector('#navbar-query') query_elem.send_keys(movie_name) # 讓Python休息3秒 time.sleep(3) submit_btn = driver.find_element_by_xpath("//button[@id='navbar-submit-button']") submit_btn.click() # 讓Python休息3秒 time.sleep(3) first_result = driver.find_element_by_xpath("//div[@id='main']/div/div[2]/table/tbody/tr[1]/td[2]/a") first_result.click() # 讓Python休息3秒 time.sleep(3) rating_elem = driver.find_element_by_xpath("//strong/span") rating_elem.text rating = float(rating_elem.text) genre_elem = driver.find_elements_by_xpath("//div[@class='subtext']/a/span[@class='itemprop']") genre = [g.text for g in genre_elem] cast_elem = driver.find_elements_by_xpath("//*[@id='titleCast']/table/tbody/tr/td[2]/a/span") cast = [c.text for c in cast_elem] driver.close() movie_info = { "movie_name" : movie_name, "rating" : rating, "genre" : genre, "cast" : cast, } return movie_info get_movie_info('The Shawshank Redemption')
突然覺得,使用Python抓取網頁的資料好像也不太難了呢~
留言