国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Python - Python3爬蟲中Selenium的用法詳解

Python3爬蟲中Selenium的用法詳解

2020-07-10 17:30愛喝馬黛茶的安東尼 Python

在本篇內容里小編給大家分享了關于Python3爬蟲中Selenium的用法詳解內容,需要的朋友們可以參考下。

Selenium是一個自動化測試工具,利用它可以驅動瀏覽器執行特定的動作,如點擊、下拉等操作,同時還可以獲取瀏覽器當前呈現的頁面的源代碼,做到可見即可爬。對于一些JavaScript動態渲染的頁面來說,此種抓取方式非常有效。本節中,就讓我們來感受一下它的強大之處吧。

1. 準備工作

本節以Chrome為例來講解Selenium的用法。在開始之前,請確保已經正確安裝好了Chrome瀏覽器并配置好了ChromeDriver。另外,還需要正確安裝好Python的Selenium庫,詳細的安裝和配置過程可以參考第1章。

2. 基本使用

準備工作做好之后,首先來大體看一下Selenium有一些怎樣的功能。示例如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
browser = webdriver.Chrome()
try:
    browser.get('https://www.baidu.com')
    input = browser.find_element_by_id('kw')
    input.send_keys('Python')
    input.send_keys(Keys.ENTER)
    wait = WebDriverWait(browser, 10)
    wait.until(EC.presence_of_element_located((By.ID'content_left')))
    print(browser.current_url)
    print(browser.get_cookies())
    print(browser.page_source)
finally:
    browser.close()

運行代碼后發現,會自動彈出一個Chrome瀏覽器。瀏覽器首先會跳轉到百度,然后在搜索框中輸入Python,接著跳轉到搜索結果頁,如圖7-1所示。

Python3爬蟲中Selenium的用法詳解

                                                                       圖7-1 運行結果

搜索結果加載出來后,控制臺分別會輸出當前的URL、當前的Cookies和網頁源代碼:

?
1
2
3
4
5
6
7
8
9
https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=0&rsv_idx=1&tn=baidu&wd=Python&rsv_pq=c94d0df9000a72d0&rsv_t=
07099xvun1ZmC0bf6eQvygJ43IUTTUOl5FCJVPgwG2YREs70GplJjH2F%2BCQ&rqlang=cn&rsv_enter=1&rsv_sug3=6&rsv_sug2=
0&inputT=87&rsv_sug4=87
[{'secure'False'value''B490B5EBF6F3CD402E515D22BCDA1598''domain''.baidu.com''path''/''httpOnly'
False'name''BDORZ''expiry'1491688071.707553}, {'secure'False'value''22473_1441_21084_17001'
'domain''.baidu.com''path''/''httpOnly'False'name''H_PS_PSSID'}, {'secure'False'value'
'12883875381399993259_00_0_I_R_2_0303_C02F_N_I_I_0''domain''.www.baidu.com''path''/''httpOnly'False
'name''__bsi''expiry'1491601676.69722}]
<!DOCTYPE html><!--STATUS OK-->...</html>

源代碼過長,在此省略??梢钥吹?,我們得到的當前URL、Cookies和源代碼都是瀏覽器中的真實內容。

所以說,如果用Selenium來驅動瀏覽器加載網頁的話,就可以直接拿到JavaScript渲染的結果了,不用擔心使用的是什么加密系統。

下面來詳細了解一下Selenium的用法。

3. 聲明瀏覽器對象

Selenium支持非常多的瀏覽器,如Chrome、Firefox、Edge等,還有Android、BlackBerry等手機端的瀏覽器。另外,也支持無界面瀏覽器PhantomJS。

此外,我們可以用如下方式初始化:

?
1
2
3
4
5
6
from selenium import webdriver
browser = webdriver.Chrome()
browser = webdriver.Firefox()
browser = webdriver.Edge()
browser = webdriver.PhantomJS()
browser = webdriver.Safari()

這樣就完成了瀏覽器對象的初始化并將其賦值為browser對象。接下來,我們要做的就是調用browser對象,讓其執行各個動作以模擬瀏覽器操作。

4. 訪問頁面

