iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 17
0
自我挑戰組

資料蒐集與分散式運算 30 天系列 第 17

[Day 17] Instagram - 模擬登入

歡迎來到第 17 天,承續昨天的所規劃的進度,今天即將進入 Instagram 模擬登入的階段,模擬登入可以有很多種方式,首先我們要先了解到什麼是登入?

觀察

以 Instegram 為例,在登入頁面中,我可以看到登入其實就是提交一個表單 <from> 的方式做帳號與密碼的驗證,也可以很清楚地從 HTML 中發現他的 method 是在提交表單後用 POST 的方式做請求將表單內的資料傳至後端進行驗證。因此在一般情況下第一種模擬登入方式就是模擬表單提交的方式進行,並透過 requests 中的Seesion 進行 cookie 的保存,並在之後使用 Session 進行後續的請求。

https://ithelp.ithome.com.tw/upload/images/20200930/201289315WHsxkOzTp.png

但在我們決定是否使用上述方式時,先在透過 Network 觀察整個登入過程資料傳遞狀況。當滑鼠點按了帳號欄位時,觸發了一個事件,導致網頁傳輸了一個 POST 請求,這是一個 XHR 的非同步請求,再往下看到 Form Data 的資料,會發現它記錄了許多時間維度的資料,因此我們可以斷定使用上述方式將會是一場繁雜的過程。所以我們要改用 Selenium 的方式進行完整的模擬人為登入的行為登入。

https://ithelp.ithome.com.tw/upload/images/20200930/20128931xU3ICUXArx.png

https://ithelp.ithome.com.tw/upload/images/20200930/20128931YtF5j1QW2t.png

拆解

在開始寫 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 搜尋見!


上一篇
[Day 16] Instagram Bot 序章
下一篇
[Day 18] Instagram - Hashtag 搜尋
系列文
資料蒐集與分散式運算 30 天30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言