主頁 > 後端開發 > 爬蟲:動態頁面爬取Selenium

爬蟲:動態頁面爬取Selenium

2022-01-07 07:52:28 後端開發

Ajax其實也是JavaScript動態渲染的頁面的一種情形,不過JavaScript 動態渲染的頁面不止Ajax 這一種: 比如中國青年網(詳見 http://news.youth.cn/gn/ ), 它的分頁部分是由 JavaScript 生成的,并非原始 HTML代碼,這其中并不包含 Ajax 請求, 比如 ECharts 的官方實體(詳見 http: //echarts.baidu.com/demo.html#bar-negative ),其圖形都是經過 JavaScript 計算之后生成的, 再有淘寶這種頁面,它即使是Ajax 獲取的資料,但是其 Ajax 介面含有很多加密引數,我 一一 們難以直接找出其規律,也很難直接分析 Ajax 來抓取,

為了解決這些問題,我們可以直接使用模擬瀏覽器運行的方式來實作, 這樣就可以做到在瀏覽器 中看到是什么樣,抓取的原始碼就是什么樣,也就是可見即可爬,這樣我們就不用再去管網頁內部的 JavaScript用了什么演算法渲染頁面,不用管網頁后臺的A jax 介面到底有哪些引數.

Python 提供了許多模擬瀏覽器運行的庫,如 Selenium、 Splash、 PyV8、 Ghost

目錄

1、Selenium使用

1、基本使用

2、宣告瀏覽器物件

3、訪問頁面

4、查找節點

5、節點互動

6、動作鏈

7、執行JavaScript

8、獲取節點資訊

8.1 獲取屬性

8.2 獲取文本值

8.3 獲取ID,位置,標簽名和大小

9、切換Frame

10、延時等待

10.1 隱式等待

10.2 顯示等待

11、前進和后退

12、Cookies操作

13、選項卡管理

14、捕獲例外


1、Selenium使用

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

1、基本使用

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

driver = webdriver.Chrome()
try:
    driver.get("http://www.baidu.com")
    input = driver.find_element_by_id("kw")
    input.send_keys("Python")
    input.send_keys(Keys.ENTER)
    wait = WebDriverWait(driver,10)
    wait.until(EC.presence_of_element_located((By.ID,"content_left")))
    print(driver.current_url)
    print(driver.get_cookies())
    print(driver.page_source)
finally:
    driver.close()

運行代碼后,會自動彈出一個Chrome瀏覽器,瀏覽器首先會跳轉到百度,然后再搜索框中輸入Python,接著會跳轉到搜索結果頁面

我們在代碼中列印了當前得到的URL、Cookies和源代碼都是瀏覽器中真是內容,如果用 Selenium來驅動瀏覽器加載網頁的話, 就可以直接拿到JavaScript渲染的結果了, 不用擔心使用的是什么加密系統

2、宣告瀏覽器物件

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

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
from selenium.webdriver.support.wait import WebDriverWait

driver = webdriver.Chrome()
driver = webdriver.Firefox()
driver = webdriver.Edge()
driver = webdriver.PhantomJS()
driver = webdriver.Safari()

這樣就完成了瀏覽器物件的初始化,并將其賦值為driver物件

3、訪問頁面

使用get() 方法來獲取請求網頁,引數傳入連接URL即可

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
from selenium.webdriver.support.wait import WebDriverWait

browser = webdriver.Chrome()
browser.get("https://www.taobao.com")
print(browser.page_source)
browser.close()

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

4、查找節點

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

4.1 單個節點

從淘寶頁面中提取搜索框這個節點

可以通過他的屬性,id,name來定位到該搜索框

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
from selenium.webdriver.support.wait import WebDriverWait

driver = webdriver.Chrome()
driver.get("https://www.taobao.com")
input_frist = driver.find_element_by_id('q')
input_seconde = driver.find_element_by_css_selector('#q')
input_third = driver.find_element_by_xpath("//*[@id='q']")
print(input_frist,input_seconde,input_third)
driver.close()


結果:
<selenium.webdriver.remote.webelement.WebElement (session="5ee9c7d62e53891cb8e194cb25c38640", element="1f59fb5a-95be-4abd-a759-db7238d0ed9a")> 
<selenium.webdriver.remote.webelement.WebElement (session="5ee9c7d62e53891cb8e194cb25c38640", element="1f59fb5a-95be-4abd-a759-db7238d0ed9a")> 
<selenium.webdriver.remote.webelement.WebElement (session="5ee9c7d62e53891cb8e194cb25c38640", element="1f59fb5a-95be-4abd-a759-db7238d0ed9a")>

通過三種方式獲取輸入框,分別是ID,CSS選擇器和XPath獲取,可以看到回傳的結果是完全一致的

其中還包含以下獲取單節點的方法:

driver.find_element_by_xpath()
driver.find_element_by_id()
driver.find_element_by_name()
driver.find_element_by_link_text()
driver.find_element_by_partial_link_text()
driver.find_element_by_tag_name()
driver.find_element_by_class_name()
driver.find_element_by_css_selector()

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

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
from selenium.webdriver.support.wait import WebDriverWait

driver = webdriver.Chrome()
driver.get("https://www.taobao.com")
input_frist = driver.find_element(By.ID,'q')
print(input_frist)
driver.close()

結果:
<selenium.webdriver.remote.webelement.WebElement (session="145f28af1f24e5014f87f9e01a4b457d", element="20d4aad6-deb5-4c06-bc6f-98b9dc3ce7df")>

4.2、多個節點

網頁上的目標只要一個,那么可以使用find_element() 方法,但如果有多個節點,再用 find_e lement () 方法查找,就只能得到第一個節點了, 如果要查找所有滿足條件的節點, 需要用 find_elements() 這樣的方法.

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
from selenium.webdriver.support.wait import WebDriverWait

driver = webdriver.Chrome()
driver.get("https://www.taobao.com")
lis  = driver.find_elements_by_css_selector('.service-bd li')
print(lis)
driver.close()

結果:
[<selenium.webdriver.remote.webelement.WebElement (session="a26ad2f694737df7f51e57d020c16b74", element="22478f55-3eeb-4d6f-b898-6088ac71a6a7")>, <selenium.webdriver.remote.webelement.WebElement (session="a26ad2f694737df7f51e57d020c16b74", element="86ba16f6-ceca-4b7e-bf45-c651f4d27830")>, <selenium.webdriver.remote.webelement.WebElement (session="a26ad2f694737df7f51e57d020c16b74", element="4459a888-ef18-4f09-bb51-b9d389bdcde5")>, <selenium.webdriver.remote.webelement.WebElement (session="a26ad2f694737df7f51e57d020c16b74", element="a64d6dd2-890d-432d-a0a9-438c6665bcb3")>, <selenium.webdriver.remote.webelement.WebElement (session="a26ad2f694737df7f51e57d020c16b74", element="5d2e7795-54fe-4b1a-a620-e3041eb37714")>, <selenium.webdriver.remote.webelement.WebElement (session="a26ad2f694737df7f51e57d020c16b74", element="03d2ba0c-bbf1-4bb3-920c-be447347cfff")>, <selenium.webdriver.remote.webelement.WebElement (session="a26ad2f694737df7f51e57d020c16b74", element="9afb7a4b-cf1f-492f-a723-329ddf625e3e")>, <selenium.webdriver.remote.webelement.WebElement (session="a26ad2f694737df7f51e57d020c16b74", element="acd8159a-a93c-4e54-93a7-3bfbbefef422")>, <selenium.webdriver.remote.webelement.WebElement (session="a26ad2f694737df7f51e57d020c16b74", element="8606a022-3fa7-489d-a2d0-9ad263cf0e7f")>, <selenium.webdriver.remote.webelement.WebElement (session="a26ad2f694737df7f51e57d020c16b74", element="72e75ae6-e3e1-4650-a9c6-5b52e01d9777")>, <selenium.webdriver.remote.webelement.WebElement (session="a26ad2f694737df7f51e57d020c16b74", element="625bf2db-2689-4e6f-ba53-aec889de0ddc")>, <selenium.webdriver.remote.webelement.WebElement (session="a26ad2f694737df7f51e57d020c16b74", element="b609260c-13fc-44d4-9239-fee9eae5b6da")>, <selenium.webdriver.remote.webelement.WebElement (session="a26ad2f694737df7f51e57d020c16b74", element="6c29f74b-0b3f-413a-860e-cbcd71d2bcec")>, <selenium.webdriver.remote.webelement.WebElement (session="a26ad2f694737df7f51e57d020c16b74", element="4a169ec3-bdc9-4081-ab35-4e84dabaf19d")>, <selenium.webdriver.remote.webelement.WebElement (session="a26ad2f694737df7f51e57d020c16b74", element="29b74a5b-498a-4bf7-a2a1-7a451cf64b61")>]

find_element() 方法,只能獲取匹配的第一個節點,結果是WebElement型別,如果用find_elemnts() 方法,則結果是串列形式,串列中每個節點是WebElement型別

這些也是獲取多個節點的方法

driver.find_elements_by_css_selector(
driver.find_elements_by_id()         
driver.find_elements_by_name()       
driver.find_elements_by_xpath()      
driver.find_elements_by_partial_link_
driver.find_elements_by_tag_name()   
driver.find_elements_by_class_name() 

我們也可以使用find_elements() 方法來選擇

driver.find_elements(By.CSS_SELECTOR,".service-bd li")

5、節點互動

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

import time

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
from selenium.webdriver.support.wait import WebDriverWait

driver = webdriver.Chrome()
driver.get("https://www.taobao.com")
input = driver.find_element_by_id('q')
input.send_keys("huawei")
time.sleep(2)
input.clear()
input.send_keys("matepad")
button = driver.find_element_by_class_name("btn-search")
button.click()





先定位到輸入框,然后輸入huawei,等待兩秒在清空,在輸入matepad,點擊搜索

6、動作鏈

一些互動動作都是針對某個節點執行的,比如:對于輸入框,我們就呼叫它的輸入文字和清空文字方法;對于按鈕,就呼叫它的點擊方法,其實還有另外一些操作,他們沒有特定的物件,比如滑鼠的拖拽,鍵盤的按鍵等,這些動作用另一種方式來執行,那就是動作鏈

比如:現在實作一個節點的拖拽操作,將某個節點從一處拖拽到另外一處

import time
from selenium.webdriver import ActionChains
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
from selenium.webdriver.support.wait import WebDriverWait

driver = webdriver.Chrome()
driver.get("https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable")
driver.switch_to.frame("iframeResult")
source = driver.find_element_by_css_selector("#draggable")
target = driver.find_element_by_css_selector("#droppable")
actions = ActionChains(driver)
actions.drag_and_drop(source,target)
actions.perform()








這就是打開一個網頁進行拖拽的節點和拖拽到的目標節點,宣告一個ActionChains物件并將其賦值為actions變數,然后通過呼叫actions變數的drag_and_drop() 方法,在呼叫perform() 方法來進行執行,此時就完成了拖拽

7、執行JavaScript

對于某些操作,Slenium API斌沒有提供,比如,下拉進度條,它可以直接模擬運行JavaScript,此時使用execute_script() 方法就可以實作

import time
from selenium.webdriver import ActionChains
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
from selenium.webdriver.support.wait import WebDriverWait

driver = webdriver.Chrome()
driver.get("https://www.zhihu.com/explore")
driver.execute_script('window.scrollTo(0,document.body.scrollHeight)')
driver.execute_script('alert("To Bottom")')


利用execute_script() 方法將進度跳下拉最底部,然后彈出alert提示框

8、獲取節點資訊

我們可以通過page_source屬性可以獲取網頁的源代碼,接著就可以使用決議庫(如正則運算式,Beautiful Soup,pyquery等)提取資訊

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

8.1 獲取屬性

使用 get_attribute() 方法來獲取節點的屬性,但是其前提是先選中這個節點,

import time
from selenium.webdriver import ActionChains
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
from selenium.webdriver.support.wait import WebDriverWait

driver = webdriver.Chrome()
driver.get("https://www.zhihu.com/explore")
logo = driver.find_element_by_class_name("ExploreCollectionCard-title")
print(logo)
print(logo.get_attribute("class"))


結果:
<selenium.webdriver.remote.webelement.WebElement (session="96f1ac158a9bad0d06fb32cc21cefda6", element="e8cd6a1a-f663-457a-aa68-426561ee1a17")>
ExploreCollectionCard-title

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

8.2 獲取文本值

每個WebElement節點都有text屬性,直接呼叫這個屬性就可以得到內部的文本資訊,這相當于Beautiful Soup的get_text() 方法,pyquery的text() 方法

import time
from selenium.webdriver import ActionChains
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
from selenium.webdriver.support.wait import WebDriverWait

driver = webdriver.Chrome()
driver.get("https://www.zhihu.com/explore")
logo = driver.find_element_by_class_name("ExploreCollectionCard-title")
print(logo)
print(logo.text)



結果:
<selenium.webdriver.remote.webelement.WebElement (session="afd497e9a45395121770946862a30511", element="223964a5-bbe8-4678-9a1e-0fbd901b2885")>
學習提高

8.3 獲取ID,位置,標簽名和大小

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

import time
from selenium.webdriver import ActionChains
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
from selenium.webdriver.support.wait import WebDriverWait

driver = webdriver.Chrome()
driver.get("https://www.zhihu.com/explore")
logo = driver.find_element_by_class_name("ExploreCollectionCard-title")
print(logo.id)
print(logo.location)
print(logo.tag_name)
print(logo.size)


結果:
0caa35fa-5868-44c6-950d-c8392bdc63a2
{'x': 40, 'y': 3409}
a
{'height': 28, 'width': 320}

9、切換Frame

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

import time

from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver import ActionChains
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
from selenium.webdriver.support.wait import WebDriverWait

driver = webdriver.Chrome()
driver.get("https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable")
driver.switch_to.frame("iframeResult")
try:
    logo = driver.find_element_by_class_name("logo")
except NoSuchElementException:
    print("NO LOGO")
driver.switch_to.parent_frame()
logo = driver.find_element_by_class_name("logo")
print(logo)
print(logo.text)

結果:
NO LOGO
<selenium.webdriver.remote.webelement.WebElement (session="97f699231561624df577fc75ece0866e", element="16ea4a07-35f5-426b-aab8-980a86a7d739")>

10、延時等待

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

10.1 隱式等待

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

import time
from selenium.webdriver import ActionChains
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
from selenium.webdriver.support.wait import WebDriverWait

driver = webdriver.Chrome()
driver.get("https://www.zhihu.com/explore")
driver.implicitly_wait(10)
logo = driver.find_element_by_class_name("ExploreCollectionCard-title")
print(logo)

結果:
<selenium.webdriver.remote.webelement.WebElement (session="0c34ab0ea5b70d42de837dd4eae854e7", element="e5a1e9b3-b7e5-458a-9505-9d7cefeeea49")>

使用implicitly_wait() 方法實作了隱士等待

10.2 顯示等待

import time
from selenium.webdriver import ActionChains
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
from selenium.webdriver.support.ui import  WebDriverWait

driver = webdriver.Chrome()
driver.get("https://www.taobao.com/")
wait = WebDriverWait(driver,10)
input = wait.until(EC.presence_of_element_located((By.ID,'q')))
button = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'.btn-search')))
print(input,button)

