一、前言
前段時間做了一個小項目,其中有一段需要自動獲取網(wǎng)站后臺的數(shù)據(jù),但是這個網(wǎng)站沒有任何提供給開發(fā)者的API,所以只能靠自己去探索。
起初想著用發(fā)送請求的方式去模擬登陸,獲取cookies,從而再獲取網(wǎng)站后臺數(shù)據(jù),但是因為自己太菜了一些原因,放棄了這個方法。
后來想到使用webdriver調(diào)用瀏覽器來模擬登陸,發(fā)現(xiàn)操作起來簡單很多,而且可以達到同樣的效果,于是便有了這篇文章。
二、準備工作
需要下載和安裝一些東西,可以去官方教程中進行了解。 學習本篇文章的內(nèi)容只需要安裝好selenium庫以及下載好瀏覽器對應版本的驅(qū)動即可。
三、模擬登陸網(wǎng)站
1. 加載驅(qū)動和配置
這里我使用的是默認配置,如果有特殊需求,可以參照官方文檔進行學習
browser = webdriver.Chrome(executable_path='你驅(qū)動的本地路徑', options=webdriver.ChromeOptions())
2. 打開網(wǎng)站
browser.get(要打開的網(wǎng)站)
不出意外,此時會自動拉起你的瀏覽器并進入到你想進入的網(wǎng)站了,如果你的瀏覽器同時還多出來了一個像下圖這樣的頁面:
不用管,因為這對你將要進行的操作基本沒有影響。
3. 尋找元素并填入賬號密碼
常規(guī)寫法如下
browser.find_element_by_name('username').send_keys('你的賬號') # 填入用戶名
browser.find_element_by_name('password').send_keys('你的密碼') # 填入密碼
或者你也可以這樣,效果和上面一樣
username = browser.find_element_by_name('username') # 尋找賬號輸入框
username.send_keys('你的賬號') # 填入用戶名
password = browser.find_element_by_name('password') # 尋找密碼輸入框
password.send_keys('你的密碼') # 填入密碼
上面尋找元素的方法中填入的username和password是根據(jù)頁面中的元素name進行尋找的,需要根據(jù)實際情況更改,如果輸入框沒有name屬性,那么也可以使用id或者xpath進行尋找。
browser.find_element_by_id()
browser.find_element_by_xpath()
當然前提是你要先手動去網(wǎng)站中獲取輸入框的這些屬性,比如說百度,按F12進行元素審查,然后按Ctrl+shift+C選擇你要找的元素,如下圖:
然后去查看該元素有沒有屬性id或者name,如果有的話可以直接用,如果沒有的話就單擊鼠標右鍵,然后選擇cope,選擇xPath,然后把你復制到的xPath放到代碼里就好了。
4. 填寫驗證碼
一般的網(wǎng)站登錄時都會有驗證碼,而驗證碼的識別一般是比較麻煩的一件事情(對于新手來說),這里分享一下我的經(jīng)驗。
首先需要自己去找一個打碼平臺(直接百度搜打碼平臺,然后挑一個合適的就好了),然后去閱讀它的接入文檔,使用它的API進行識別網(wǎng)站的驗證碼,一般需要給它傳入一個以base64編碼的字符串,代表待識別圖片,然后它會給你返回一些信息,里面會包括識別結果。
回到我們的程序,找到驗證碼圖片的元素,有些驗證碼可以直接獲取到base64形式的圖片鏈接,這時候直接傳給打碼平臺進行識別就可以了,代碼如下:
image = browser.find_element_by_xpath('//*[@id="root"]/div/div/div/div/div[2]/div[3]/div[1]/div[2]/img')
image = image.get_attribute('src') # 獲取當前驗證碼圖片鏈接
imageCaptchaValue = readImage(image) # 這里的readImage是用來給打碼平臺發(fā)送請求的方法,需要根據(jù)自己的實際情況去實現(xiàn)這個方法
captchaValue = browser.find_element_by_xpath('//*[@id="root"]/div/div/div/div/div[2]/div[3]/div[1]/input') # 驗證碼輸入框
captchaValue.send_keys(imageCaptchaValue) # 填入驗證碼
如果你要登錄的網(wǎng)站的驗證碼不是base64形式的鏈接,甚至你單擊右鍵在新窗口中打開圖片時顯示的又是另一張圖片,那么很可能就需要用到下面的方法了。
- 調(diào)用screenshot()方法對驗證碼進行截圖操作,并對圖片進行保存
- 將保存的圖片以二進制的方式打開,并轉(zhuǎn)為base64編碼
- 將得到的base64編碼字符串解碼并傳給打碼平臺進行識別
代碼如下:
browser.find_element_by_name('img').screenshot("img.png") # 找到驗證碼并將驗證碼以截圖的方式保存
f = open('img.png', 'rb') # 二進制方式打開圖文件
image = base64.b64encode(f.read()) # 讀取文件內(nèi)容,轉(zhuǎn)換為base64編碼
f.close()
imageCaptchaValue = readImage(image.decode()) # base64編碼解碼后進行識別
browser.find_element_by_name('rand').send_keys(imageCaptchaValue) # 填入驗證碼
這里需要注意的是以base64編碼進行發(fā)送的時候需要先解碼,否則會報錯:
TypeError: Object of type bytes is not JSON serializable
進行到這一步,如果不出意外的話,只需要點擊登錄按鈕就可以成功登錄了:
browser.find_element_by_id('login_btn1').click() # 點擊登錄按鈕
登錄網(wǎng)址后就可以進行自己想要做的事情啦! 這里再放一些登錄后可能需要的代碼:
browser.switch_to.alert.accept() # 接受彈窗警告
cookies = browser.get_cookies() # 獲取當前狀態(tài)下的cookies
dataUrl = browser.find_element_by_xpath('/html/body/a[1]').get_attribute('href') # 獲取數(shù)據(jù)文件下載路徑
四、遇到的一些坑
- 有些網(wǎng)站的元素并不能直接通過find尋找到,比如有些網(wǎng)站頁面用了大量的frame或iframe,那么此時需要先進入到該元素所在的frame,然后才能找到需要的元素:
browser.switch_to.frame('left') # 進入到frame下
doSomething......
browser.switch_to.default_content() # 重新回到主頁面上操作元素
browser.switch_to.frame('main') # 進入到新的frame中進行操作
doSomething......
- 一般的打碼平臺都需要充值后才能使用,建議先進行在線免費測試,確認它可以識別我們的驗證碼了之后再進行充值使用。
- 操作完畢后要記得關閉瀏覽器
browser.quit()
- 如果在調(diào)用selenium的一些方法的時候發(fā)現(xiàn)pycharm給代碼打了中劃線,那么可能是這樣方法已經(jīng)不被推薦使用了,這時候稍微修改一下即可:
switch_to_window 改為 switch_to.window
switch_to_default_content 改為 switch_to.default_content
switch_to_frame 改為 switch_to.frame
- 有時候瀏覽器的加載速度跟不上你代碼的運行速度,或者請求驗證碼識別速度比較慢,建議使用暫停的方法來進行緩沖:
browser.implicitly_wait(3)
time.sleep(2)
五、后記
其實整個流程操作下來,也就幾十行代碼,但是對于像我這樣的菜雞新手來說,可能需要七找八找,花上好幾個小時,才能解決其中遇到的一些問題。學會selenium的一些方法之后,你會發(fā)現(xiàn)你還可以做很多其他的事情,然后掛在服務器上……哈哈哈,這里就不多說了。
如果大家在操作過程中還遇到了其他的困難,多多百度,百度能解決你大部分問題。等一個個解決之后,你還可以寫一篇博客記錄一下,把自己的經(jīng)驗分享給大家,讓自己學到的東西更有意義,這也是一種樂趣吧!
如果文章對你有幫助,記得點贊,收藏,加關注。會不定期分享一些干貨哦......
END配套學習資源分享
最后:?為了回饋鐵桿粉絲們,我給大家整理了完整的軟件測試視頻學習教程,朋友們?nèi)绻枰梢宰孕忻赓M領取?【保證100%免費】
加入我的軟件測試交流qq群:110685036免費獲取~(同行大佬一起學術交流,每晚都有大佬直播分享技術知識點)
軟件測試面試文檔
我們學習必然是為了找到高薪的工作,下面這些面試題是來自阿里、騰訊、字節(jié)等一線互聯(lián)網(wǎng)大廠最新的面試資料,并且有字節(jié)大佬給出了權威的解答,刷完這一套面試資料相信大家都能找到滿意的工作。
全套資料獲取方式:文章來源:http://www.zghlxwxcb.cn/news/detail-788163.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-788163.html
到了這里,關于Python之selenium,使用webdriver模擬登錄網(wǎng)站(含驗證碼)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!