一讶泰、什么是AJAX
AJAX[1],全稱(chēng)Asynchronous JavaScript And XML拂到,即異步的JavaScript和XML痪署。通過(guò)在后臺(tái)與服務(wù)器進(jìn)行少量的數(shù)據(jù)交換,AJAX可以使網(wǎng)頁(yè)實(shí)現(xiàn)異步更新兄旬,實(shí)現(xiàn)網(wǎng)頁(yè)的動(dòng)態(tài)渲染狼犯。
這意味著可以在不加載整個(gè)網(wǎng)頁(yè)的情況下,對(duì)網(wǎng)頁(yè)的某部分進(jìn)行更新。而傳統(tǒng)的網(wǎng)頁(yè)如果需要更新內(nèi)容,則必須重載整個(gè)網(wǎng)頁(yè)頁(yè)面悯森。
使用AJAX加載的網(wǎng)頁(yè)數(shù)據(jù)宋舷,雖然將數(shù)據(jù)渲染到了瀏覽器中,但在網(wǎng)頁(yè)源代碼中還是看不到通過(guò)ajax加載的數(shù)據(jù)呐馆,只能看到通過(guò)url加載的數(shù)據(jù)肥缔,這使得通過(guò)requests、urllib無(wú)法正常獲取網(wǎng)頁(yè)的全部數(shù)據(jù)汹来。
獲取ajax數(shù)據(jù)的兩種方式:
- 直接分析ajax調(diào)用的接口,然后通過(guò)代碼請(qǐng)求這個(gè)接口
優(yōu)點(diǎn):可以直接請(qǐng)求到數(shù)據(jù),不需要做一些解析工作改艇,代碼量少收班,性能高。
缺點(diǎn):分析接口比較復(fù)雜谒兄,特別是一些通過(guò)js混淆的接口摔桦,需要一定的js功底,容易被發(fā)現(xiàn)是爬蟲(chóng)承疲。
- 使用selenium+driver(瀏覽器驅(qū)動(dòng))模擬瀏覽器行為獲取數(shù)據(jù)
優(yōu)點(diǎn):瀏覽器能請(qǐng)求到的數(shù)據(jù)邻耕,使用selenium也能請(qǐng)求到,爬蟲(chóng) 更穩(wěn)定燕鸽,且適用于所有類(lèi)型的動(dòng)態(tài)渲染網(wǎng)頁(yè)[2]兄世。
缺點(diǎn):代碼量多,性能低啊研。
二御滩、selenium+chromedriver獲取動(dòng)態(tài)數(shù)據(jù)
selenium是一個(gè)自動(dòng)化測(cè)試工具,可以模擬人類(lèi)在瀏覽器上的一些行為党远,自動(dòng)處理瀏覽器上的一些行為削解,比如點(diǎn)擊、填充數(shù)據(jù)等沟娱。還可以獲取瀏覽器當(dāng)前呈現(xiàn)的頁(yè)面源碼氛驮,解決動(dòng)態(tài)渲染網(wǎng)頁(yè)的數(shù)據(jù)抓取,做到可見(jiàn)即可爬济似。
而chromedriver是一個(gè)驅(qū)動(dòng)Chrome瀏覽器的驅(qū)動(dòng)程序矫废,selenium使用它才能夠驅(qū)動(dòng)Chrome瀏覽器。
針對(duì)不同的瀏覽器有不同的驅(qū)動(dòng)(driver),比如Firefox的驅(qū)動(dòng)geckodriver碱屁、IE的驅(qū)動(dòng)IEdriver等磷脯,都可以配合selenium驅(qū)動(dòng)對(duì)應(yīng)的瀏覽器,本文以Chrome瀏覽器為例娩脾。
安裝Selenium+chromedriver:
- 安裝selenium模塊:pip install selenium
- 安裝chromedriver驅(qū)動(dòng):下載chromedriver驅(qū)動(dòng)后赵誓,放到不需要權(quán)限的純英文目錄下即可,但每次使用都需要指定驅(qū)動(dòng)的絕對(duì)路徑。也可以放到python的Scripts目錄下(推薦)俩功,或者將其路徑添加到環(huán)境變量中幻枉,這樣每次使用也都無(wú)需指定路徑。
三诡蜓、selenium使用詳解
入門(mén)檢測(cè):
from selenium import webdriver
#聲明瀏覽器對(duì)象
#chromedriver驅(qū)動(dòng)已放入Python的Scripts目錄熬甫,故無(wú)需再指定路徑
driver= webdriver.Chrome()
#請(qǐng)求網(wǎng)頁(yè)(適用所有請(qǐng)求類(lèi)型)
driver.get('https://www.baidu.com/')
#獲取當(dāng)前瀏覽器渲染后的HTML代碼
print( driver.page_source )
#關(guān)閉當(dāng)前頁(yè)面
driver.close()
#關(guān)閉整個(gè)瀏覽器
driver.quit()
selenium的常用操作:
(一)、定位元素:
定位單個(gè)元素:find_element
- find_element_by_id:根據(jù)id來(lái)查找某個(gè)元素蔓罚。
第一種方式:div_tag = driver.find_element_by_id('su')
第二種方式:div_tag = driver.find_element(By.ID, 'su')
注意:二者效果等價(jià)椿肩,推薦使用第一種。
使用第二種方式需要先導(dǎo)入By類(lèi)
from selenium.webdriver.common.by import By
- find_element_by_class_name:根據(jù)類(lèi)名來(lái)查找某個(gè)元素豺谈。driver.find_element_by_class_name('su')
driver.find_element(By.CLASS_NAME, 'su')
- find_element_by_name:根據(jù)name屬性值查找某個(gè)元素郑象。
driver.find_element_by_name('emile')
driver.find_element(By.NAME, 'emile')
- find_element_by_tag_name:根據(jù)標(biāo)簽名來(lái)查找某個(gè)元素。
driver.find_element_by_tag_name('div')
driver.find_element(By.TAG_NAME, 'div')
- find_element_by_xpath:根據(jù)xpath語(yǔ)法查找某個(gè)元素茬末。
driver.find_element_by_xpath('//div')
driver.find_element(By.XPATH, '//div')
- find_element_by_css_selector:根據(jù)css選擇器選取元素厂榛。
driver.find_element_by_css_selector('//div')
driver.find_element(By.CSS_SELECTOR, '//div')
定位多個(gè)元素:find_elements
find_element_by_id:根據(jù)id來(lái)查找某個(gè)元素
find_elements_by_class_name:根據(jù)類(lèi)名來(lái)查找某個(gè)元素
find_elements_by_name:根據(jù)name屬性的值來(lái)查找某個(gè)元素
find_elements_by_tag_name:根據(jù)標(biāo)簽名來(lái)查找某個(gè)元素
find_elements_by_xpath:根據(jù)xpath語(yǔ)法來(lái)查找某個(gè)元素
find_elements_by_css_selector:根據(jù)css選擇器來(lái)選取某個(gè)元素
注意:
- find_elements與find_element用法一致,只是多了一個(gè)s丽惭!
- find_element是獲取第一個(gè)滿足條件的元素,直接返回獲取到的元素對(duì)象,如果找不到,則報(bào)錯(cuò)击奶!
- find_elements是獲取所有滿足條件的元素,返回獲取到的所有元素對(duì)象組成的列表,如果找不到,返回空列表!
(二)责掏、操作表單元素
常見(jiàn)的表單元素:
- 輸入框:input type='text/password/email/number'
- 按鈕:button柜砾、input type='submit'
- 復(fù)選框:checkbox、input type='checkbox'
- 下拉列表:select
操作輸入框input:
第一步:定位標(biāo)簽拷橘;
第二步:使用send_keys(value)將數(shù)據(jù)填入輸入框局义。操作按鈕button:
第一步:定位標(biāo)簽;
第二步:執(zhí)行click()點(diǎn)擊事件冗疮。操作復(fù)選框checkbox:
第一步:定位標(biāo)簽萄唇;
第二步:執(zhí)行click()點(diǎn)擊事件。
如果默認(rèn)是未選中,則點(diǎn)擊后選中,再次點(diǎn)擊則取消選中术幔!操作下拉列表select:
select的元素不能直接點(diǎn)擊另萤,因?yàn)樾枰冗x中元素。
第一步:定位select標(biāo)簽
第二步:導(dǎo)入類(lèi) selenium.webdriver.support.ui.Select
第三步:將獲取到的元素當(dāng)做參數(shù)傳入這個(gè)類(lèi)中诅挑,創(chuàng)建Select對(duì)象
第四步:使用這個(gè)對(duì)象選擇下拉列表中的選項(xiàng)
示例1:
from selenium import webdriver
from selenium.webdriver.support.ui import Select
import time
driver = webdriver.Chrome()
#請(qǐng)求網(wǎng)頁(yè)
driver.get('https://hao.#/')
#選中輸入框
input_tag = driver.find_element_by_id('search-kw')
#發(fā)送數(shù)據(jù)
input_tag.send_keys('python')
time.sleep(3)
#清除輸入框數(shù)據(jù)
input_tag.clear()
#選中按鈕
button_tag = driver.find_element_by_id('search-btn')
#點(diǎn)擊按鈕
button_tag.click()
time.sleep(2)
#注意:此時(shí)select元素處于隱藏狀態(tài)的div元素內(nèi)四敞,
#需要點(diǎn)擊激活div元素,然后才能定位到select元素
div_tag = driver.find_element_by_id('email')
div_tag.click()
select_tag = driver.find_element_by_id('mail-opts')
#將選中的下拉列表元素拔妥,傳入Select類(lèi)中忿危,創(chuàng)建Select對(duì)象
select = Select( select_tag )
#根據(jù)索引選擇下拉列表的選項(xiàng)(注意:選中相當(dāng)于點(diǎn)擊!)
select_index = select .select_by_index(1)
#根據(jù)value屬性選擇
select .select_by_value('@163.com 網(wǎng)易')
#根據(jù)可見(jiàn)文本選擇
select .select_by_visible_text('@126.com 網(wǎng)易')
#取消所有選中項(xiàng)
select .deselect_all()
driver.quit()
示例2:
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('http://www.reibang.com/sign_in')
#選中復(fù)選框
check_tag =driver.find_element_by_id('session_remember_me')
#點(diǎn)擊復(fù)選框
check_tag.click()
driver.quit()
(三)、行為鏈ActionChains
有時(shí)候在頁(yè)面中的操作需要多個(gè)步驟没龙,這個(gè)時(shí)候可以使用鼠標(biāo)行為鏈類(lèi)ActionChains來(lái)統(tǒng)一完成铺厨。
比如將鼠標(biāo)移動(dòng)到某個(gè)元素上并執(zhí)行點(diǎn)擊事件缎玫,示例代碼如下:
import time
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
driver = webdriver.Chrome()
driver.get('https://baidu.com/')
#選中輸入框
input_tag = driver.find_element_by_id('kw')
#選中按鈕
button_tag = driver.find_element_by_id('su')
#創(chuàng)建行為鏈對(duì)象
actions = ActionChains(driver)
#移動(dòng)到某個(gè)元素
actions.move_to_element(input_tag)
#向某個(gè)元素發(fā)送數(shù)據(jù)
actions.send_keys_to_element(input_tag, 'python')
#移動(dòng)鼠標(biāo)到某個(gè)元素
actions.move_to_element(button_tag)
#點(diǎn)擊某個(gè)元素
actions.click(button_tag)
#執(zhí)行這個(gè)行為鏈
actions.perform()
time.sleep(3)
driver.quit()
其他操作:
actions.click_and_hold(on_element=None) 點(diǎn)擊但不松開(kāi)鼠標(biāo)
actions.context_click(on_element=None) 右擊
actions.double_click(on_element=None) 雙擊
actions.drag_and_drop(source, target) 拖拽
更多見(jiàn)官方文檔api
(四)、網(wǎng)頁(yè)的Cookie操作
注意:只能獲取當(dāng)前網(wǎng)頁(yè)的Cookie信息,而獲取不到其他網(wǎng)頁(yè)的cookie信息解滓。
示例代碼:
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://baidu.com/')
# 1. 獲取所有的cookies
for cookie in driver.get_cookies():
print(cookie)
# 2. 根據(jù)cookie的name獲取某條cookie
print( driver.get_cookie(name='delPer') )
# 3. 根據(jù)cookie的name刪除某條cookie
driver.delete_cookie('delPer')
print( driver.get_cookie(name='delPer') )
# 4. 刪除所有的cookie
driver.delete_all_cookies()
# 5. 添加cookie
driver.add_cookie({'name' : 'foo', 'value' : 'bar', 'path' : '/'})
print( driver.get_cookies() )
(五)赃磨、頁(yè)面等待
現(xiàn)在網(wǎng)頁(yè)越來(lái)越多的采用了Ajax技術(shù),這樣程序便不能確定某個(gè)元素何時(shí)才能完全加載出來(lái)洼裤。如果程序定位某個(gè)元素時(shí)邻辉,實(shí)際頁(yè)面中這個(gè)元素還未完全加載進(jìn)來(lái),此時(shí)便會(huì)拋出NoSuchElementException異常腮鞍。為了解決這個(gè)問(wèn)題值骇,selenium提供了兩種等待方式:隱式等待、顯示等待移国。
1.隱式等待:
調(diào)用driver.implicitly_wait(n)雷客,在定位元素之前直接等待n秒,如果等待n秒之后仍然定位不到元素桥狡,則報(bào)錯(cuò)。
2.顯式等待:
在指定時(shí)間內(nèi)皱卓,一直等待某個(gè)條件成立裹芝,條件成立后立即執(zhí)行定位元素的操作;如果超過(guò)這個(gè)時(shí)間條件仍然沒(méi)有成立娜汁,則會(huì)拋出異常嫂易!
顯式等待需要使用selenium.webdriver.support.excepted_conditions
期望條件
和selenium.webdriver.support.ui.WebDriverWait
類(lèi)來(lái)配合完成。
示例代碼:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
driver = webdriver.Chrome()
driver.get('https://www.douban.com/')
# 隱式等待:直接等待10秒鐘
driver.implicitly_wait(10)
# 執(zhí)行定位元素操作
driver.find_element(By.ID, 'hahahah')
# 顯式等待:條件成立掐禁,立即執(zhí)行怜械;超過(guò)指定時(shí)間則報(bào)錯(cuò)
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located( (By.ID, 'form_email') )
#注意:傳入的定位條件必須是元組形式
)
常見(jiàn)的等待條件:
presence_of_element_located:某個(gè)元素已經(jīng)加載出來(lái)了
presence_of_all_elements_located :所有符合條件的元素都加載完畢了
element_to_be_clickable:某個(gè)元素可以被點(diǎn)擊了
visibility_of_element_located :某個(gè)元素可以看見(jiàn)了
frame_to_be_available_and_switch_to_it:某個(gè)子網(wǎng)頁(yè)一旦可以切換了就切換過(guò)去。
更多見(jiàn)官網(wǎng)
(六)傅事、切換窗口:switch_to.window
有時(shí)候?yàn)g覽器存在多個(gè)窗口缕允,如果需要在不同窗口進(jìn)行操作,就需要在程序中切換窗口蹭越。selenium提供了switch_to.window方法來(lái)切換窗口障本,而具體切換到哪個(gè)窗口,可以通過(guò)driver.window_handles查看所有窗口對(duì)象响鹃。
示例代碼:
from selenium import webdriver
driver = webdriver.Chrome()
# 1.打開(kāi)百度首頁(yè)
driver.get('https://baidu.com/')
# 2.在當(dāng)前瀏覽器中打開(kāi)一個(gè)新的窗口驾霜,并打開(kāi)豆瓣網(wǎng)。
driver.execute_script( 'window.open("https://www.douban.com/")')
print( '當(dāng)前url:', driver.current_url )
#注意:列表會(huì)按照打開(kāi)窗口的順序存儲(chǔ)窗口對(duì)象买置!
print( '所有窗口對(duì)象:', driver.window_handles )
print( '當(dāng)前窗口對(duì)象:', driver.current_window_handle )
# 切換窗口:
# 注意:窗口對(duì)象必須在相應(yīng)的頁(yè)面粪糙,driver才能操作對(duì)應(yīng)的頁(yè)面。
# 從窗口對(duì)象列表中索引出需要切換的窗口對(duì)象忿项,傳入即可蓉冈。
driver.switch_to.window( driver.window_handles[1] )
print( '當(dāng)前url:', driver.current_url )
print( '當(dāng)前窗口對(duì)象:', driver.current_window_handle )
(七)城舞、切換子網(wǎng)頁(yè)iframe:switch_to.frame
在網(wǎng)頁(yè)中可能嵌套著子網(wǎng)頁(yè),父網(wǎng)頁(yè)和子網(wǎng)頁(yè)是相對(duì)獨(dú)立的洒擦,查找某個(gè)網(wǎng)頁(yè)的元素必須切換到相應(yīng)網(wǎng)頁(yè)中才能找到椿争!
比如:如果在父網(wǎng)頁(yè)中查找子網(wǎng)頁(yè)的元素,則必須切換到子網(wǎng)頁(yè)熟嫩,否則找不到秦踪,反之亦然。
示例代碼:
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
url = 'https://graph.qq.com/oauth2.0/show?which=Login&display=pc&client_id=100290348&response_type=code&state=ab183433jKFQqXF6b25lX3Nuc6FToKFO2UxodHRwczovL3Nzby50b3V0aWFvLmNvbS9hdXRoL2xvZ2luX3N1Y2Nlc3MvP3NlcnZpY2U9aHR0cHM6Ly93d3cudG91dGlhby5jb20voVYBoUkAoUQAoUEYoU0YoUivd3d3LnRvdXRpYW8uY29toVIEolBMAKZBQ1RJT06g&redirect_uri=http%3A%2F%2Fapi.snssdk.com%2Fauth%2Flogin_success%2F&scope=get_user_info,add_share,add_t,add_pic_t,get_info,get_other_info,get_fanslist,get_idollist,add_idol,get_repost_list'
driver.get(url)
# 切換到主網(wǎng)頁(yè)(默認(rèn)iframe)
driver.switch_to.default_content()
# 多個(gè)iframe掸茅,切換到子網(wǎng)頁(yè)
driver.switch_to.frame("ptlogin_iframe")
# 注意:返回的子網(wǎng)頁(yè)的HTML代碼,而不是整個(gè)頁(yè)面
print( driver.page_source )
# 點(diǎn)擊賬號(hào)密碼登錄
driver.find_element_by_id("switcher_plogin").click()
切換到當(dāng)前網(wǎng)頁(yè)的父網(wǎng)頁(yè)
driver.switch_to.parent_frame()
注意:切換子網(wǎng)頁(yè)有三種方式:
- 根據(jù)iframe標(biāo)簽的name屬性值切換:
driver.switch_to.frame('frame_name')
- 根據(jù)多個(gè)子網(wǎng)頁(yè)frame的順序編號(hào)切換:
driver.switch_to.frame(1)
- 找到所有的iframe標(biāo)簽,然后通過(guò)索引切換到對(duì)應(yīng)子網(wǎng)頁(yè)
driver.switch_to.frame( driver.find_elements_by_tag_name("iframe")[1] )
(八)椅邓、執(zhí)行JavaScript代碼:execute_script
有些動(dòng)作可能selenium沒(méi)有提供api,比如進(jìn)度條下拉昧狮、打開(kāi)新的窗口等景馁,這時(shí)我們可以通過(guò)代碼執(zhí)行JavaScript執(zhí)行相應(yīng)操作。
from selenium import webdriver
driver= webdriver.Chrome()
driver.get('https://www.zhihu.com/explore')
#進(jìn)度條滾動(dòng)到底
driver.execute_script('window.scrollTo(0, document.body.scrollHeight)')
#彈出警告框
driver.execute_script('alert("To Bottom")')
#打開(kāi)一個(gè)新的窗口
driver.execute_script('window.open()')
(九)逗鸣、在selenium中設(shè)置代理
無(wú)認(rèn)證代理:
from selenium import webdriver
#設(shè)置瀏覽器選項(xiàng)
options = webdriver.ChromeOptions()
#設(shè)置無(wú)驗(yàn)證代理
options.add_argument('--proxy-server=https://106.75.226.36:808')
driver = webdriver.Chrome( chrome_options=options )
driver.get("https://httpbin.org/ip")
print(driver.page_source)
認(rèn)證代理:
# 生成Chrome瀏覽器的代理認(rèn)證插件
import string
import zipfile
def create_proxyauth_extension(proxy_host, proxy_port,
proxy_username, proxy_password,
scheme='http', plugin_path=None):
"""代理認(rèn)證插件
args:
proxy_host (str): 你的代理地址或者域名(str類(lèi)型)
proxy_port (int): 代理端口號(hào)(int類(lèi)型)
proxy_username (str):用戶名(字符串)
proxy_password (str): 密碼 (字符串)
kwargs:
scheme (str): 代理方式 默認(rèn)http
plugin_path (str): 擴(kuò)展的絕對(duì)路徑
return str -> plugin_path
"""
import string
import zipfile
if plugin_path is None:
plugin_path = 'vimm_chrome_proxyauth_plugin.zip'
manifest_json = """
{
"version": "1.0.0",
"manifest_version": 2,
"name": "Chrome Proxy",
"permissions": [
"proxy",
"tabs",
"unlimitedStorage",
"storage",
"<all_urls>",
"webRequest",
"webRequestBlocking"
],
"background": {
"scripts": ["background.js"]
},
"minimum_chrome_version":"22.0.0"
}
"""
background_js = string.Template(
"""
var config = {
mode: "fixed_servers",
rules: {
singleProxy: {
scheme: "${scheme}",
host: "${host}",
port: parseInt(${port})
},
bypassList: ["foobar.com"]
}
};
chrome.proxy.settings.set({value: config, scope: "regular"}, function() {});
function callbackFn(details) {
return {
authCredentials: {
username: "${username}",
password: "${password}"
}
};
}
chrome.webRequest.onAuthRequired.addListener(
callbackFn,
{urls: ["<all_urls>"]},
['blocking']
);
"""
).substitute(
host=proxy_host,
port=proxy_port,
username=proxy_username,
password=proxy_password,
scheme=scheme,
)
with zipfile.ZipFile(plugin_path, 'w') as zp:
zp.writestr("manifest.json", manifest_json)
zp.writestr("background.js", background_js)
return plugin_path
if __name__ == '__main__':
from selenium import webdriver
proxyauth_plugin_path = create_proxyauth_extension(
proxy_host="47.92.24.143",
proxy_port=16817,
proxy_username="dsc0206",
proxy_password="ng1lgio8"
)
# 設(shè)置瀏覽器選項(xiàng)
options = webdriver.ChromeOptions()
#設(shè)置驗(yàn)證代理
options.add_argument("--start-maximized")
options.add_extension(proxyauth_plugin_path)
driver = webdriver.Chrome(chrome_options=options)
driver.get("https://httpbin.org/ip")
print(driver.page_source)
(十)合住、WebElement類(lèi)
from selenium.webdriver.remote.webelement import WebElement
獲取的元素logo、input是WebElement類(lèi)的實(shí)例對(duì)象撒璧;而driver則是WebDriver類(lèi)的對(duì)象透葛,但WebDriver類(lèi)繼承了WebElement類(lèi)。所以二者有很多相同屬性卿樱!(詳情見(jiàn)源碼)
可以將driver理解為BS4的BeautifulSoup對(duì)象(根節(jié)點(diǎn))僚害;將獲取的logo、input元素理解為BS4的tag對(duì)象(節(jié)點(diǎn))繁调。
from selenium import webdriver
driver = webdriver.Chrome()
print( type(driver ) )
driver.get(url='https://www.zhihu.com/explore')
#獲取網(wǎng)站logo萨蚕。
logo = driver.find_element_by_id('zh-top-link-logo')
print('元素', logo)
print( '元素類(lèi)型', type(logo) )
print('元素屬性', logo.get_attribute('class')) #獲取元素class屬性
input = driver.find_element_by_class_name('zu-top-add-question')
print('元素文本', input.text) #獲取元素文本值
print('元素ID', input.id) #獲取元素id
print('元素標(biāo)簽名', input.tag_name) #獲取元素標(biāo)簽名
print('元素大小', input.size) #獲取元素大小
driver.save_screenshot('知乎.png') #截屏
driver.close() #關(guān)閉當(dāng)前頁(yè)面
driver.quit() #關(guān)閉瀏覽器
注意:雖然通過(guò)driver對(duì)象也可以解析HTML文檔,獲取信息蹄胰,但是不建議這樣做岳遥,效率低;使用driver對(duì)象獲取整個(gè)網(wǎng)頁(yè)的HTML代碼烤送,再使用lxml庫(kù)+xpath進(jìn)行解析寒随,效率高。
(十一)帮坚、Chrome的Headless模式(無(wú)界面模式)
Selenium運(yùn)行時(shí)妻往,必須要啟動(dòng)瀏覽器,瀏覽器的啟動(dòng)與關(guān)閉必然會(huì)影響執(zhí)行效率试和,而Chrome-headless 模式則可以不打開(kāi)瀏覽器UI界面的情況下使用 Chrome 瀏覽器讯泣。
代碼示例:
from selenium import webdriver
# 設(shè)置瀏覽器選項(xiàng)
options= webdriver.ChromeOptions()
# 把chrome設(shè)置成無(wú)界面模式
options.add_argument('--headless')
driver = webdriver.Chrome(chrome_options=options)
driver.get('https://baidu.com/')
driver.save_screenshot('baidu.png') #截屏
(十二)、操作瀏覽器的前進(jìn)與后退
代碼示例:
import time
from selenium import webdriver
browser = webdriver.Chrome()
browser.get('https://www.baidu.com/')
time.sleep(1)
browser.get('https://www.taobao.com/')
time.sleep(1)
browser.back() #后退
time.sleep(1)
browser.forward() #前進(jìn)
browser.close()
(十三)阅悍、selenium的異常處理
常用異常:
TimeoutException:超時(shí)
NoSuchElementException:找不到元素
NoSuchAttributeException:元素的屬性找不到
NoSuchFrameException:要切換的子網(wǎng)頁(yè)不存在
NoSuchWindowException:要切換的窗口不存在
WebDriverException:WebDriver異常的基類(lèi)
代碼示例:
from selenium import webdriver
from selenium.common.exceptions import TimeoutException #超時(shí)異常
from selenium.common.exceptions import 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()
參考文獻(xiàn):
Selenium官方文檔
Selenium用法詳解
Selenium 配置代理
Chrome的headless模式
selenium的常見(jiàn)異常