引入WebDriverWait這個物件,指定最長等待時間,然后呼叫until() 方法,傳入要等待條件excpeted_conditions比如:這里傳入presence_of_element_located這個條件,代表節點出現的意思,其引數就是定位節點元組

在10面內如果ID為q的節點(即搜索框)成功加載出來,就回傳該節點,如果10秒還沒有加載出來,就拋出例外

常用的等待含義

title_is 標題是某內容
title_contains標題包含某些內容
presence_of_element_located節點加載出來,傳入定位元組(By.ID,‘p’)
visibility_of_element_located節點可見,傳入定位元組
visibility_of 可見,傳入節點物件
presence_of_all_elements_located所有節點加載出來
text_to_be_present_in_element某個節點文本包含某文字
text_to_be_present_in_element_value某個節點值包含某文字
frame_to_be_available_and_switch_to_it加載并切換
invisibility_of_element_located節點不可見
element_to_be_clickable節點可點擊
staleness_of判斷一個節點是否存在DOM,可判斷頁面是哦福已經重繪
element_to_be_selected節點可選擇,傳節點物件
element_located_to_be_selected節點可選擇,傳入定位元組
element_selection_state_to_be傳入節點物件以及狀態,相等回傳True,否則回傳False
element_located_selection_state_to_be傳入定位元組以及狀態,相等回傳True,否則回傳False
alert_is_present是否出現警告

