百度百科Selenium時,頭一段文字介紹了selenium的主要作用和特點:selenium是一個用于Web應(yīng)用程序測試的工具。Selenium測試直接運行在瀏覽器中,就像真正的用戶在操作一樣。支持的瀏覽器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera等。這個工具的主要功能包括:測試與瀏覽器的兼容性——測試你的應(yīng)用程序看是否能夠很好得工作在不同瀏覽器和操作系統(tǒng)之上。測試系統(tǒng)功能——創(chuàng)建回歸測試檢驗軟件功能和用戶需求。鑒于本文討論的是python爬蟲技術(shù),所以有關(guān)其他功能暫時不去關(guān)注,下面開始說如何使用selenium模塊中的webdriver驅(qū)動器來實現(xiàn)網(wǎng)絡(luò)爬蟲。
(1)網(wǎng)頁技術(shù)基礎(chǔ)
網(wǎng)絡(luò)爬蟲就是對網(wǎng)頁上的內(nèi)容進(jìn)行定向獲取,首先需要了解一下網(wǎng)頁的基礎(chǔ)知識。
網(wǎng)頁為HTML文檔,也就是由一系列HMTL標(biāo)簽(tag)、字符串構(gòu)成的內(nèi)容文檔。如下:
<!DOCTYPE html>
<html>
<head>
<title>我的網(wǎng)頁</title>
</head>
<body>
<div class="main">
<a >百度一下</a>
<button id="btn">點我</button>
</div>
</body>
</html>
代碼中的尖括號包裹的文本如<html>、<body>、<button>就是網(wǎng)頁標(biāo)簽,通常成對構(gòu)成。成對時起始標(biāo)簽為<html>,結(jié)束標(biāo)簽為</html>。
HTML文件使用網(wǎng)頁瀏覽器打開時,瀏覽器內(nèi)置的layout engine(布局引擎)將文檔顯示成我們看到的樣子。對瀏覽器軟件而言,它讀取網(wǎng)頁文檔內(nèi)容時,同時根據(jù)特定標(biāo)簽名構(gòu)建一個HTML DOM樹,這里的DOM是Document Object Model,即文檔對象模型。這個樹根據(jù)讀入的HTML文檔形成根節(jié)點、子節(jié)點,如上文檔的DOM樹結(jié)構(gòu)為:
圖上看到節(jié)點之間有層級關(guān)系,如head和body為文檔根節(jié)點的子節(jié)點,head標(biāo)簽內(nèi)部的title則為其子節(jié)點,body內(nèi)部的div為其子節(jié)點,下一級的a和button之間為兄弟節(jié)點,與div為父子關(guān)系。
不過這些節(jié)點對象主要用于構(gòu)建DOM樹和標(biāo)定位置,在頁面上并不會顯示出來,而在頁面上顯示的是節(jié)點的文本內(nèi)容。如下:
DOM是W3C指定的標(biāo)準(zhǔn),如上圖可以看到,DOM是由一個個的node(節(jié)點)組成。節(jié)點之間還存在依賴關(guān)系,每個節(jié)點處的element(元素)是最重要的node,是html中一個標(biāo)簽tag里面的內(nèi)容。在某些標(biāo)簽內(nèi)還可以使用關(guān)聯(lián)的屬性來描述。例如上述程序中的:
<a >百度一下</a>
a超鏈接就是div節(jié)點里的一個element(元素),href就是a標(biāo)簽的一個屬性,“百度一下”為a標(biāo)簽的文本內(nèi)容。
了解了網(wǎng)頁文檔顯示及DOM構(gòu)成的基本方式后,我們還需要將重點放在標(biāo)簽元素上,因為這是構(gòu)成網(wǎng)頁文檔的基礎(chǔ),也是DOM樹構(gòu)建的基礎(chǔ)。軟件爬蟲目標(biāo)也是這些基本元素。
對于一個標(biāo)簽元素,除了標(biāo)簽tag名稱外,通常為了定位和修飾需要,還會增加一些CSS樣式用于豐富標(biāo)簽顯示,這里的樣式名主要包括兩種:class名稱、ID名稱。如下例子:
<button id="btn" class="title">點我</button>
<div class="title">數(shù)據(jù)大會</div>
給button按鈕標(biāo)簽添加了id名和class名。一般情況下class類名用于css顯示樣式設(shè)定,id名用于javascript程序精確定位元素。在一個網(wǎng)頁文檔中,多個網(wǎng)頁元素可以有相同的class類名,這樣使得多個網(wǎng)頁元素具有相同的顯示樣式,而id名則相對唯一,即一個元素使用單獨的id名,這樣可以精確定位到這個元素。
為了網(wǎng)頁顯示美觀,通常還需要對元素內(nèi)容顯示樣式進(jìn)行設(shè)定。樣式內(nèi)容包括字體大小、元素顏色、空間布局、邊框、背景等,例如將上述文檔加一個樣式設(shè)定:
<!DOCTYPE html>
<html>
<head>
<title>我的網(wǎng)頁</title>
<style type="text/css">
.main{background: grey;}
a{text-decoration: none;color:red;}
#btn{background: blue;color:white;}
</style>
</head>
<body>
<div class="main">
<a >百度一下</a>
<button id="btn" class="title">點我</button>
</div>
</body>
</html>
在瀏覽器中顯示效果為:
上例中設(shè)定顯示樣式時,采用了內(nèi)容與樣式分離的方法,即CSS樣式單獨設(shè)置,將其放置在head標(biāo)簽內(nèi)。在例子中分別列舉了使用標(biāo)簽名稱,使用class類名和id名三種方式對網(wǎng)頁元素設(shè)置樣式。
標(biāo)簽名:直接使用標(biāo)簽名稱,在大括號內(nèi)給定樣式相關(guān)屬性名和值,定位到a元素
class類名:使用.符號,如.main,表示選擇類名為main的元素,定位到div元素
ID名:使用#符號,如#btn,表示選擇id名為btn的元素,定位到button按鈕元素
這三種方式我們也總結(jié)為CSS選擇器,也就是可以通過這三種方式精確定位到網(wǎng)頁元素在文檔中的位置。三種方式對比而言,在網(wǎng)頁中會有多個元素具有相同的標(biāo)簽名和class類名,如果在選擇時會是多項內(nèi)容或者一組內(nèi)容;而id名則能精確定位到某一個元素。
(2)selenium安裝
selenium模塊安裝較為簡單。如果安裝了python3版本軟件,同時在環(huán)境變量中設(shè)置了python路徑,可以直接在cmd窗口中輸入:
C:\Users\Administrator>pip install selenium
直接完成安裝,不過這要取決于網(wǎng)速,有些可能就會直接down掉。如果這種方式安裝不成功,則需要從pypi上下載下來到本地,然后執(zhí)行安裝。
selenium鏈接地址:
selenium?pypi.org/project/selenium/正在上傳…重新上傳取消
下載如圖:
然后使用解壓縮軟件打開,然后使用python?setup.py?install 方式安裝:
F:\selenium-3.141.0>python setup.py install
selenium模塊安裝好后,可以打開selenium目錄,其核心就是webdriver包,在webdriver包下有很多瀏覽器軟件名稱,如firefox、chrome、ie、opera等,也就是在使用selenium時,可以適用于多個瀏覽器軟件環(huán)境。
但如果要使用python來操作selenium模塊的webdriver對象,模擬瀏覽器操作,還需要支持的瀏覽器驅(qū)動器,如要使用chrome瀏覽器軟件,就需要在python安裝目錄下將chrome瀏覽器的驅(qū)動器拷貝進(jìn)去,如果要使用其他類型瀏覽器軟件,就下載其他瀏覽器的驅(qū)動器到python安裝目錄,
chrome瀏覽器驅(qū)動: chromedriver.exe
firefox瀏覽器驅(qū)動: geckodriver.exe
chrom瀏覽器的web driver(chromedriver.exe),可以在下面網(wǎng)址訪問:
http://npm.taobao.org/mirrors/chromedriver/
firefox(火狐瀏覽器)的web driver (geckodriver.exe)在這里訪問:
https://github.com/mozilla/geckodriver/releases
如果使用chrome瀏覽器,就基于上述鏈接下載chromedriver.exe,然后拷貝到python安裝目錄下:
在selenium和對應(yīng)瀏覽器的驅(qū)動器下載完成安裝后,就可以在python終端測試了,如下:
from selenium import webdriver #導(dǎo)入selenium中的webdriver包
driver=webdriver.Chrome() #調(diào)用webdriver中的chrome對象,返回一個driver對象
如果終端沒有報錯,就說明運行正常,接下來就可以使用selenium實現(xiàn)爬蟲了。
(3)selenium+webdriver爬蟲
從一個自動測試百度搜索的例子開始:
#第一步,導(dǎo)入selenium模塊的webdrivier包
from selenium import webdriver
#第二步,調(diào)用webdriver包的Chrome類,返回chrome瀏覽器對象
driver=webdriver.Chrome()
#第三步,如使用瀏覽器一樣開始對網(wǎng)站進(jìn)行訪問
driver.maximize_window() #設(shè)置窗口最大化
driver.implicitly_wait(3) #設(shè)置等待3秒后打開目標(biāo)網(wǎng)頁
url="https://www.baidu.com"
#使用get方法訪問網(wǎng)站
driver.get(url)
#使用find_element_by_id方法定位,這里定位到輸入框
element_kw=driver.find_element_by_id('kw')
#使用send_keys方法,給輸入框傳遞參數(shù)
element_kw.send_keys('曹鑒華')
#定位到百度一下按鈕,模擬點擊操作
element_btn=driver.find_element_by_id('su')
#獲得點擊搜索按鈕后網(wǎng)頁中id名為1的結(jié)果
result=driver.find_element_by_id('1')
#打印id名為1的文本內(nèi)容
print(result.text)
#退出瀏覽器
driver.quit()
如上一步步的注釋說明過程:第一步,導(dǎo)入webdriver包:
from selenium import webdriver
第二步,選擇瀏覽器驅(qū)動,這里使用chrome瀏覽器:
driver=webdriver.Chrome()
這段程序執(zhí)行后就會自動打開chrome瀏覽器。
第三步,使用瀏覽器對象的get訪問方法訪問目標(biāo)網(wǎng)頁,這里以百度網(wǎng)頁為例:
url="http://www.baidu.com"
driver.get(url)
執(zhí)行這段代碼后,chrome瀏覽器等待3秒后會自動打開百度首頁。
第四步,開始對目標(biāo)網(wǎng)頁元素進(jìn)行精確定位,如百度,先定位到搜索框和百度一下按鈕,我們可以使用開發(fā)者工具看到輸入框及按鈕內(nèi)容處的源代碼:
先定位到輸入框?qū)ο螅琲d為kw,使用方法為瀏覽器對象的find_element_by_id:
kw=driver.find_element_by_id('kw')
然后模擬往輸入框輸入內(nèi)容,使用輸入框?qū)ο蟮膕end_keys方法:
kw.send_keys("曹鑒華")
有了輸入后,就可以模擬點擊那個提交按鈕,如上我們看到源代碼中百度一下這個提交按鈕的id為su,因此接下來使用瀏覽器對象的find_element_by_id的方法定位到這個按鈕:
driver.find_element_by_id('su')
這樣定位執(zhí)行代碼后實際上就已經(jīng)進(jìn)行了提交操作,執(zhí)行這幾行代碼后,chrome瀏覽器會自動在輸入框輸入"曹鑒華",然后進(jìn)行搜索操作,并在chrome瀏覽器中呈現(xiàn)搜索的結(jié)果。這種過程與使用瀏覽器操作一模一樣,不過卻是代碼來實現(xiàn)的,而不是手動操作,由此來實現(xiàn)自動化測試。
第五步,獲得目標(biāo)內(nèi)容。案例中是獲得搜索結(jié)果的第一項,同樣我們需要使用開發(fā)者工具查看搜索結(jié)果列表的源代碼表示方式,從而進(jìn)行精確定位。
從源代碼中可以看到對于搜索結(jié)果列表項,每一個搜索結(jié)果都給定了一個id名,如第一項就用id為1來定位,第2項就是id為2來定位。由此可以使用find_element_by_id方法來獲取某一項搜索結(jié)果的具體內(nèi)容:
#獲得點擊搜索按鈕后網(wǎng)頁中id名為1的結(jié)果
result=driver.find_element_by_id('1')
#打印id名為1的文本內(nèi)容
print(result.text)
第六步,退出瀏覽器。通過第五步操作已經(jīng)獲得了想要的內(nèi)容,由此就可以關(guān)閉瀏覽器對象了。使用方法為瀏覽器對象的quit操作。
driver.quit()
我們來對比一下使用瀏覽器操作和使用selenium代碼爬蟲結(jié)果:
兩者效果是一樣的。
從上述案例實現(xiàn)過程中發(fā)現(xiàn)在使用selenium自動化測試的時候,非常重要的一點就是元素的定位。在selenium模塊中,一共包括8種元素定位的方法
- find_element_by_id : 使用id名來定位,通常可以實現(xiàn)精確定位到某條記錄或內(nèi)容
- find_element_by_name : 使用標(biāo)簽的name來定位,如表單內(nèi)容部分
- find_element_by_xpath : 使用xpath來定位
- find_element_by_link_text :使用文字鏈接來定位
- find_element_by_partial_link_text:使用文字鏈接來定位
- find_element_by_tag_name : 使用標(biāo)簽名來定位
- find_element_by_class_name :使用類名類定位
- find_element_by_css_selector: 使用css選擇器組合來定位
里面較常用的包括find_element_by_id 、find_element_by_xpath、ind_element_by_class_name 、find_element_by_css_selector這四種。
find_element_by_css_selector組合選擇器:這是css selector,所以可以包括id和classname等。實際使用過程中還可以使用正則表達(dá)式來對目標(biāo)進(jìn)行匹配,如下對上面這個百度搜索案例修改一下:
import time
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
driver.find_element_by_css_selector("input[id=\"kw\"]").send_keys('selenium') #定位輸入框輸入selenium
driver.find_element_by_css_selector("input[type=\"submit\"]").click() #定位搜索按鈕點擊按鈕,屬性選擇type
time.sleep(5)
res=driver.find_element_by_id('1') #獲得搜索結(jié)果列表的第一項
print(res.text)
driver.quit()
獲得的結(jié)果如下:
.find_element_by_xpath: 根據(jù)xpath定位。Xpath是在一種在XML文檔里查找信息的語言。主要就是路徑信息,使用格式為:
標(biāo)簽+屬性定位——xpath = "http://標(biāo)簽名[@屬性='屬性值']"
如xpath="http://book",表示選取所有節(jié)點名為book的子元素。同時有一種簡便方法確定節(jié)點所在的xpath,就是在開發(fā)者工具中找到目標(biāo)內(nèi)容區(qū)域,然后右鍵點擊,選擇copy菜單里的copy xpath,就可以自動將xpath位置獲取到。
如還是使用百度案例,將搜索selenium結(jié)果的第一項內(nèi)容獲取到,此時將獲取結(jié)果采用xpath方式。首先獲取到xpath:
然后張貼時可以獲取xpath的值為://*[@id="1"]。將上述代碼中res=driver.find_element_by_id('1') ,替換為:
res=driver.find_element_by_xpath('//*[@id="1"]')
print(res.text)
運行時獲得結(jié)果與上述一樣。
最后:下方這份完整的軟件測試視頻教程已經(jīng)整理上傳完成,需要的朋友們可以自行領(lǐng)取【保證100%免費】
軟件測試面試文檔
我們學(xué)習(xí)必然是為了找到高薪的工作,下面這些面試題是來自阿里、騰訊、字節(jié)等一線互聯(lián)網(wǎng)大廠最新的面試資料,并且有字節(jié)大佬給出了權(quán)威的解答,刷完這一套面試資料相信大家都能找到滿意的工作。
文章來源:http://www.zghlxwxcb.cn/news/detail-647055.html
全部資料獲取
文章來源地址http://www.zghlxwxcb.cn/news/detail-647055.html
到了這里,關(guān)于selenium+webdriver爬蟲技術(shù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!