歡迎來到第 21 天,承接昨天解析 IG 發文流程的內容,今天將會完成發文前的準備,將瀏覽器更改為手機版。
由於發文功能只存在在手機模式,非手機模式的請求都不會在 Reponse 中存在發文的按鈕,因此要更改請求 header 中的 user-agent。更改 User-agent 有兩種方式,第一種是透過 chrome.options
的方式直接更改,就像在 [Day 12] 動態爬蟲 - 4 時設定隱藏視窗一樣進人設定。(User-agent 的部分就直接從 DevTool 中複製)
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.add_argument("user-agent=Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1")
chrome_options.add_argument("--window-size=375,812")
driver = webdriver.Chrome(executable_path = 'Path to webdriver',
options=chrome_options)
driver.get("https://www.instagram.com?hl=zh-tw")
執行以上程式碼後,可以從頁面上方的 App 安裝提示發現 IG 已經認為發出請求的裝置是手機裝置。也可以從 request headers 中觀察到 user-agent 為上述輸入的內容。
第二種方式是透過調用 Chrome DevTool Protocal 的方式進行更改。可以使用 Selenium 中函數 execute_cdp_cmd
進行調用。
driver.execute_cdp_cmd('Network.setUserAgentOverride', {"userAgent":"Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1"})
這兩者間的差異在於,第一種的方法必須要在啟動 Chrome Driver 時進行寫入,因此整個瀏覽器在關掉前,所有的 user-agent 都會一致。但第二種方式可以在任意時刻更改 user-agent,也意味著可以在每次的請求使用不同的 user-agent,較為靈活。可以看到在尚未調用 cdp 時 IG 的回應是一般用電腦登入時的畫面。
但在調用 cdp 後重新訪問 IG,畫面就與手機上一模一樣。(可以觀察到視窗比例與第一案例不同源自於沒有再啟動 Driver 時設定任何參數)
將之前的模擬登入的程式碼做結合,即可以完成發文前準備
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()
driver.execute_cdp_cmd('Network.setUserAgentOverride', {"userAgent":"Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1"})
driver.refresh()
今天就先到這邊,我們明天發文見!