11、前進和后退

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

import time
from selenium.webdriver import ActionChains
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
from selenium.webdriver.support.ui import  WebDriverWait

driver = webdriver.Chrome()
driver.get("https://www.taobao.com/")
driver.get('https://www.baidu.com/')
driver.get('https://www.python.org/')
driver.back()
time.sleep(1)
driver.forward()
driver.close()

12、Cookies操作

使用 Selenium ,還可以方便地對 Cookies 進行操作,例如獲取、添加、 洗掉

import time
from selenium.webdriver import ActionChains
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
from selenium.webdriver.support.ui import  WebDriverWait

driver = webdriver.Chrome()
driver.get("https://www.taobao.com/")
print(driver.get_cookies())
driver.add_cookie({'name':'domain','domain':'www.taobao.com','value':'germey'})
print(driver.get_cookies())
driver.delete_all_cookies()
print(driver.get_cookies())

結果:
[{'domain': '.taobao.com', 'expiry': 2272113900, 'httpOnly': False, 'name': 'cna', 'path': '/', 'sameSite': 'None', 'secure': True, 'value': '7ZxcGrzqCCgCAXtwEYzGcf5w'}, {'domain': '.taobao.com', 'expiry': 1641998700, 'httpOnly': False, 'name': '_m_h5_tk_enc', 'path': '/', 'sameSite': 'None', 'secure': True, 'value': 'd9e042eff1e4af78a5d1a243ebe5bb2b'}, {'domain': '.taobao.com', 'expiry': 1656945899, 'httpOnly': False, 'name': 'isg', 'path': '/', 'secure': False, 'value': 'BAAA-rPvdRaYsQkShG1T14qB0Y7SieRTxgpiCHqRzJuu9aAfIpm049ZHCFw18pwr'}, {'domain': '.taobao.com', 'expiry': 1641998700, 'httpOnly': False, 'name': '_m_h5_tk', 'path': '/', 'sameSite': 'None', 'secure': True, 'value': '3434eb6af78e421b8a32e6073184148f_1641403980978'}]
[{'domain': '.www.taobao.com', 'httpOnly': False, 'name': 'domain', 'path': '/', 'secure': True, 'value': 'germey'}, {'domain': '.taobao.com', 'expiry': 2272113900, 'httpOnly': False, 'name': 'cna', 'path': '/', 'sameSite': 'None', 'secure': True, 'value': '7ZxcGrzqCCgCAXtwEYzGcf5w'}, {'domain': '.taobao.com', 'expiry': 1641998700, 'httpOnly': False, 'name': '_m_h5_tk_enc', 'path': '/', 'sameSite': 'None', 'secure': True, 'value': 'd9e042eff1e4af78a5d1a243ebe5bb2b'}, {'domain': '.taobao.com', 'expiry': 1656945899, 'httpOnly': False, 'name': 'isg', 'path': '/', 'secure': False, 'value': 'BAAA-rPvdRaYsQkShG1T14qB0Y7SieRTxgpiCHqRzJuu9aAfIpm049ZHCFw18pwr'}, {'domain': '.taobao.com', 'expiry': 1641998700, 'httpOnly': False, 'name': '_m_h5_tk', 'path': '/', 'sameSite': 'None', 'secure': True, 'value': '3434eb6af78e421b8a32e6073184148f_1641403980978'}]
[]

13、選項卡管理

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

import time
from selenium.webdriver import ActionChains
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
from selenium.webdriver.support.ui import  WebDriverWait

driver = webdriver.Chrome()
driver.get("https://www.taobao.com/")
driver.execute_script('window.open()')
print(driver.window_handles)
driver.switch_to.window(driver.window_handles[1])
driver.get("https://www.baidu.com")
time.sleep(1)
driver.switch_to.window(driver.window_handles[0])
driver.get("https://www.python.org")

14、捕獲例外

在使用 Selenium 的程序中,難免會遇到一些例外,所以我們需要try except陳述句來捕獲各種例外

import time
from selenium.webdriver import ActionChains
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
from selenium.webdriver.support.ui import  WebDriverWait
from selenium.common.exceptions import TimeoutException,NoSuchElementException
driver = webdriver.Chrome()
try:
    driver.get("https://www.baidu.com")
except TimeoutException:
    print('Time Out')
try:
    driver.find_element_by_id("word")
except NoSuchElementException:
    print("No Element")
finally:
    driver.close()

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/404366.html

標籤:python

上一篇:自動化實戰之Cypress

下一篇:Python基礎完結篇(二十三):檔案,還不快來復習一番?

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more