我們可以用get()方法來請求網頁,參數傳入鏈接URL即可。比如,這里用get()方法訪問淘寶,然后打印出源代碼,代碼如下:

?
1
2
3
4
5
from selenium import webdriver
browser = webdriver.Chrome()
browser.get('https://www.taobao.com')
print(browser.page_source)
browser.close()

運行后發現,彈出了Chrome瀏覽器并且自動訪問了淘寶,然后控制臺輸出了淘寶頁面的源代碼,隨后瀏覽器關閉。

通過這幾行簡單的代碼,我們可以實現瀏覽器的驅動并獲取網頁源碼,非常便捷。

5. 查找節點

Selenium可以驅動瀏覽器完成各種操作,比如填充表單、模擬點擊等。比如,我們想要完成向某個輸入框輸入文字的操作,總需要知道這個輸入框在哪里吧?而Selenium提供了一系列查找節點的方法,我們可以用這些方法來獲取想要的節點,以便下一步執行一些動作或者提取信息。

單個節點

比如,想要從淘寶頁面中提取搜索框這個節點,首先要觀察它的源代碼,如圖7-2所示。

Python3爬蟲中Selenium的用法詳解

                                                                        圖7-2 源代碼

可以發現,它的id是q,name也是q。此外,還有許多其他屬性,此時我們就可以用多種方式獲取它了。比如,find_element_by_name()是根據name值獲取,find_element_by_id()是根據id獲取。另外,還有根據XPath、CSS選擇器等獲取的方式。

我們用代碼實現一下:

?
1
2
3
4
5
6
7
8
from selenium import webdriver
browser = webdriver.Chrome()
browser.get('https://www.taobao.com')
input_first = browser.find_element_by_id('q')
input_second = browser.find_element_by_css_selector('#q')
input_third = browser.find_element_by_xpath('//*[@id="q"]')
print(input_first, input_second, input_third)
browser.close()

這里我們使用3種方式獲取輸入框,分別是根據ID、CSS選擇器和XPath獲取,它們返回的結果完全一致。運行結果如下:

