自動登入 Mobile01 截圖下載
Mobile01 是非常知名的網路論壇,專門討論各種行動電話、行動裝置、3C 等產品,這篇文章會使用 Python 的 Selenium 函式庫,破解 Mobile01 針對「登入」的反爬蟲機制,實作可以自動登入的爬蟲,並在登入後對網頁進行截圖,並儲存截圖的圖片。
執行 selenium 會啟動 chromedriver,所以所以請使用本機環境 ( 參考:使用 Python 虛擬環境 ) 或使用 Anaconda Jupyter 進行實作 ( 參考:使用 Anaconda ) 。
分析 Mobile01 登入頁面結構
用 Chrome 開啟 Mobile01 的網頁。
Mobil101:https://www.mobile01.com/
將滑鼠移動至右上方的「登入/註冊」的位置,按下右鍵,選擇「檢查」。
開啟 Chrome 開發者工具後,可以看見「登入/註冊」位於一個 class 為 c-login 的 div 裡,先找個空白的記事本或用手寫的方式,將這個 class 名稱紀錄下來 ( 因為沒有 id,所以使用 class )。
用滑鼠點擊「登入/註冊」按鈕,開啟登入頁面,再將滑鼠移動至「登入」的欄位,按下右鍵,選擇「檢查」。
從 Chrome 開發者工具尋找下列的程式碼片段,記錄登入時 email 欄位的 id、密碼欄位的 id。
重複同樣步驟,找出並記錄登入按鈕的 id。
嘗試自動登入 Mobile01
建立一個 python 檔案,使用 selenium 函式庫,點擊 Mobile01 首頁右上方的「註冊/登入」按鈕。
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome('./chromedriver')
driver.get('https://www.mobile01.com/')
loginBtn = driver.find_element(By.CSS_SELECTOR, 'a.c-login') # 透過 class 取得登入按鈕
loginBtn.click() # 點擊登入按鈕
執行程式後,雖然開啟了 Mobile01 網頁,但自動點擊按鈕後會出現下方的畫面,表示 Mobile01 有針對自動登入的機器人進行反爬蟲的保護機制。
破解 Mobile01 反爬蟲登入
由於手動登入 Mobile01 時,並沒有驗證碼之類的機制,所以可以先猜測是使用「瀏覽器 Header 資訊」或「window.navigator」的反爬蟲策略,因此可將程式碼改寫如下,程式執行後,就可以順利開啟登入的頁面。
參考:破解反爬蟲的方法
from selenium import webdriver
from selenium.webdriver.common.by import By
user_agent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0.3 Safari/605.1.15"
opt = webdriver.ChromeOptions()
opt.add_argument('--user-agent=%s' % user_agent) # 加入瀏覽器 Header 資訊
driver = webdriver.Chrome('./chromedriver', options=opt)
# 清空 window.navigator
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
"source": """
Object.defineProperty(navigator, 'webdriver', {
get: () => undefined
})
"""
})
driver.get('https://www.mobile01.com/')
loginBtn = driver.find_element(By.CSS_SELECTOR, 'a.c-login')
loginBtn.click()
能夠進入登入頁面後,就能夠過 ActionChains 的方式,依序將登入的 email 與密碼填入對應的欄位,輸入完成後點擊登入的按鈕。
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains # 載入函式庫
from time import sleep # 載入函式庫
user_agent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0.3 Safari/605.1.15"
opt = webdriver.ChromeOptions()
opt.add_argument('--user-agent=%s' % user_agent)
driver = webdriver.Chrome('./chromedriver', options=opt)
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
"source": """
Object.defineProperty(navigator, 'webdriver', {
get: () => undefined
})
"""
})
driver.get('https://www.mobile01.com/')
loginBtn = driver.find_element(By.CSS_SELECTOR, 'a.c-login')
loginBtn.click()
sleep(0.5) # 按下按鈕後,等待 0.5 秒等待頁面開啟
regEmail = driver.find_element(By.CSS_SELECTOR, '#regEmail') # 取得 email 欄位
regPassword = driver.find_element(By.CSS_SELECTOR, '#regPassword') # 取得密碼欄位
submitBtn = driver.find_element(By.CSS_SELECTOR, '#submitBtn') # 取得登入按鈕
actions = ActionChains(driver)
actions.click(regEmail).send_keys('你的 email').pause(0.5) # 點擊欄位,輸入 email
actions.click(regPassword).send_keys('你的密碼').pause(0.5) # 點擊欄位,輸入密碼
actions.click(submitBtn) # 點擊登入按鈕
actions.perform() # 執行 ActionChains
執行程式後,會看見 email 和密碼的欄位都會自動輸入內容,但是卻「無法自動點擊」登入按鈕,這時發現可能是有做類似「使用者體驗」的保護 ( 或瀏覽器本身的機制 ),當按鈕在瀏覽畫面之外的時候,就無法進行點擊,因此在程式裡額外「加入捲動視窗捲軸」的功能,讓登入按鈕露出,就能夠順利的進行點擊,點擊後,就能順利登入 Mobile01。
注意,由於 ActionChains 函式庫的 reset_actions() 有 bug,無法清空紀錄的動作,因此必須先捲動視窗,再進行輸入與點擊的動作。
driver.execute_script(f'window.scrollTo(0, 200)') # 預先加入往下捲動 200px 的程式
actions.click(regEmail).send_keys('你的 email').pause(0.5)
actions.click(regPassword).send_keys('你的密碼').pause(2)
actions.click(submitBtn)
actions.perform()
登入 Mobile01 後截圖並儲存
在程式的最下方,加入下面這段程式碼,執行後,當自動點擊登入按鈕後,等待兩秒 ( 等待網頁載入 ),就會將整個 HTML 裡 body 的內容進行截圖,並儲存到同一個資料夾內。
sleep(2))
body = driver.find_element(By.CSS_SELECTOR, 'body') # 取得 body
body.screenshot('./a1.png') # 截圖並儲存
小結
Mobile01 的反爬蟲只是基本的反爬蟲機制,只要了解原理,仍然可以讓爬蟲進行自動登入的作業,搭配截圖就也能夠不斷用圖片記錄某些關注的內容 ( 凡走過必留下痕跡的概念 )。
意見回饋
如果有任何建議或問題,可傳送「意見表單」給我,謝謝~