二十四、Python爬蟲(chóng)的Selenium的基本用法
Selenium 作為一款 Web 自動(dòng)化測(cè)試框架,提供了諸多操作瀏覽器的方法,本節(jié)對(duì)其中的常用方法做詳細(xì)介紹。
24.1 定位節(jié)點(diǎn)
Selenium 提供了 8 種定位單個(gè)節(jié)點(diǎn)的方法,如下所示:
假設(shè)下面代碼某個(gè)頁(yè)面的代碼片段,如下所示:
<html>
<head>
<body link="#cc0916">
<a id="logo" href="http://c.biancheng.net" onclick="">
<form id="form" class="fm" name="f" action="c.biancheng.net">
<span class="btn"></span>
<input id="kw" class="s_ipt_wr" name="wd" value="" maxlength="255" autocomplete="off">
</body>
</head>
</html>
下面使用表格中提供的方法定位 input 輸出框。如下所示:
#創(chuàng)建browser是瀏覽器對(duì)象
browser = webdriver.Chrome()
#訪問(wèn)某個(gè)url得到上述代碼片段
browser.get('url')
#通過(guò)id定義輸入框
browser.dr.find_element_by_id("kw")
#通過(guò)class定義
browser.find_element_by_class_name("s_ipt_wr")
#通過(guò)name定位
browser.find_element_by_name("wd")
#通過(guò)tag name定位:
browser.find_element_by_tag_name("input")
#通過(guò)xpath定位
browser.find_element_by_xpath("http://*[@id='kw']")
#通過(guò)css選擇器定位
browser.find_element_by_css_selector("#kw")
通過(guò) a 標(biāo)簽內(nèi)的文本內(nèi)容定位節(jié)點(diǎn),如下所示:
<a class="vip" href="http://c.baincheng.net">C語(yǔ)言中文網(wǎng)</a>
<a class="search" href="http://www.baidu.com">hao123</a>
示例如下:
#使用全部文本內(nèi)容定位鏈接
browser.find_element_by_link_text("c語(yǔ)言中文網(wǎng)")
#使用部分文本內(nèi)容定位鏈接
browser.find_element_by_partial_link_text("123")
如果您想定位一組元素,方法如下所示:
find_elements_by_id()
find_elements_by_name()
find_elements_by_class_name()
find_elements_by_tag_name()
find_elements_by_link_text()
find_elements_by_partial_link_text()
find_elements_by_xpath()
find_elements_by_css_selector()
定位一組元素的方法與定位單個(gè)元素類(lèi)似,唯一的區(qū)別就是 element 后面多了一個(gè) s(表示復(fù)數(shù)),因此上述方法的返回值是一個(gè)列表,您可以使用 for
循環(huán)拿到所有的元素節(jié)點(diǎn)。
24.2 控制瀏覽器
Selenium 可以操控瀏覽器的窗口大小、刷新頁(yè)面,以及控制瀏覽器的前進(jìn)、后退等
1) 設(shè)置瀏覽器窗口大小、位置
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
#參數(shù)數(shù)字為像素點(diǎn)
driver.set_window_size(480, 800)
#設(shè)置窗口位置
driver.set_window_position(100,200)
#同時(shí)設(shè)置窗口的大小和坐標(biāo)
driver.set_window_rect(450,300,32,50)
#退出瀏覽器
driver.quit()
2) 控制網(wǎng)頁(yè)前進(jìn)、后退、刷新頁(yè)面
from selenium import webdriver
driver = webdriver.Chrome()
# 訪問(wèn)C語(yǔ)言中文網(wǎng)首頁(yè)
first_url= 'http://c.biancheng.net'
driver.get(first_url)
# 訪問(wèn)c語(yǔ)言教程
second_url='http://c.biancheng.net/c/'
driver.get(second_url)
# 返回(后退)到c語(yǔ)言中文網(wǎng)首頁(yè)
driver.back()
# 前進(jìn)到C語(yǔ)言教程頁(yè)
driver.forward()
# 刷新當(dāng)前頁(yè)面相當(dāng)于F5
driver.refresh()
# 退出/關(guān)閉瀏覽器
driver.quit()
24.3 WebDriver常用方法
上文中介紹了如何定位元素,以及如何設(shè)置瀏覽的大小、位置。 定位元素節(jié)點(diǎn)只是第一步, 定位之后還需要對(duì)這個(gè)元素進(jìn)行操作, 比如單擊按鈕,或者在輸入框輸入文本
, 下面介紹 WebDriver 中的最常用方法:
# 請(qǐng)求url
get(url)
# 模擬鍵盤(pán)輸入文本
send_keys (value)
# 清除已經(jīng)輸入的文本
clear():
# 單擊已經(jīng)定位的元素
click():
# 用于提交表單,比如百度搜索框內(nèi)輸入關(guān)鍵字之后的“回車(chē)” 操作
submit():
#返回屬性的屬性值,返回元素的屬性值,可以是id、name、type 或其他任意屬性
get_attribute(name)
# 返回布爾值,檢查元素是否用戶可見(jiàn),比如 display屬性為hidden或者none
is_displayed()
示例如下:
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
#模擬鍵盤(pán),輸出文本
driver.find_element_by_id("kw").send_keys("C語(yǔ)言中文網(wǎng)")
#單擊“百度”一下查找
driver.find_element_by_id("su").click()
time.sleep(3)
#退出瀏覽器
driver.quit()
除了上述方法外, WebDriver 還有一些常用屬性,如下所示:
from selenium import webdriver
driver = webdriver.Chrome()
# 獲取HTML結(jié)構(gòu)源碼
driver.page_source
#在源碼中查找指定的字符串
driver.page_source.find('字符串')
# 返回百度頁(yè)面底部備案信息
text = driver.find_element_by_id("cp").text
print(text)
# 獲取輸入框的尺寸
size = driver.find_element_by_id('kw').size
print(size)
輸出結(jié)果:
?2015 Baidu 使用百度前必讀 意見(jiàn)反饋 京 ICP 證 030173 號(hào)
{'width': 500, 'height': 22}
24.4 Selenium事件處理
Selenium WebDriver 提供了一些事件處理函數(shù)(鼠標(biāo)、鍵盤(pán)等),下面我們對(duì)常用的事件函數(shù)做簡(jiǎn)單介紹。
1) 鼠標(biāo)事件
Selenium WebDriver 將關(guān)于鼠標(biāo)的操作方法都封裝在 ActionChains 類(lèi)中,使用時(shí)需要引入 ActionChains 類(lèi),如下所示:
from selenium.webdriver.common.action_chains import ActionChains
該類(lèi)包含了鼠標(biāo)操作的常用方法:
鼠標(biāo)事件 方法 | 說(shuō)明 |
---|---|
ActionChains(driver) | 構(gòu)造 ActionChains 鼠標(biāo)對(duì)象。 |
click() | 單擊 |
click_and_hold(on_element=None) | 單擊鼠標(biāo)左鍵,不松開(kāi) |
context_click() | 右擊 |
double_click() | 雙擊 |
drag_and_drop() | 拖動(dòng) |
move_to_element(above) | 執(zhí)行鼠標(biāo)懸停操作 |
context_click() | 用于模擬鼠標(biāo)右鍵操作, 在調(diào)用時(shí)需要指定元素定位。 |
perform() | 將所有鼠標(biāo)操作提交執(zhí)行。 |
示例如下:
from selenium import webdriver
#導(dǎo)入 ActionChains 類(lèi)
from selenium.webdriver.common.action_chains import ActionChains
driver = webdriver.Chrome()
driver.get("http://c.biancheng.net")
# 通過(guò)xpath表達(dá)式定位到要懸停的元素
above = driver.find_element_by_xpath('//ul[@id="ad-link-top"]/li[1]')
# 對(duì)定位到的元素執(zhí)行鼠標(biāo)懸停操作
ActionChains(driver).move_to_element(above).perform()
2) 鍵盤(pán)事件
Selenium WebDriver 的 Keys 模塊提供了模擬鍵盤(pán)輸入的 send_keys()
方法,除此之外,該模塊也提供了操作鍵盤(pán)的其他方法,比如復(fù)制、粘貼等等。
在使用之前,首先需要導(dǎo)入 Keys 類(lèi),如下所示:
from selenium.webdriver.common.keys import Keys
下面列舉了一些常用方法:
鍵盤(pán)操作 方法 | 說(shuō)明 |
---|---|
send_keys(Keys.BACK_SPACE) | 刪除鍵(BackSpace) |
send_keys(Keys.SPACE) | 空格鍵(Space) |
send_keys(Keys.TAB) | 制表鍵(Tab) |
send_keys(Keys.ESCAPE) | 回退鍵(Esc) |
send_keys(Keys.ENTER) | 回車(chē)鍵(Enter) |
send_keys(Keys.CONTROL,‘a(chǎn)’) | 全選(Ctrl+A) |
send_keys(Keys.CONTROL,‘c’) | 復(fù)制(Ctrl+C) |
send_keys(Keys.CONTROL,‘x’) | 剪切(Ctrl+X) |
send_keys(Keys.CONTROL,‘v’) | 粘貼(Ctrl+V) |
send_keys(Keys.F1…Fn) | 鍵盤(pán) F1…Fn |
keys.down(value,element=None) | 按下鍵盤(pán)上的某個(gè)鍵 |
keys.up(value,element=None) | 松開(kāi)鍵盤(pán)上的某個(gè)鍵 |
示例如下:
from selenium import webdriver
# 引入 Keys 模塊
from selenium.webdriver.common.keys import Keys
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
# 輸入框輸入內(nèi)容
driver.find_element_by_id("kw").send_keys("C語(yǔ)言中文網(wǎng)H")
# 刪除多輸入的一個(gè)H
driver.find_element_by_id("kw").send_keys(Keys.BACK_SPACE)
#單擊“百度”一下查找
driver.find_element_by_id("su").click()
time.sleep(3)
driver.quit()
其它鍵盤(pán)操作方法,如下所示:
# 輸入空格鍵 + “Python教程”
driver.find_element_by_id("kw").send_keys(Keys.SPACE)
driver.find_element_by_id("kw").send_keys("Python教程")
# ctrl+a 全選輸入框內(nèi)容
driver.find_element_by_id("kw").send_keys(Keys.CONTROL, 'a')
# ctrl+x 剪切輸入框內(nèi)容
driver.find_element_by_id("kw").send_keys(Keys.CONTROL, 'x')
# ctrl+v 粘貼內(nèi)容到輸入框
driver.find_element_by_id("kw").send_keys(Keys.CONTROL, 'v')
# 使用回車(chē)鍵來(lái)代替單擊操作click
driver.find_element_by_id("su").send_keys(Keys.ENTER)
24.5 無(wú)界面瀏覽器
Chromedriver 每一次運(yùn)行都要打開(kāi)瀏覽器,并執(zhí)行相應(yīng)的輸入、搜索等操作,這樣會(huì)導(dǎo)致瀏覽器交互能力變差,浪費(fèi)許多時(shí)間。 Selenium
為了增強(qiáng)瀏覽器的交互能力,允許您使用無(wú)頭瀏覽器模式,也就是無(wú)界面瀏覽器,它被廣泛的應(yīng)用于爬蟲(chóng)和自動(dòng)化測(cè)試中。通過(guò)以下代碼可以設(shè)置無(wú)頭瀏覽器模式:
from selenium import webdriver
import time
options=webdriver.ChromeOptions()
options.add_argument('--headless')#無(wú)界面瀏覽
driver=webdriver.Chrome(options=options)
driver.get('https://www.baidu.com')
kw1=driver.find_element_by_id('kw')
print(driver.title)
time.sleep(3)
#關(guān)閉當(dāng)前界面,只有一個(gè)窗口
driver.close()
#關(guān)閉所有界面
driver.quit()
除了可以設(shè)置無(wú)頭界面之外,Selenium 還支持其他一些瀏覽器參數(shù)設(shè)置,如下所示:
opption.add_argument('--window-size=600,600') #設(shè)置窗口大小
opption.add_argument('--incognito') #無(wú)痕模式
opption.add_argument('--disable-infobars') #去掉chrome正受到自動(dòng)測(cè)試軟件的控制的提示
opption.add_argument('user-agent="XXXX"') #添加請(qǐng)求頭
opption.add_argument("--proxy-server=http://200.130.123.43:3456")#代理服務(wù)器訪問(wèn)
opption.add_experimental_option('excludeSwitches', ['enable-automation'])#開(kāi)發(fā)者模式
opption.add_argument('blink-settings=imagesEnabled=false') #禁止加載圖片
opption.add_argument('lang=zh_CN.UTF-8') #設(shè)置默認(rèn)編碼為utf-8
opption.add_extension(create_proxyauth_extension(
proxy_host='host',
proxy_port='port',
proxy_username="username",
proxy_password="password"
))# 設(shè)置有賬號(hào)密碼的代理
opption.add_argument('--disable-gpu') # 這個(gè)參數(shù)可以規(guī)避谷歌的部分bug
opption.add_argument('--disable-javascript') # 禁用javascript
opption.add_argument('--hide-scrollbars') # 隱藏滾動(dòng)條
24.6 執(zhí)行JS腳本
WebDriver 提供了 execute_script() 方法來(lái)執(zhí)行 JavaScript 代碼,比如控制瀏覽器的滾動(dòng)條。示例如下:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-439839.html
from selenium import webdriver
from time import sleep
# 訪問(wèn)百度
driver=webdriver.Chrome()
driver.get("http://www.baidu.com")
# 最大化瀏覽器窗口
driver.maximize_window()
# 搜索
driver.find_element_by_id("kw").send_keys("C語(yǔ)言中文網(wǎng)")
driver.find_element_by_id("su").click()
sleep(3)
# 通過(guò)js代碼設(shè)置滾動(dòng)條位置,數(shù)值代表(左邊距,上邊距)
js="window.scrollTo(100,500);"
#執(zhí)行js代碼
driver.execute_script(js)
sleep(5)
driver.quit()
如果想了解更多關(guān)于 Selenium 的知識(shí),請(qǐng)參考官方文檔文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-439839.html
到了這里,關(guān)于【Python】【進(jìn)階篇】二十四、Python爬蟲(chóng)的Selenium的基本用法的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!