?
1
2
3
4
5
6
<selenium.webdriver.remote.webelement.WebElement (session="5e53d9e1c8646e44c14c1c2880d424af", element="0.564956309
6161541-1")> 
<selenium.webdriver.remote.webelement.WebElement (session="5e53d9e1c8646e44c14c1c2880d424af", element="0.564956309
6161541-1")> 
<selenium.webdriver.remote.webelement.WebElement (session="5e53d9e1c8646e44c14c1c2880d424af", element="0.564956309
6161541-1")>

可以看到,這3個節點都是WebElement類型,是完全一致的。

這里列出所有獲取單個節點的方法:

?
1
2
3
4
5
6
7
8
find_element_by_id
find_element_by_name
find_element_by_xpath
find_element_by_link_text
find_element_by_partial_link_text
find_element_by_tag_name
find_element_by_class_name
find_element_by_css_selector

另外,Selenium還提供了通用方法find_element(),它需要傳入兩個參數:查找方式By和值。實際上,它就是find_element_by_id()這種方法的通用函數版本,比如find_element_by_id(id)就等價于find_element(By.ID, id),二者得到的結果完全一致。我們用代碼實現一下:

?
1
2
3
4
5
6
7
8
from selenium import webdriver
from selenium.webdriver.common.by import By
 
browser = webdriver.Chrome()
browser.get('https://www.taobao.com')
input_first = browser.find_element(By.ID'q')
print(input_first)
browser.close()

實際上,這種查找方式的功能和上面列舉的查找函數完全一致,不過參數更加靈活。

多個節點

如果查找的目標在網頁中只有一個,那么完全可以用find_element()方法。但如果有多個節點,再用find_element()方法查找,就只能得到第一個節點了。如果要查找所有滿足條件的節點,需要用find_elements()這樣的方法。注意,在這個方法的名稱中,element多了一個s,注意區分。

比如,要查找淘寶左側導航條的所有條目,如圖7-3所示。

Python3爬蟲中Selenium的用法詳解

                                                                                            圖7-3 導航欄

就可以這樣來實現:

?
1
2
3
4
5
6
from selenium import webdriver
browser = webdriver.Chrome()
browser.get('https://www.taobao.com')
lis = browser.find_elements_by_css_selector('.service-bd li')
print(lis)
browser.close()

運行結果如下:

?
1
2
3
4
5
[<selenium.webdriver.remote.webelement.WebElement (session="c26290835d4457ebf7d96bfab3740d19", element="0.0922104
4033125603-1")>, <selenium.webdriver.remote.webelement.WebElement (session="c26290835d4457ebf7d96bfab3740d19", 
element="0.09221044033125603-2")>, <selenium.webdriver.remote.webelement.WebElement (session="c26290835d4457ebf7d
96bfab3740d19", element="0.09221044033125603-3")>...<selenium.webdriver.remote.webelement.WebElement 
(session="c26290835d4457ebf7d96bfab3740d19", element="0.09221044033125603-16")>]

這里簡化了輸出結果,中間部分省略。

可以看到,得到的內容變成了列表類型,列表中的每個節點都是WebElement類型。

也就是說,如果我們用find_element()方法,只能獲取匹配的第一個節點,結果是WebElement類型。如果用find_elements()方法,則結果是列表類型,列表中的每個節點是WebElement類型。

這里列出所有獲取多個節點的方法:

?
1
2
3
4
5
6
7
8
find_elements_by_id
find_elements_by_name
find_elements_by_xpath
find_elements_by_link_text
find_elements_by_partial_link_text
find_elements_by_tag_name
find_elements_by_class_name
find_elements_by_css_selector

當然,我們也可以直接用find_elements()方法來選擇,這時可以這樣寫:

?
1
lis = browser.find_elements(By.CSS_SELECTOR, '.service-bd li')

結果是完全一致的。

6. 節點交互

Selenium可以驅動瀏覽器來執行一些操作,也就是說可以讓瀏覽器模擬執行一些動作。比較常見的用法有:輸入文字時用send_keys()方法,清空文字時用clear()方法,點擊按鈕時用click()方法。示例如下:

?
1
2
3
4
5
6
7
8
9
10
11
from selenium import webdriver
import time
browser = webdriver.Chrome()
browser.get('https://www.taobao.com')
input = browser.find_element_by_id('q')
input.send_keys('iPhone')
time.sleep(1)
input.clear()
input.send_keys('iPad')
button = browser.find_element_by_class_name('btn-search')
button.click()

這里首先驅動瀏覽器打開淘寶,然后用find_element_by_id()方法獲取輸入框,然后用send_keys()方法輸入iPhone文字,等待一秒后用clear()方法清空輸入框,再次調用send_keys()方法輸入iPad文字,之后再用find_element_by_class_name()方法獲取搜索按鈕,最后調用click()方法完成搜索動作。

通過上面的方法,我們就完成了一些常見節點的動作操作,更多的操作可以參見官方文檔的交互動作介紹:http://selenium-python.readthedocs.io/api.html#module-selenium.webdriver.remote.webelement。

7. 動作鏈

在上面的實例中,一些交互動作都是針對某個節點執行的。比如,對于輸入框,我們就調用它的輸入文字和清空文字方法;對于按鈕,就調用它的點擊方法。其實,還有另外一些操作,它們沒有特定的執行對象,比如鼠標拖曳、鍵盤按鍵等,這些動作用另一種方式來執行,那就是動作鏈。

比如,現在實現一個節點的拖曳操作,將某個節點從一處拖曳到另外一處,可以這樣實現:

?
1
2
3
4
5
6
7
8
9
10
11
from selenium import webdriver
from selenium.webdriver import ActionChains
browser = webdriver.Chrome()
url = 'http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable'
browser.get(url)
browser.switch_to.frame('iframeResult')
source = browser.find_element_by_css_selector('#draggable')
target = browser.find_element_by_css_selector('#droppable')
actions = ActionChains(browser)
actions.drag_and_drop(source, target)
actions.perform()

首先,打開網頁中的一個拖曳實例,然后依次選中要拖曳的節點和拖曳到的目標節點,接著聲明ActionChains對象并將其賦值為actions變量,然后通過調用actions變量的drag_and_drop()方法,再調用perform()方法執行動作,此時就完成了拖曳操作,如圖7-4和圖7-5所示。

Python3爬蟲中Selenium的用法詳解

                                                                   圖7-4 拖曳前的頁面

Python3爬蟲中Selenium的用法詳解

                                                                     圖7-5 拖曳后的頁面

更多的動作鏈操作可以參考官方文檔:http://selenium-python.readthedocs.io/api.html#module-selenium.webdriver.common.action_chains。

8. 執行JavaScript

對于某些操作,Selenium API并沒有提供。比如,下拉進度條,它可以直接模擬運行JavaScript,此時使用execute_script()方法即可實現,代碼如下:

?
1
2
3
4
5
from selenium import webdriver
browser = webdriver.Chrome()
browser.get('https://www.zhihu.com/explore')
browser.execute_script('window.scrollTo(0, document.body.scrollHeight)')
browser.execute_script('alert("To Bottom")')

這里就利用execute_script()方法將進度條下拉到最底部,然后彈出alert提示框。

所以說有了這個方法,基本上API沒有提供的所有功能都可以用執行JavaScript的方式來實現了。

9. 獲取節點信息

前面說過,通過page_source屬性可以獲取網頁的源代碼,接著就可以使用解析庫(如正則表達式、Beautiful Soup、pyquery等)來提取信息了。

不過,既然Selenium已經提供了選擇節點的方法,返回的是WebElement類型,那么它也有相關的方法和屬性來直接提取節點信息,如屬性、文本等。這樣的話,我們就可以不用通過解析源代碼來提取信息了,非常方便。

接下來,就看看通過怎樣的方式來獲取節點信息吧。

獲取屬性

我們可以使用get_attribute()方法來獲取節點的屬性,但是其前提是先選中這個節點,示例如下:

?
1
2
3
4
5
6
7
8
from selenium import webdriver
from selenium.webdriver import ActionChains
browser = webdriver.Chrome()
url = 'https://www.zhihu.com/explore'
browser.get(url)
logo = browser.find_element_by_id('zh-top-link-logo')
print(logo)
print(logo.get_attribute('class'))

運行之后,程序便會驅動瀏覽器打開知乎頁面,然后獲取知乎的logo節點,最后打印出它的class。

控制臺的輸出結果如下:

?
1
2
3
<selenium.webdriver.remote.webelement.WebElement (session="e08c0f28d7f44d75ccd50df6bb676104", element="0.723639066
0048155-1")>
zu-top-link-logo

通過get_attribute()方法,然后傳入想要獲取的屬性名,就可以得到它的值了。

獲取文本值

每個WebElement節點都有text屬性,直接調用這個屬性就可以得到節點內部的文本信息,這相當于Beautiful Soup的get_text()方法、pyquery的text()方法,示例如下:

?
1
2
3
4
5
6
from selenium import webdriver
browser = webdriver.Chrome()
url = 'https://www.zhihu.com/explore'
browser.get(url)
input = browser.find_element_by_class_name('zu-top-add-question')
print(input.text)

這里依然先打開知乎頁面,然后獲取“提問”按鈕這個節點,再將其文本值打印出來。

控制臺的輸出結果如下:

?
1
 

獲取id、位置、標簽名和大小

另外,WebElement節點還有一些其他屬性,比如id屬性可以獲取節點id,location屬性可以獲取該節點在頁面中的相對位置,tag_name屬性可以獲取標簽名稱,size屬性可以獲取節點的大小,也就是寬高,這些屬性有時候還是很有用的。示例如下:

?
1
2
3
4
5
6
7
8
9
from selenium import webdriver
browser = webdriver.Chrome()
url = 'https://www.zhihu.com/explore'
browser.get(url)
input = browser.find_element_by_class_name('zu-top-add-question')
print(input.id)
print(input.location)
print(input.tag_name)
print(input.size)

這里首先獲得“提問”按鈕這個節點,然后調用其id、location、tag_name、size屬性來獲取對應的屬性值。

10. 切換Frame

我們知道網頁中有一種節點叫作iframe,也就是子Frame,相當于頁面的子頁面,它的結構和外部網頁的結構完全一致。Selenium打開頁面后,它默認是在父級Frame里面操作,而此時如果頁面中還有子Frame,它是不能獲取到子Frame里面的節點的。這時就需要使用switch_to.frame()方法來切換Frame。示例如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import time
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
browser = webdriver.Chrome()
url = 'http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable'
browser.get(url)
browser.switch_to.frame('iframeResult')
try:
    logo = browser.find_element_by_class_name('logo')
except NoSuchElementException:
    print('NO LOGO')
browser.switch_to.parent_frame()
logo = browser.find_element_by_class_name('logo')
print(logo)
print(logo.text)

控制臺的輸出如下:

?
1
2
3
4
NO LOGO
<selenium.webdriver.remote.webelement.WebElement (session="4bb8ac03ced4ecbdefef03ffdc0e4ccd", element="0.1379261132
0464965-2")>
RUNOOB.COM

這里還是以前面演示動作鏈操作的網頁為實例,首先通過switch_to.frame()方法切換到子Frame里面,然后嘗試獲取父級Frame里的logo節點(這是不能找到的),如果找不到的話,就會拋出NoSuchElementException異常,異常被捕捉之后,就會輸出NO LOGO。接下來,重新切換回父級Frame,然后再次重新獲取節點,發現此時可以成功獲取了。

所以,當頁面中包含子Frame時,如果想獲取子Frame中的節點,需要先調用switch_to.frame()方法切換到對應的Frame,然后再進行操作。

11. 延時等待

在Selenium中,get()方法會在網頁框架加載結束后結束執行,此時如果獲取page_source,可能并不是瀏覽器完全加載完成的頁面,如果某些頁面有額外的Ajax請求,我們在網頁源代碼中也不一定能成功獲取到。所以,這里需要延時等待一定時間,確保節點已經加載出來。

這里等待的方式有兩種:一種是隱式等待,一種是顯式等待。

隱式等待

當使用隱式等待執行測試的時候,如果Selenium沒有在DOM中找到節點,將繼續等待,超出設定時間后,則拋出找不到節點的異常。換句話說,當查找節點而節點并沒有立即出現的時候,隱式等待將等待一段時間再查找DOM,默認的時間是0。示例如下:

?
1
2
3
4
5
6
from selenium import webdriver
browser = webdriver.Chrome()
browser.implicitly_wait(10)
browser.get('https://www.zhihu.com/explore')
input = browser.find_element_by_class_name('zu-top-add-question')
print(input)

這里我們用implicitly_wait()方法實現了隱式等待。

顯式等待

隱式等待的效果其實并沒有那么好,因為我們只規定了一個固定時間,而頁面的加載時間會受到網絡條件的影響。

這里還有一種更合適的顯式等待方法,它指定要查找的節點,然后指定一個最長等待時間。如果在規定時間內加載出來了這個節點,就返回查找的節點;如果到了規定時間依然沒有加載出該節點,則拋出超時異常。示例如下:

?
1
2
3
4
5
6
7
8
9
10
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
browser = webdriver.Chrome()
browser.get('https://www.taobao.com/')
wait = WebDriverWait(browser, 10)
input = wait.until(EC.presence_of_element_located((By.ID'q')))
button = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '.btn-search')))
print(input, button)

這里首先引入WebDriverWait這個對象,指定最長等待時間,然后調用它的until()方法,傳入要等待條件expected_conditions。比如,這里傳入了presence_of_element_located這個條件,代表節點出現的意思,其參數是節點的定位元組,也就是ID為q的節點搜索框。

這樣可以做到的效果就是,在10秒內如果ID為q的節點(即搜索框)成功加載出來,就返回該節點;如果超過10秒還沒有加載出來,就拋出異常。

對于按鈕,可以更改一下等待條件,比如改為element_to_be_clickable,也就是可點擊,所以查找按鈕時查找CSS選擇器為.btn-search的按鈕,如果10秒內它是可點擊的,也就是成功加載出來了,就返回這個按鈕節點;如果超過10秒還不可點擊,也就是沒有加載出來,就拋出異常。

運行代碼,在網速較佳的情況下是可以成功加載出來的。

控制臺的輸出如下:

?
1
2
3
4
<selenium.webdriver.remote.webelement.WebElement (session="07dd2fbc2d5b1ce40e82b9754aba8fa8", element="0.564264629
4074107-1")>
<selenium.webdriver.remote.webelement.WebElement (session="07dd2fbc2d5b1ce40e82b9754aba8fa8", element="0.564264629
4074107-2")>

可以看到,控制臺成功輸出了兩個節點,它們都是WebElement類型。

如果網絡有問題,10秒內沒有成功加載,那就拋出TimeoutException異常,此時控制臺的輸出如下:

?
1
2
3
4
5
TimeoutException Traceback (most recent call last)
<ipython-input-4-f3d73973b223> in <module>()
      7 browser.get('https://www.taobao.com/')
      8 wait = WebDriverWait(browser, 10)
----9 input = wait.until(EC.presence_of_element_located((By.ID'q')))

關于等待條件,其實還有很多,比如判斷標題內容,判斷某個節點內是否出現了某文字等。表7-1列出了所有的等待條件。

                                                           表7-1 等待條件及其含義

Python3爬蟲中Selenium的用法詳解

關于更多等待條件的參數及用法,可以參考官方文檔:http://selenium-python.readthedocs.io/api.html#module-selenium.webdriver.support.expected_conditions。

12. 前進和后退

平常使用瀏覽器時都有前進和后退功能,Selenium也可以完成這個操作,它使用back()方法后退,使用forward()方法前進。示例如下:

?
1
2
3
4
5
6
7
8
9
10
import time
from selenium import webdriver
browser = webdriver.Chrome()
browser.get('https://www.baidu.com/')
browser.get('https://www.taobao.com/')
browser.get('https://www.python.org/')
browser.back()
time.sleep(1)
browser.forward()
browser.close()

這里我們連續訪問3個頁面,然后調用back()方法回到第二個頁面,接下來再調用forward()方法又可以前進到第三個頁面。

13. Cookies

使用Selenium,還可以方便地對Cookies進行操作,例如獲取、添加、刪除Cookies等。示例如下:

?
1
2
3
4
5
6
7
8
from selenium import webdriver
browser = webdriver.Chrome()
browser.get('https://www.zhihu.com/explore')
print(browser.get_cookies())
browser.add_cookie({'name''name''domain''www.zhihu.com''value''germey'})
print(browser.get_cookies())
browser.delete_all_cookies()
print(browser.get_cookies())

首先,我們訪問了知乎。加載完成后,瀏覽器實際上已經生成Cookies了。接著,調用get_cookies()方法獲取所有的Cookies。然后,我們添加一個Cookie,這里傳入一個字典,有name、domain和value等內容。接下來,再次獲取所有的Cookies??梢园l現,結果就多了這一項新加的Cookie。最后,調用delete_all_cookies()方法刪除所有的Cookies。再重新獲取,發現結果就為空了。

控制臺的輸出如下:

?
1
2
3
4
5
6
7
8
9
[{'secure'False'value': '"NGM0ZTM5NDAwMWEyNDQwNDk5ODlkZWY3OTkxY2I0NDY=|1491604091|236e34290a6f407bfbb517888
849ea509ac366d0"', 'domain': '.zhihu.com', 'path': '/', 'httpOnly': False, 'name': 'l_cap_id', 'expiry': 
1494196091.403418}]
[{'secure'False'value''germey''domain''.www.zhihu.com''path''/''httpOnly'False'name'
'name'}, 
{'secure'False'value': '"NGM0ZTM5NDAwMWEyNDQwNDk5ODlkZWY3OTkxY2I0NDY=|1491604091|236e34290a6f407bfbb517888849
ea509ac366d0"', 'domain': '.zhihu.com', 'path': '/', 'httpOnly': False, 'name': 'l_cap_id', 'expiry': 
1494196091.403418}]
[]

14. 選項卡管理

在訪問網頁的時候,會開啟一個個選項卡。在Selenium中,我們也可以對選項卡進行操作。示例如下:

?
1
2
3
4
5
6
7
8
9
10
11
import time
from selenium import webdriver
browser = webdriver.Chrome()
browser.get('https://www.baidu.com')
browser.execute_script('window.open()')
print(browser.window_handles)
browser.switch_to_window(browser.window_handles[1])
browser.get('https://www.taobao.com')
time.sleep(1)
browser.switch_to_window(browser.window_handles[0])
browser.get('https://python.org')

控制臺的輸出如下:

?
1
['CDwindow-4f58e3a7-7167-4587-bedf-9cd8c867f435''CDwindow-6e05f076-6d77-453a-a36c-32baacc447df']

首先訪問了百度,然后調用了execute_script()方法,這里傳入window.open()這個JavaScript語句新開啟一個選項卡。接下來,我們想切換到該選項卡。這里調用window_handles屬性獲取當前開啟的所有選項卡,返回的是選項卡的代號列表。要想切換選項卡,只需要調用switch_to_window()方法即可,其中參數是選項卡的代號。這里我們將第二個選項卡代號傳入,即跳轉到第二個選項卡,接下來在第二個選項卡下打開一個新頁面,然后切換回第一個選項卡重新調用switch_to_window()方法,再執行其他操作即可。

15. 異常處理

在使用Selenium的過程中,難免會遇到一些異常,例如超時、節點未找到等錯誤,一旦出現此類錯誤,程序便不會繼續運行了。這里我們可以使用try except語句來捕獲各種異常。

首先,演示一下節點未找到的異常,示例如下:

?
1
2
3
4
from selenium import webdriver
browser = webdriver.Chrome()
browser.get('https://www.baidu.com')
browser.find_element_by_id('hello')

這里首先打開百度頁面,然后嘗試選擇一個并不存在的節點,此時就會遇到異常。

運行之后控制臺的輸出如下:

?
1
2
3
4
5
NoSuchElementException Traceback (most recent call last)
<ipython-input-23-978945848a1bin <module>()
      3 browser = webdriver.Chrome()
      4 browser.get('https://www.baidu.com')
----5 browser.find_element_by_id('hello')

可以看到,這里拋出了NoSuchElementException異常,這通常是節點未找到的異常。為了防止程序遇到異常而中斷,我們需要捕獲這些異常,示例如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
from selenium import webdriver
from selenium.common.exceptions import TimeoutException, NoSuchElementException
browser = webdriver.Chrome()
try:
    browser.get('https://www.baidu.com')
except TimeoutException:
    print('Time Out')
try:
    browser.find_element_by_id('hello')
except NoSuchElementException:
    print('No Element')
finally:
    browser.close()

這里我們使用try except來捕獲各類異常。比如,我們對find_element_by_id()查找節點的方法捕獲NoSuchElementException異常,這樣一旦出現這樣的錯誤,就進行異常處理,程序也不會中斷了。

控制臺的輸出如下:

?
1
No Element

關于更多的異常類,可以參考官方文檔:http://selenium-python.readthedocs.io/api.html#module-selenium.common.exceptions。

現在,我們基本對Selenium的常規用法有了大體的了解。使用Selenium,處理JavaScript不再是難事。

到此這篇關于Python3爬蟲中Selenium的用法詳解的文章就介紹到這了,更多相關Python3里Selenium的使用內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://www.py.cn/spider/guide/14484.html

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 亚洲视频在线播放 | 狠狠ri| 精品在线一区 | 久久女人网 | 欧美日韩在线免费 | 欧美一级久久 | 欧美精品在线观看 | 日韩高清一区 | 黄色一级片黄色一级片 | 欧美久久久| 麻豆产精国品免费入口 | 久久久久国产一级毛片高清片 | 国产高清在线精品一区二区三区 | 精品久久久久一区二区国产 | 黄毛片 | 中文字幕在线精品 | 亚洲四区 | 毛片黄视频 | 亚洲成人激情在线观看 | www.日韩| 亚洲国产一区二区在线观看 | 久久久国产一区二区三区 | 精品无码久久久久久国产 | 久久99操 | 黄色精品网站 | 欧美午夜影院 | 91精品区 | 日韩欧美国产一区二区三区 | 精品福利一区二区三区 | 国产精品一区一区三区 | 欧美日韩精品久久久免费观看 | 国产一区二区av在线 | 日韩欧美精品在线 | 玖玖玖影院 | 免费网站在线 | 久久蜜桃av一区二区天堂 | 骚视频在线观看 | 精品久久久久香蕉网 | 国产精品毛片在线 | 九九人人 | 一级毛片免费一级 |