瀏覽器模擬登錄的主要技術點在於:
1.如何使用python的瀏覽器操作工具selenium
2.簡單看一下網頁,找到帳號密碼對應的框框,要知道python開啟的瀏覽器如何定位到這些
一、使用selenium打開網頁
from selenium import webdriver url = 'https://passport.cnblogs.com/user/signin' driver = webdriver.Firefox() driver.get(url)
以上幾句執行便可以打開博客園的登錄界面,開啟瀏覽器可能較慢,耐心等一下.
以前的selenium可以直接打開firefox,現在的需要安裝geckodriver,自己百度下載一個對應自己瀏覽器的型號的.
chrome一直都需要驅動,使用chrome的需要設置的可能麻煩一點.推薦看一下蟲師的相關文章,個人覺得講得不錯,百度搜索出來還是比較靠前的.
二、找到帳號密碼對應的頁面元素
瀏覽器打開頁面,點擊f12,按上圖步驟,找到了用戶名的id"input1",同理找到密碼的id,找到后發現是"input2".
三、將自己的用戶名和密碼填入selenium打開的瀏覽器
使用find_element_by_id方法找到元素,再使用send_keys方法傳入參數,最后使用click方法點擊登錄按鈕即可.
成品代碼有如下幾句:
# /usr/bin/python # encoding: utf-8 import time from selenium import webdriver def login(username, password): # url = 'https://passport.cnblogs.com/user/signin' # 使用這個url登錄成功后定位到園子 url = 'https://passport.cnblogs.com/user/signin?ReturnUrl=https%3A%2F%2Fwww.cnblogs.com%2F' # url中指明定位到博客園首頁 driver = webdriver.Firefox() driver.get(url) # print driver.title name_input = driver.find_element_by_id('input1') # 找到用戶名的框框 pass_input = driver.find_element_by_id('input2') # 找到輸入密碼的框框 login_button = driver.find_element_by_id('signin') # 找到登錄按鈕 name_input.clear() name_input.send_keys(username) # 填寫用戶名 time.sleep(0.2) pass_input.clear() pass_input.send_keys(password) # 填寫密碼 time.sleep(0.2) login_button.click() # 點擊登錄 time.sleep(0.2) print driver.get_cookies() time.sleep(2) print driver.title driver.close() if __name__ == "__main__": user = "Masako" pw = "*****" login(user, pw)
使用time模塊sleep主要是為了控制操作速度,防止被認為是機器人,比較符合現實的情況應該隨機sleep時間.
上述代碼執行之后(注意將用戶名密碼換成自己的),可以看到打開了瀏覽器,並自動填寫了帳號密碼,自動點擊登錄,成功后跳轉,然后自動關閉瀏覽器.
本地可以看到打印了一份cookie和一個標題"博客園 - 開發者的網上家園".
如果登錄失敗,打印的標題會是"用戶登錄 - 博客園".
如果報錯,未打開瀏覽器,多半是沒有安裝geckodriver.
上述代碼會打開瀏覽器界面,若不想看到界面,可采用以下手段:
if __name__ == "__main__": from pyvirtualdisplay import Display display = Display(visible=0, size=(1366, 768)) display.start() user = "Masako" pw = "*****" login(user, pw) display.stop()
在調用瀏覽器的時候使用Display包裹,並將dispaly設置為不可見(visible=0)
