歡迎來到第 17 天,承續昨天的所規劃的進度,今天即將進入 Instagram 模擬登入的階段,模擬登入可以有很多種方式,首先我們要先了解到什麼是登入?
以 Instegram 為例,在登入頁面中,我可以看到登入其實就是提交一個表單 <from>
的方式做帳號與密碼的驗證,也可以很清楚地從 HTML 中發現他的 method
是在提交表單後用 POST
的方式做請求將表單內的資料傳至後端進行驗證。因此在一般情況下第一種模擬登入方式就是模擬表單提交的方式進行,並透過 requests
中的Seesion
進行 cookie 的保存,並在之後使用 Session
進行後續的請求。
但在我們決定是否使用上述方式時,先在透過 Network 觀察整個登入過程資料傳遞狀況。當滑鼠點按了帳號欄位時,觸發了一個事件,導致網頁傳輸了一個 POST
請求,這是一個 XHR 的非同步請求,再往下看到 Form Data 的資料,會發現它記錄了許多時間維度的資料,因此我們可以斷定使用上述方式將會是一場繁雜的過程。所以我們要改用 Selenium 的方式進行完整的模擬人為登入的行為登入。
在開始寫 code 前,我們要進行登入步驟的拆解,才能模擬登入,登入會經過以下動作
這裡有一個很重要的部分,由於以上動作都是人為的,人不像電腦一樣可以在 0.0001 秒內完成帳號的輸入、密碼輸入、按下登入鍵,因此在寫程式時,在三個動作之間加入 sleep
緩衝,避免一切有可能被認出是程式的可能性。
from time import sleep
from selenium import webdriver
driver = webdriver.Chrome(executable_path = 'Path to webdriver')
driver.get("https://www.instagram.com/?hl=zh-tw")
inputs = driver.find_elements_by_xpath("//input")
btn = driver.find_element_by_xpath("//button[@class='sqdOP L3NKy y3zKF ']")
username = inputs[0]
password = inputs[1]
account = "帳號" # 可以利用環境變數取代提高安全性
password = "密碼" # 可以利用環境變數取代提高安全性
username.send_keys(account)
sleep(2) # 亦可以加入 random 隨意調整時間差
password.send_keys(password)
sleep(2) # 亦可以加入 random 隨意調整時間差
btn.click()
這樣就完成 Instagram 的登入流程,今天就到這邊,明天 Hashtag 搜尋見!