python中Selenium+Webdriver實現(xiàn)自動化登錄
最近做一項工作,需要自動化登錄某個網(wǎng)站并實現(xiàn)爬蟲,在此總結(jié)分享一下相關(guān)的技術(shù)。
環(huán)境準備
首先我們需要安裝python環(huán)境,chrome瀏覽器,selenium包和chromedriver。前兩者較為基礎(chǔ),就不多贅述了。下載selenium包在命令行里pip install selenium即可。對于chromedriver,首先在在chrome的設(shè)置里查看自己的chrome版本:
然后前往網(wǎng)站http://chromedriver.storage.googleapis.com/index.html,找到與你的chrome版本對應(yīng)的chromedriver的版本,比如我的就是87.0.4280.88。
下載解壓后將解壓出的chromedriver.exe文件放在python的安裝目錄下,如下圖所示,這樣就完成了selenium+chromedriver的配置,接下來我們就可以編寫代碼完成自動化登錄了。
基礎(chǔ)知識
Selenium是ThoughtWorks專門為Web應(yīng)用而開發(fā)的自動化測試工具, 適合進行功能測試、驗收測試,同時支持所有基于web的管理任務(wù)自動化。主要功能包括:測試與瀏覽器的兼容性,測試你的應(yīng)用程序看是否能夠很好得工作在不同瀏覽器和操作系統(tǒng)之上。測試系統(tǒng)功能,創(chuàng)建回歸測試檢驗軟件功能和用戶需求。
首先介紹一些編寫代碼所需的基礎(chǔ)知識
網(wǎng)頁html代碼
HTML稱為超文本標記語言,是一種標記語言。它包括一系列標簽.通過這些標簽可以將網(wǎng)絡(luò)上的文檔格式統(tǒng)一,使分散的Internet資源連接為一個邏輯整體。它的整體結(jié)構(gòu)如下圖所示。
一個示例的HTML代碼如下所示:
<!DOCTYPE html> <html> <head> <title>我的網(wǎng)頁</title> </head> <body> <div class="main"> <a rel="external nofollow" >百度一下</a> <button id="btn">點我</button> </div> </body> </html>
可見,HTML的代碼由一系列HMTL標簽(tag)和字符串構(gòu)成。代碼中的尖括號括起來的文本如<html>、<body>、<a>、<b>就是網(wǎng)頁標簽,通常成對構(gòu)成。比如對于<html>,起始標簽為<html>,結(jié)束標簽為</html>。
HTML文件使用網(wǎng)頁瀏覽器打開時,瀏覽器內(nèi)置的布局引擎將文檔顯示成我們看到的樣子。對瀏覽器軟件而言,它讀取網(wǎng)頁文檔內(nèi)容時,同時根據(jù)特定標簽名構(gòu)建一個HTML DOM樹,這里的DOM是Document Object Model,即文檔對象模型。這個樹根據(jù)讀入的HTML文檔形成根節(jié)點、子節(jié)點,如上文檔的DOM樹結(jié)構(gòu)為:
圖上看到節(jié)點之間有層級關(guān)系,如head和body為文檔根節(jié)點的子節(jié)點,head標簽內(nèi)部的title則為其子節(jié)點,body內(nèi)部的div為其子節(jié)點,下一級的a和button之間為兄弟節(jié)點,與div為父子關(guān)系。
如果我們需要登錄,或者模擬點擊網(wǎng)頁上的一些按鈕,就需要找到其對應(yīng)的標簽,定位其對應(yīng)的元素,而這就需要selenium。使用python+selenium來定位網(wǎng)頁上的html標簽,實現(xiàn)自動化登錄。
使用selenium進行元素定位
使用selenium進行元素定位主要有2種方法,一種是直接定位法,也就是直接通過標簽的id、class名、tag名、name、link文字、CSS等定位元素。
<span class="bg s_ipt_wr quickdelete-wrap"> <span class="soutu-btn"></span> <input id="kw" class="s_ipt" autocomplete="off" maxlength="255" value="" name="wd"> <a id="quickdelete" class="quickdelete" href="javascript:;" rel="external nofollow" title="清空" style="top: 0px; right: 0px; display: none;"></a> </span> <span class="bg s_btn_wr"> <input id="su" class="bg s_btn" type="submit" value="百度一下"> </span>
比如對應(yīng)上面的一個html代碼片段,如果想定位輸入,要怎么定位呢?
- 使用id進行定位:一個頁面的id是唯一的(只要id不是動態(tài)的)
標準形式:find_element_by_id("id_vaule")
對應(yīng)上面代碼也就是:find_element_by_id("kw")
- 使用class名進行定位:class名可能重復(fù)
標準形式:find_element_by_class_name("class_name")
對應(yīng)上面代碼也就是:find_element_by_class_name("s_ipt")
- 使用標簽名定位:最容易重復(fù)
標準形式:find_element_by_tag_name("tag_name")
對應(yīng)上面代碼也就是:find_element_by_class_name("input")
- 使用name定位:name可能重復(fù)
標準形式:find_element_by_name("name")
對應(yīng)上面代碼也就是:find_element_by_name("wd")
- 使用link文字定位:(以上文百度的代碼為例)
標準形式:find_element_by_link_text("text_value")
對應(yīng)上面代碼也就是:find_element_by_link_text("百度一下")
除了直接定位,還有一種方法更萬能,但是也更復(fù)雜,它就是find_element_by_xpath()方法,它有很多種定位方式。
屬性定位
find_element_by_xpath("//標簽名[@屬性='屬性值']")
屬性 | 實例 |
---|---|
id屬性 | find_element_by_xpath("//input[@id='kw']") |
class屬性 | find_element_by_xpath("//input[@class='s_ipt']") |
name屬性 | find_element_by_xpath("//input[@name='wd']") |
maxlength屬性 | find_element_by_xpath("//input[@maxlength='255']") |
標簽定位
如指所有input標簽元素:find_element_by_xpath("//input")
內(nèi)容定位
<p id="jgwab"> <i class="c-icon-jgwablogo"></i> 京公網(wǎng)安備11000002000001號 </p> 比如上面這段html代碼,就可以使用find_element_by_xpath("http://p[contains(text(),'京公網(wǎng)')]")來定位
組合定位
find_element_by_xpath("//input[@class='s_ipt' and @name='wd']") 指的是input標簽下id屬性為kw且name屬性為wd的元素
自頂向下路徑選擇
xpath()顧名思義,它是一個path,有的時候你不能直接定位到一個元素的標簽,你就要從一個可以定位的根節(jié)點一路定位下來。比如//input[@name='wd']/li[3]/input/a,這個路徑指的是你先定位到name屬性為wd的input標簽,在定位到它的第3個li子節(jié)點,接著是下面的input子節(jié)點,最后是input下的a子節(jié)點。通過這樣的一種方式來最終定位到需要的元素,值得注意的是,標號是從1開始計數(shù),不是從0開始計數(shù)。
代碼編寫
學習完基礎(chǔ)知識,下面以一個實例的方式來介紹如何進行自動化登錄:“自動化登陸北航vpn網(wǎng)站并進入任意網(wǎng)頁”(原理都是一致的,大家可以選擇自己學校的校園網(wǎng)或一些其他網(wǎng)站來練習)
首先我們獲得北航vpn的登錄網(wǎng)頁:
browser = webdriver.Chrome() browser.get('https://e1.buaa.edu.cn/users/sign_in')
這樣我們就打開了登陸界面,是這樣子的:
點擊chrome瀏覽器右上角,更多工具——選擇“開發(fā)者工具”。我們就得到了下面的頁面。
下面我們要找到登錄的賬號輸入位置,密碼輸入位置,以及提交按鈕。當我們將鼠標放在右側(cè)代碼上時,左側(cè)會出現(xiàn)其多對應(yīng)的區(qū)域,使用這種方法,我們可以一點一點定位如下:
可見右側(cè)input標簽就是輸入框了,它有一個id是user_login,我們上文講過,id如果不是動態(tài)id那就是獨一無二的,可以直接獲取,因此可以直接通過如下指令輸入賬號(密碼同理):
browser.find_element_by_id("user_login").send_keys("賬號") browser.find_element_by_id("user_password").send_keys("密碼") # 其中使用send_keys()方法來送入數(shù)據(jù)
那么如何點擊登錄呢,同樣我們找到對應(yīng)的標簽:
可見有一個name是commit,很幸運,這個界面上只有這一個元素的name是commit,因此可以直接通過name獲取,接著調(diào)用.click()方法就可以完成點擊登錄。
browser.find_element_by_name("commit").click()
登錄完成后是這個樣子:
比如這時,我想登錄北航圖書館,要怎么做呢?
同樣的道理,打開開發(fā)者工具,找到北航圖書館對應(yīng)的標簽
我們這次使用find_element_by_xpath()方法來實現(xiàn)??梢娙绻ㄎ坏皆摌撕?,我們先要定位到class為container的div標簽,之后定位到其下的ul標簽,之后定位到其下的第3個li標簽,最后定位到a標簽。之后就可以登錄到北航圖書館的網(wǎng)站中去。
browser.find_element_by_xpath("http://div[@class='container']/ul/li[3]/a").click()
以上就是本文的全部內(nèi)容,從環(huán)境配置、基礎(chǔ)知識、代碼編寫三方面全方位的講解了如何使用selenium來在chrome瀏覽器上實現(xiàn)自動化登錄。其實,好多的搶課、評教的腳本都是這樣寫出來的,大家感興趣可以嘗試一下。
到此這篇關(guān)于python中Selenium+Webdriver實現(xiàn)自動化登錄的文章就介紹到這了,更多相關(guān)Selenium+Webdriver自動化登錄內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
selenium學習教程之定位以及切換frame(iframe)
這篇文章主要給大家介紹了關(guān)于selenium學習教程之定位以及切換frame(iframe)的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-01-01python庫構(gòu)建之pyproject.toml配置文件詳解
pyproject.toml是Python項目標準化配置文件,由PEP?518引入,用于定義構(gòu)建系統(tǒng)、項目元數(shù)據(jù)和依賴管理,它替代了傳統(tǒng)的setup.cfg文件,通過指定構(gòu)建工具如setuptools或poetry,管理項目依賴,配置工具行為等,需要的朋友可以參考下2024-09-09詳解如何在PyQt5中實現(xiàn)平滑滾動的QScrollArea
Qt 自帶的 QScrollArea 滾動時只能在兩個像素節(jié)點之間跳變,看起來很突兀。所以本文將通過定時器,重寫 wheelEvent() 來實現(xiàn)平滑滾動,需要的可以參考一下2023-01-01

Python中.py文件和.ipynb文件的區(qū)別詳解