Class 17 - 1 动态渲染页面爬取 — Selenium使用
利用Selenium 可以驅(qū)動(dòng)瀏覽器執(zhí)行特定的動(dòng)作,如點(diǎn)擊、下拉等操作, 同時(shí)還可以獲取瀏覽器當(dāng)前呈現(xiàn)的頁(yè)面的源代碼 ,做到可見(jiàn)即可爬。
- 示例: 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()
運(yùn)行代碼后,會(huì)自動(dòng)彈出一個(gè) Chrome 瀏覽器。首先會(huì)跳轉(zhuǎn)到百度,然后在搜索框中輸入 Python,接著跳轉(zhuǎn)到搜索頁(yè)。??搜索結(jié)果加載出來(lái)后,控制臺(tái)分別會(huì)輸出當(dāng)前的 URL 、當(dāng)前的 Cookies 和網(wǎng)頁(yè)源代碼.
-
如果用 Selenium 來(lái)驅(qū)動(dòng)瀏覽器加載網(wǎng)頁(yè)的話(huà),就可以直接拿到 JavaScript 渲染的結(jié)果,不用擔(dān)心使用的是什么加密系統(tǒng)。聲明瀏覽器對(duì)象
- Selenium 支持非常多瀏覽器,如 Chrome/ Firefox/ Edge等,還有 Android 等手機(jī)端的瀏覽器,也支持無(wú)界面瀏覽器 PhantomJS。
- 初始化方式: from selenium import webdriver
browser = webdriver.Chrome()
browser = webdriver.Firefox()
browser = webdriver.Edge()
browser = webdriver.PhantomJS()
browser = webdriver.Safari()
瀏覽器對(duì)象的初始化并將其賦值為 browser對(duì)象。接下來(lái),就是調(diào)用 browser 對(duì)象,讓其執(zhí)行各個(gè)動(dòng)作以模擬瀏覽器操作
- 初始化方式: from selenium import webdriver
browser = webdriver.Chrome()
browser = webdriver.Firefox()
browser = webdriver.Edge()
browser = webdriver.PhantomJS()
browser = webdriver.Safari()
- 用 get()方法來(lái)請(qǐng)求網(wǎng)頁(yè),參數(shù)傳入鏈接 URL 即可。如用 get()方法訪問(wèn)淘寶, 然后輸出源代碼,代碼: from selenium import webdriver
browser = webdriver.Chrome()
browser.get('https://www.taobao.com/')
print(browser.page_source)
彈出了 Chrome 瀏覽器并且自動(dòng)訪問(wèn)了淘寶,然后控制臺(tái)輸出了淘寶頁(yè)面的源代碼, 隨后瀏覽器關(guān)閉。可以實(shí)現(xiàn)瀏覽器的驅(qū)動(dòng)并獲取網(wǎng)頁(yè)源碼
- Selenium 可以驅(qū)動(dòng)瀏覽器完成各種操作,如填充表單、模擬點(diǎn)擊等。Selenium 提供了系列查找節(jié)點(diǎn)的方法,我們可以用這些方法來(lái)獲取想要的節(jié)點(diǎn),以便執(zhí)行一些動(dòng)作或者提取信息。
- 如,要從淘寶頁(yè)面中提取搜索框這個(gè)節(jié)點(diǎn),觀察源代碼(它的 id 是 q, name 也是q。此時(shí)就可以用多種方式獲取它。如,find_element_by_name()是根據(jù) name 值獲取,find element_by_id()是根據(jù) id 獲取。 還有根據(jù) XPath、css 選擇器等獲取的方式): 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_xpath('//*[@id ="q"]')
input_third = browser.find_element_by_css_selector('#q')
print(input_first, input_second, input_third)
browser.close()
這里使用 3 種方式獲取輸入框,分別根據(jù) ID, CSS 選擇器和 XPath 獲取,它們返回的結(jié)果完全一致。
- 列出所有獲取單個(gè)節(jié)點(diǎn)的方法:
- 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 (),需要傳入兩個(gè)參數(shù):查找方式 By 和值。就是 find_element_by_id()這種方法的通用函數(shù)版本,如 find_element_by_id(id )等價(jià) find_element(By.ID, id),得到的結(jié)果完全一致。代碼: from selenium import webdriver
from selenium.webdriver.common.by import Bybrowser = webdriver.Chrome()
browser.get('https://www.taobao.com')
input_first = browser.find_element(By.ID, 'q')
print(input_first)
browser.close()
查找方式的功能與上面列舉函數(shù)一致,參數(shù)更加靈活。
- 如果有多個(gè)節(jié)點(diǎn),用 find_element()方法查找,就只能得到第一個(gè)節(jié)點(diǎn)。如果要查找所有滿(mǎn)足條件的節(jié)點(diǎn), 需要用 find_elements()方法。注意,這個(gè)方法名稱(chēng)中,element 多了一個(gè)s
- 查找淘寶側(cè)邊導(dǎo)航條的所有條目: 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()
得到的內(nèi)容變成了列表類(lèi)型,列表中的每個(gè)節(jié)點(diǎn)都是 WebElement 類(lèi)型。
如果用 find_element()方法,只能獲取匹配的第一個(gè)節(jié)點(diǎn),結(jié)果是 WebElement類(lèi)型。如果用 find_elements()方法,結(jié)果是列表類(lèi)型,列表中的每個(gè)節(jié)點(diǎn)是 WebElement 類(lèi)型。- 列出所有獲取多個(gè)節(jié)點(diǎn)的方法:
- find_elements_by_id
- find_elements_by_name
- find_elements_by_xpath
- find_elements_by_link_text
- find_elements_by_tag_name
- find_elements_by_class_name
- find_elements_by_css_selector
- ?lis = browser.find_elements(By.CSS_SELECTOR, ’.service-bd li')
- 查找淘寶側(cè)邊導(dǎo)航條的所有條目: 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()
- Selenium 可以讓瀏覽器模擬執(zhí)行一些動(dòng)作。常見(jiàn)的用法有:輸入文字時(shí)用 send_keys()方法,清空文字時(shí)用 clear()方法,點(diǎn)擊按鈕時(shí)用 click()方法。示例: 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()
首先驅(qū)動(dòng)瀏覽器打開(kāi)淘寶,用 find_element_by_id()方法獲取輸入框,再用 send_keys() 方法輸入 iPhone 文字,等待秒后用 clear()方法清空輸入框,再次調(diào)用 send_keys()方法輸入 iPad 文字,之后再 find_element_by_class_name()方法獲取搜索按鈕,最后調(diào)用 click ()方法完成搜索動(dòng)作。
-
更多的操作參見(jiàn)官方文檔交互動(dòng)作介紹:http://selenium-python.readthedocs.io/api.html#module-selenium.webdriver.remote.webelement。
- 動(dòng)作鏈?沒(méi)有特定的執(zhí)行對(duì)象,如:鼠標(biāo)拖曳、鍵盤(pán)按鍵等。
- 如:現(xiàn)在實(shí)現(xiàn)一個(gè)節(jié)點(diǎn)的拖曳操作,將某個(gè)節(jié)點(diǎn)從一處拖曳到另外一處,實(shí)現(xiàn)代碼: from selenium import webdriver
from selenium.webdriver import ActionChainsbrowser = 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
打開(kāi)網(wǎng)頁(yè)中一個(gè)拖曳實(shí)例,依次選中要拖曳的節(jié)點(diǎn)和拖曳到的目標(biāo)節(jié)點(diǎn),接著聲明 ActionChains 對(duì)象并將其賦值為 actions 變量,然后調(diào)用 actions 變量的 drag_and_drop()方法,再調(diào) perform()方法執(zhí)行動(dòng)作。
- 更多動(dòng)作鏈操作 官方文檔:http://selenium-python.readthedocs.io/api.html#moduleselenium.webdriver.common.action_chains
- 某些操作,Selenium API 并沒(méi)有提供。如,下拉進(jìn)度條,它可以直接模擬運(yùn)行 JavaScript,此時(shí)使用 execute_script()方法即可實(shí)現(xiàn),(注意:execute_script): from selenium import webdriverbrowser = webdriver.Chrome() browser.get('https://www.zhihu.com/explore') browser.execute_script('window.scrollTo(0,document.body.scrollHeight)') browser.execute_script('alert("To Bottom")')
- 通過(guò) page_source 屬性可以獲取網(wǎng)頁(yè)的源代碼,接著使用解析庫(kù)(如正則表式、Beautiful Soup、pyquery 等)提取信息。?
- 獲取屬性
- 可以使用 get_attribute ()方法來(lái)獲取節(jié)點(diǎn)的屬性,但是其前提是先選中這個(gè)節(jié)點(diǎn),示例: from selenium import webdriver
browser = webdriver.Chrome()
url = 'https://zhihu.com/explore'
browser.get(url)
logo = browser.find_element_by_id('zh-top-link-logo')
print(logo)
print(logo.get_attribute('class'))
結(jié)果獲取知乎的 logo 節(jié)點(diǎn),最后打印出它的 class。
通過(guò) get_attribute()方法,然后傳人想要獲取的屬性名,就可以得到它的值了
- 可以使用 get_attribute ()方法來(lái)獲取節(jié)點(diǎn)的屬性,但是其前提是先選中這個(gè)節(jié)點(diǎn),示例: from selenium import webdriver
browser = webdriver.Chrome()
url = 'https://zhihu.com/explore'
browser.get(url)
logo = browser.find_element_by_id('zh-top-link-logo')
print(logo)
print(logo.get_attribute('class'))
- 獲取文本值
- 每個(gè) WebElement 節(jié)點(diǎn)都有 text 屬性,直接調(diào)用這個(gè)屬性就可以得到節(jié)點(diǎn)內(nèi)部的文本信息,相當(dāng)于 Beautiful Soup 的 get_text()方法、 pyquery 的 text()方法。示例: 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)
- 獲取id、位置、標(biāo)簽名和大小
- Web Element 節(jié)點(diǎn)還有 些其他屬性,如 id 屬性可以獲取節(jié)點(diǎn) id,location 屬性可以獲取該節(jié)點(diǎn)在頁(yè)面中的相對(duì)位置,tag_name 屬性可以獲取標(biāo)簽名稱(chēng),size 屬性可以獲取節(jié)點(diǎn)的大小(寬高),示例: 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)
print(input.id)
print(input.location)
print(input.size)
print(input.tag_name)
首先獲得“提問(wèn)”按鈕節(jié)點(diǎn),再調(diào)用其 id、location、tag_name、size 屬性來(lái)獲取對(duì)應(yīng)的屬性值
- Web Element 節(jié)點(diǎn)還有 些其他屬性,如 id 屬性可以獲取節(jié)點(diǎn) id,location 屬性可以獲取該節(jié)點(diǎn)在頁(yè)面中的相對(duì)位置,tag_name 屬性可以獲取標(biāo)簽名稱(chēng),size 屬性可以獲取節(jié)點(diǎn)的大小(寬高),示例: 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)
print(input.id)
print(input.location)
print(input.size)
print(input.tag_name)
切換Frame
-
網(wǎng)頁(yè)中有種節(jié)點(diǎn)叫作 iframe,也就是子 Frame,相當(dāng)于頁(yè)面的子頁(yè)面,它的結(jié)構(gòu)和外部網(wǎng)頁(yè)的結(jié)構(gòu)完全一致。Selenium 打開(kāi)頁(yè)面后,默認(rèn)在父級(jí) Frame 里面操作,而此時(shí)如果頁(yè)面中還有子Frame,是不能獲取到子 Frame 里面的節(jié)點(diǎn)的。這時(shí)就需要使用 switch_to.frame()方法來(lái)切換Frame。示例:
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)以前面動(dòng)作鏈操作的網(wǎng)頁(yè)例,首先通過(guò) switch_to.frame()方法切換到子 Frame 里,再?lài)L試獲取父級(jí) Frame 里的 logo 節(jié)點(diǎn)(這是不能找到的),如果找不到的話(huà),就會(huì)拋出 NoSuchEle entException 異常,異常被捕捉之后,就會(huì)輸出 NO LOGO。接下來(lái),重新切換父級(jí) Frame, 然后再次重新獲取節(jié)點(diǎn),發(fā)現(xiàn)此時(shí)可以成功獲取了。?
當(dāng)頁(yè)面中包含子 Frame 時(shí),如果想獲取子 Frame 中的節(jié)點(diǎn),需要先調(diào)用 switch_to.frame() 方法切換到對(duì)應(yīng)的 Frame,再進(jìn)行操作。
- Selenium 中, get()方法會(huì)在網(wǎng)頁(yè)框架加載結(jié)束后結(jié)束執(zhí)行,此時(shí)如果獲取 page_source ,可能并不是瀏覽器完全加載完成的頁(yè)面,某些頁(yè)面有額外的 Ajax 請(qǐng)求,在網(wǎng)頁(yè)驚代碼中也不一定能成功獲取到。所以,這里需要延時(shí)等待一定時(shí)間,確保節(jié)點(diǎn)已經(jīng)加載出來(lái)。
- 延時(shí)等待方式有兩種:隱式等待和顯式等待
- 隱式等待
- 使用隱式等待執(zhí)行測(cè)試的時(shí)候,如果 Selenium 沒(méi)有在 DOM 中找到節(jié)點(diǎn),將繼續(xù)等待,超出設(shè)定時(shí)間后(默認(rèn)時(shí)間為 0 ),則拋出找不到節(jié)點(diǎn)的異常。示例: 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()方法實(shí)現(xiàn)隱式等待。
- 使用隱式等待執(zhí)行測(cè)試的時(shí)候,如果 Selenium 沒(méi)有在 DOM 中找到節(jié)點(diǎn),將繼續(xù)等待,超出設(shè)定時(shí)間后(默認(rèn)時(shí)間為 0 ),則拋出找不到節(jié)點(diǎn)的異常。示例: 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)
- 顯式等待
- 指定要查找的節(jié)點(diǎn),然后指定一個(gè)最長(zhǎng)等待時(shí)間。如果在規(guī)定時(shí)間內(nèi)加載出來(lái)了這個(gè)節(jié)點(diǎn),就返回查找的節(jié)點(diǎn);如果到了規(guī)定時(shí)間依然沒(méi)有加載出該節(jié)點(diǎn), 則拋出超時(shí)異常。示例: 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 ECbrowser = 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 對(duì)象,指定最長(zhǎng)等待時(shí)間,調(diào)用 until()方法,傳人要等待條件 expected_conditions。如:傳入 presence_of_element_located 條件,代表節(jié)點(diǎn)出出現(xiàn)意思,參數(shù)是節(jié)點(diǎn)的定位元組,也就是 ID 為 q 的節(jié)點(diǎn)搜索框。
效果:在 10 秒內(nèi)如果 ID 為 q的節(jié)點(diǎn)(搜索框)成功加載出來(lái),就返回該節(jié)點(diǎn);如果超過(guò) 10 秒還沒(méi)有加載出來(lái),就拋出異常。- 對(duì)于按鈕,更改一下等待條件,如改為 element_to_be_clickable,也就是可點(diǎn)擊,所以找按鈕時(shí)查找 CSS 選擇器為 .btn_search 的按鈕,如果 10 秒內(nèi)它是可點(diǎn)擊的,也就是成功加載,返回這個(gè)按鈕節(jié)點(diǎn);如果超過(guò) 10 秒還不可點(diǎn)擊,就拋出異常.
- 等待條件,如判斷標(biāo)題內(nèi)容,判斷某個(gè)節(jié)點(diǎn)內(nèi)是否出現(xiàn)了某文字。等待條件:
- title_is:標(biāo)題是某內(nèi)容
- title_contains: 標(biāo)題包含某內(nèi)容
- presence_of_element_located:節(jié)點(diǎn)加載出來(lái),傳入定位元組,如(By.ID,‘q’)
- visibility_of_element_located:節(jié)點(diǎn)課件,傳入定位元組
- visibility_of:可見(jiàn),傳入節(jié)點(diǎn)對(duì)象
- presence_of_all_elements_ilocated:所有節(jié)點(diǎn)加載出來(lái)
- text_to_be_present_in_element:某個(gè)節(jié)點(diǎn)文本包含某文字
- text_to_be_present_in_element_value:某個(gè)節(jié)點(diǎn)值包含某文字
- frame_to_be_available_and_switch_to_it:加載并切換
- invisibility_of_element_located:節(jié)點(diǎn)不可見(jiàn)
- element_to_be_clickable:節(jié)點(diǎn)可點(diǎn)擊
- staleness_of:判斷一個(gè)節(jié)點(diǎn)是否仍在DOM,可判斷頁(yè)面是否已經(jīng)刷新
- element_to_be_selected:節(jié)點(diǎn)可選擇,傳節(jié)點(diǎn)對(duì)象
- element_located_to_be_selected:節(jié)點(diǎn)可選擇,傳入定位元組
- element_election_state_to_be:傳入節(jié)點(diǎn)對(duì)象以及狀態(tài),相等返回True,否則返回False
- element_located_selection_state_to_be:傳入定位元組。以及狀態(tài),相等返回True,否則返回False
- alert_is_present:是否出現(xiàn)警告
- 更多等待條件的參數(shù)及用法,參考官方文檔: http://selenium-python.readthedocs.io/api.html#module-selenium.webdriver.support.expected_conditions。
- 對(duì)于按鈕,更改一下等待條件,如改為 element_to_be_clickable,也就是可點(diǎn)擊,所以找按鈕時(shí)查找 CSS 選擇器為 .btn_search 的按鈕,如果 10 秒內(nèi)它是可點(diǎn)擊的,也就是成功加載,返回這個(gè)按鈕節(jié)點(diǎn);如果超過(guò) 10 秒還不可點(diǎn)擊,就拋出異常.
- 指定要查找的節(jié)點(diǎn),然后指定一個(gè)最長(zhǎng)等待時(shí)間。如果在規(guī)定時(shí)間內(nèi)加載出來(lái)了這個(gè)節(jié)點(diǎn),就返回查找的節(jié)點(diǎn);如果到了規(guī)定時(shí)間依然沒(méi)有加載出該節(jié)點(diǎn), 則拋出超時(shí)異常。示例: 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 ECbrowser = 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)
- Selenium 可以完成前進(jìn)和后退操作,它使用 back()方法后退,使用 forward()方法前進(jìn)。示例: import time
from selenium import webdriverbrowser = 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()
連續(xù)訪問(wèn)3個(gè)頁(yè)面,調(diào)用 back()方法回到第二個(gè)頁(yè)面,再調(diào)用 forward()方法前進(jìn)到第 3個(gè)頁(yè)面。
- Selenium 可以方便地對(duì) Cookies 進(jìn)行 獲取、添加、刪除等。示例: from selenium import webdriverbrowser = 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())
訪問(wèn)知乎,加載完成后,瀏覽器已經(jīng)生成 Cookies。調(diào)用 get_cookies() 方法獲取所有的 Cookies。然后,添加一個(gè) Cookie,傳入一個(gè)字典,有name、domain、value內(nèi)容。再次獲取所有 Cookies。結(jié)果就多了新加的 Cookie。調(diào)用 delete_all_cookies()方法刪除所有 Cookies。再重新獲取,結(jié)果就為空了。
- 訪問(wèn)網(wǎng)頁(yè)時(shí)候,會(huì)開(kāi)啟一個(gè)個(gè)選項(xiàng)卡。Selenium 中,也可以對(duì)選項(xiàng)卡進(jìn)行操作。示例: import time
from selenium import webdriverbrowser = 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.taobap.com')
time.sleep(1)
browser.switch_to_window(browser.window_handles[0])
browser.get('https://python.org')
首先訪問(wèn)百度,然后調(diào)用 execute_script()方法,傳入 window.open()這個(gè) JavaScript 語(yǔ)句新開(kāi)啟一個(gè)選項(xiàng)卡。接下來(lái),想切換到該選項(xiàng)卡,調(diào)用 window_handles 屬性獲取當(dāng)前開(kāi)啟的所有選項(xiàng)卡,返回的是選項(xiàng)卡的代號(hào)列表。要想切換選項(xiàng)卡,只需要調(diào)用 switch_to_window()方法即可,其中參數(shù)是選項(xiàng)卡的代號(hào)。將第二個(gè)選項(xiàng)卡代號(hào)傳人,即跳轉(zhuǎn)到第二個(gè)選項(xiàng)卡,接下來(lái)在第二個(gè)選項(xiàng)卡下打開(kāi)一個(gè)新頁(yè)面,然后切換回第一個(gè)選項(xiàng)卡重新調(diào)用 switch_to_window()方法,再執(zhí)行其他操作。
- 在使用 Selenium 過(guò)程中,可以使用 try except 語(yǔ)句來(lái)捕獲各種異常。(模擬節(jié)點(diǎn)未找到異常)示例: from selenium import webdriver
browser = webdriver.Chrome()
browser.get('https://www.baidu.com')
browser.find_element_by_id('hello')
首先打開(kāi)百度頁(yè)面,嘗試選擇一個(gè)并不存在的節(jié)點(diǎn) ,此時(shí)就會(huì)遇到異常。捕獲異常示例:
from selenium import webdriver from selenium.common.exceptions import TimeoutException, NoSuchElementExceptionbrowser = webdriver.Chrome() try:browser.get('https://www.baidu.com') except TimeoutException:print('Timeout') try:browser.find_element_by_id('hello') except NoSuchElementException:print('No Element') finally:browser.close()這里使用 try except 來(lái)捕獲各類(lèi)異常。如,對(duì) find_element_by_id()查找節(jié)點(diǎn)方法捕獲 NoSuchElementException 異常,一旦出現(xiàn)這樣的錯(cuò)誤,就進(jìn)行異常處理,程序也不會(huì)中斷。
- 更多異常類(lèi),參考官方文檔 http://selenium-python.readthedocs.io/api.html#module-selenium.common.exceptions。
轉(zhuǎn)載于:https://www.cnblogs.com/Mack-Yang/p/10184662.html
總結(jié)
以上是生活随笔為你收集整理的Class 17 - 1 动态渲染页面爬取 — Selenium使用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 你的域名是如何变成 IP 地址的?
- 下一篇: Git科普文,Git基本原理各种骚操作