日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

第14讲:Selenium 的基本使用

發(fā)布時間:2024/4/11 编程问答 52 豆豆
生活随笔 收集整理的這篇文章主要介紹了 第14讲:Selenium 的基本使用 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

上個課時我們講解了 Ajax 的分析方法,利用 Ajax 接口我們可以非常方便地完成數(shù)據(jù)的爬取。只要我們能找到 Ajax 接口的規(guī)律,就可以通過某些參數(shù)構(gòu)造出對應(yīng)的的請求,數(shù)據(jù)自然就能被輕松爬取到。

但是,在很多情況下,Ajax 請求的接口通常會包含加密的參數(shù),如 token、sign 等,如:https://dynamic2.scrape.cuiqingcai.com/,它的 Ajax 接口是包含一個 token 參數(shù)的,如圖所示。

由于接口的請求加上了 token 參數(shù),如果不深入分析并找到 token 的構(gòu)造邏輯,我們是難以直接模擬這些 Ajax 請求的。

此時解決方法通常有兩種,一種是深挖其中的邏輯,把其中 token 的構(gòu)造邏輯完全找出來,再用 Python 復(fù)現(xiàn),構(gòu)造 Ajax 請求;另外一種方法就是直接通過模擬瀏覽器的方式,繞過這個過程。因為在瀏覽器里面我們是可以看到這個數(shù)據(jù)的,如果能直接把看到的數(shù)據(jù)爬取下來,當(dāng)然也就能獲取對應(yīng)的信息了。

由于第 1 種方法難度較高,在這里我們就先介紹第 2 種方法,模擬瀏覽器爬取。

這里使用的工具為 Selenium,我們先來了解一下 Selenium 的基本使用方法吧。

Selenium 是一個自動化測試工具,利用它可以驅(qū)動瀏覽器執(zhí)行特定的動作,如點(diǎn)擊、下拉等操作,同時還可以獲取瀏覽器當(dāng)前呈現(xiàn)的頁面源代碼,做到可見即可爬。對于一些使用 JavaScript 動態(tài)渲染的頁面來說,此種抓取方式非常有效。本課時就讓我們來感受一下它的強(qiáng)大之處吧。

準(zhǔn)備工作

本課時以 Chrome 為例來講解 Selenium 的用法。在開始之前,請確保已經(jīng)正確安裝好了 Chrome 瀏覽器并配置好了 ChromeDriver。另外,還需要正確安裝好 Python 的 Selenium 庫。

安裝過程可以參考:https://cuiqingcai.com/5135.html 和 https://cuiqingcai.com/5141.html。

基本使用

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

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)行代碼后會自動彈出一個 Chrome 瀏覽器,瀏覽器會跳轉(zhuǎn)到百度,然后在搜索框中輸入 Python,接著跳轉(zhuǎn)到搜索結(jié)果頁,如圖所示。

此時在控制臺的輸出結(jié)果如下:

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%2BC Q&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>

源代碼過長,在此省略。可以看到,當(dāng)前我們得到的 URL、Cookies 和源代碼都是瀏覽器中的真實(shí)內(nèi)容。

所以說,如果用 Selenium 來驅(qū)動瀏覽器加載網(wǎng)頁的話,就可以直接拿到 JavaScript 渲染的結(jié)果了,不用擔(dān)心使用的是什么加密系統(tǒng)。

下面來詳細(xì)了解一下 Selenium 的用法。

聲明瀏覽器對象

Selenium 支持非常多的瀏覽器,如 Chrome、Firefox、Edge 等,還有 Android、BlackBerry 等手機(jī)端的瀏覽器。

此外,我們可以用如下方式進(jìn)行初始化:

from selenium import webdriver browser = webdriver.Chrome() browser = webdriver.Firefox() browser = webdriver.Edge() browser = webdriver.Safari()

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

訪問頁面

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

from selenium import webdriver browser = webdriver.Chrome() browser.get('https://www.taobao.com') print(browser.page_source) browser.close()

運(yùn)行后會彈出 Chrome 瀏覽器并且自動訪問淘寶,然后控制臺會輸出淘寶頁面的源代碼,隨后瀏覽器關(guān)閉。

通過這幾行簡單的代碼,我們就可以驅(qū)動瀏覽器并獲取網(wǎng)頁源碼,非常便捷。

查找節(jié)點(diǎn)

Selenium 可以驅(qū)動瀏覽器完成各種操作,比如填充表單、模擬點(diǎn)擊等。舉個例子,當(dāng)我們想要完成向某個輸入框輸入文字的操作時,首先需要知道這個輸入框在哪,而 Selenium 提供了一系列查找節(jié)點(diǎn)的方法,我們可以用這些方法來獲取想要的節(jié)點(diǎn),以便執(zhí)行下一步動作或者提取信息。

單個節(jié)點(diǎn)

當(dāng)我們想要從淘寶頁面中提取搜索框這個節(jié)點(diǎn),首先要觀察它的源代碼,如圖所示。

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

我們用代碼實(shí)現(xiàn)一下:

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 種方式獲取輸入框,分別是根據(jù) id、CSS 選擇器和 XPath 獲取,它們返回的結(jié)果完全一致。運(yùn)行結(jié)果如下:

<selenium.webdriver.remote.webelement.WebElement (session="5e53d9e1c8646e44c14c1c2880d424af",element="0.5649563096161541-1")><selenium.webdriver.remote.webelement.WebElement (session="5e53d9e1c8646e44c14c1c2880d424af", element="0.5649563096161541-1")><selenium.webdriver.remote.webelement.WebElement (session="5e53d9e1c8646e44c14c1c2880d424af", element="0.5649563096161541-1")>

可以看到,這 3 個節(jié)點(diǎn)的類型是一致的,都是 WebElement。

這里列出所有獲取單個節(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 這個通用方法,它需要傳入兩個參數(shù):查找方式 By 和值。實(shí)際上,find_element 就是 find_element_by_id 這種方法的通用函數(shù)版本,比如 find_element_by_id(id) 就等價于 find_element(By.ID, id),二者得到的結(jié)果完全一致。我們用代碼實(shí)現(xiàn)一下:

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()

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

多個節(jié)點(diǎn)

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

舉個例子,假如你要查找淘寶左側(cè)導(dǎo)航條的所有條目,就可以這樣來實(shí)現(xiàn):

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()

運(yùn)行結(jié)果如下:

[<selenium.webdriver.remote.webelement.WebElement (session="c26290835d4457ebf7d96bfab3740d19", element="0.09221044033125603-1")>,<selenium.webdriver.remote.webelement.WebElement (session="c26290835d4457ebf7d96bfab3740d19", element="0.09221044033125603-2")>,<selenium.webdriver.remote.webelement.WebElement (session="c26290835d4457ebf7d96bfab3740d19", element="0.09221044033125603-3")>...<selenium.webdriver.remote.webelement.WebElement (session="c26290835d4457ebf7d96bfab3740d19", element="0.09221044033125603-16")>]

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

可以看到,得到的內(nèi)容變成了列表類型,列表中的每個節(jié)點(diǎn)都是 WebElement 類型。

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

這里列出所有獲取多個節(jié)點(diǎn)的方法:

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

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

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

結(jié)果是完全一致的。

節(jié)點(diǎn)交互

Selenium 可以驅(qū)動瀏覽器來執(zhí)行一些操作,或者說可以讓瀏覽器模擬執(zhí)行一些動作。比較常見的用法有:輸入文字時用 send_keys 方法,清空文字時用 clear 方法,點(diǎn)擊按鈕時用 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ū)動瀏覽器打開淘寶,用 find_element_by_id 方法獲取輸入框,然后用 send_keys 方法輸入 iPhone 文字,等待一秒后用 clear 方法清空輸入框,接著再次調(diào)用 send_keys 方法輸入 iPad 文字,之后再用 find_element_by_class_name 方法獲取搜索按鈕,最后調(diào)用 click 方法完成搜索動作。

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

動作鏈

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

比如,現(xiàn)在我要實(shí)現(xiàn)一個節(jié)點(diǎn)的拖拽操作,將某個節(jié)點(diǎn)從一處拖拽到另外一處,可以這樣實(shí)現(xiàn):

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()

首先,打開網(wǎng)頁中的一個拖拽實(shí)例,依次選中要拖拽的節(jié)點(diǎn)和拖拽到的目標(biāo)節(jié)點(diǎn),接著聲明 ActionChains 對象并將其賦值為 actions 變量,然后通過調(diào)用 actions 變量的 drag_and_drop 方法,再調(diào)用 perform 方法執(zhí)行動作,此時就完成了拖拽操作,如圖所示:
拖拽前頁面
拖拽后頁面
以上兩圖分別為在拖拽前和拖拽后的結(jié)果。

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

執(zhí)行 JavaScript

Selenium API 并沒有提供實(shí)現(xiàn)某些操作的方法,比如,下拉進(jìn)度條。但它可以直接模擬運(yùn)行 JavaScript,此時使用 execute_script 方法即可實(shí)現(xiàn),代碼如下:

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 方法將進(jìn)度條下拉到最底部,然后彈出 alert 提示框。

有了這個方法,基本上 API 沒有提供的所有功能都可以用執(zhí)行 JavaScript 的方式來實(shí)現(xiàn)了。

獲取節(jié)點(diǎn)信息

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

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

接下來,我們就來看看可以通過怎樣的方式來獲取節(jié)點(diǎn)信息吧。

獲取屬性

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

from selenium import webdriver browser = webdriver.Chrome() url = 'https://dynamic2.scrape.cuiqingcai.com/' browser.get(url) logo = browser.find_element_by_class_name('logo-image') print(logo) print(logo.get_attribute('src'))

運(yùn)行之后,程序便會驅(qū)動瀏覽器打開該頁面,然后獲取 class 為 logo-image 的節(jié)點(diǎn),最后打印出它的 src 屬性。

控制臺的輸出結(jié)果如下:

<selenium.webdriver.remote.webelement.WebElement (session="7f4745d35a104759239b53f68a6f27d0", element="cd7c72b4-4920-47ed-91c5-ea06601dc509")> https://dynamic2.scrape .cuiqingcai.com/img/logo.a508a8f0.png

通過 get_attribute 方法,我們只需要傳入想要獲取的屬性名,就可以得到它的值了。

獲取文本值

每個 WebElement 節(jié)點(diǎn)都有 text 屬性,直接調(diào)用這個屬性就可以得到節(jié)點(diǎn)內(nèi)部的文本信息,這相當(dāng)于 pyquery 的 text 方法,示例如下:

from selenium import webdriver browser = webdriver.Chrome() url = 'https://dynamic2.scrape.cuiqingcai.com/' browser.get(url) input = browser.find_element_by_class_name('logo-title') print(input.text)

這里依然先打開頁面,然后獲取 class 為 logo-title 這個節(jié)點(diǎn),再將其文本值打印出來。

控制臺的輸出結(jié)果如下:

Scrape

獲取 ID、位置、標(biāo)簽名、大小

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

from selenium import webdriver browser = webdriver.Chrome() url = 'https://dynamic2.scrape.cuiqingcai.com/' browser.get(url) input = browser.find_element_by_class_name('logo-title') print(input.id) print(input.location) print(input.tag_name) print(input.size)

這里首先獲得 class 為 logo-title 這個節(jié)點(diǎn),然后調(diào)用其 id、location、tag_name、size 屬性來獲取對應(yīng)的屬性值。

切換 Frame

我們知道網(wǎng)頁中有一種節(jié)點(diǎn)叫作 iframe,也就是子 Frame,相當(dāng)于頁面的子頁面,它的結(jié)構(gòu)和外部網(wǎng)頁的結(jié)構(gòu)完全一致。Selenium 打開頁面后,默認(rèn)是在父級 Frame 里面操作,而此時如果頁面中還有子 Frame,Selenium 是不能獲取到子 Frame 里面的節(jié)點(diǎn)的。這時就需要使用 switch_to.frame 方法來切換 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)

控制臺輸出:

NO LOGO <selenium.webdriver.remote.webelement.WebElement (session="4bb8ac03ced4ecbdefef03ffdc0e4ccd", element="0.13792611320464965-2")> RUNOOB.COM

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

所以,當(dāng)頁面中包含子 Frame 時,如果想獲取子 Frame 中的節(jié)點(diǎn),需要先調(diào)用 switch_to.frame 方法切換到對應(yīng)的 Frame,然后再進(jìn)行操作。

延時等待

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

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

隱式等待

當(dāng)使用隱式等待執(zhí)行測試的時候,如果 Selenium 沒有在 DOM 中找到節(jié)點(diǎn),將繼續(xù)等待,超出設(shè)定時間后,則拋出找不到節(jié)點(diǎn)的異常。換句話說,隱式等待可以在我們查找節(jié)點(diǎn)而節(jié)點(diǎn)并沒有立即出現(xiàn)的時候,等待一段時間再查找 DOM,默認(rèn)的時間是 0。示例如下:

from selenium import webdriver browser = webdriver.Chrome() browser.implicitly_wait(10) browser.get('https://dynamic2. scrape.cuiqingcai.com/') input = browser.find_element_by_class_name('logo-image') print(input)

在這里我們用 implicitly_wait 方法實(shí)現(xiàn)了隱式等待。

顯式等待

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

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

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 這個對象,指定最長等待時間,然后調(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)(即搜索框)成功加載出來,就返回該節(jié)點(diǎn);如果超過 10 秒還沒有加載出來,就拋出異常。

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

現(xiàn)在我們運(yùn)行代碼,它在網(wǎng)速較佳的情況下是可以成功加載出來的。

控制臺的輸出如下:

<selenium.webdriver.remote.webelement.WebElement (session="07dd2fbc2d5b1ce40e82b9754aba8fa8", element="0.5642646294074107-1")> <selenium.webdriver.remote.webelement.WebElement (session="07dd2fbc2d5b1ce40e82b9754aba8fa8", element="0.5642646294074107-2")>

可以看到,控制臺成功輸出了兩個節(jié)點(diǎn),它們都是 WebElement 類型。

如果網(wǎng)絡(luò)有問題,10 秒內(nèi)沒有成功加載,那就拋出 TimeoutException 異常,此時控制臺的輸出如下:

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')))

關(guān)于等待條件,其實(shí)還有很多,比如判斷標(biāo)題內(nèi)容,判斷某個節(jié)點(diǎn)內(nèi)是否出現(xiàn)了某文字等。下表我列出了所有的等待條件。


更多詳細(xì)的等待條件的參數(shù)及用法介紹可以參考官方文檔:http://selenium-python.readthedocs.io/api.html#module-selenium.webdriver.support.expected_conditions。

前進(jìn)后退

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

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()

這里我們連續(xù)訪問 3 個頁面,然后調(diào)用 back 方法回到第 2 個頁面,接下來再調(diào)用 forward 方法又可以前進(jìn)到第 3 個頁面

Cookies

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

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())

首先,我們訪問知乎,加載完成后,瀏覽器實(shí)際上已經(jīng)生成 Cookies 了。接著,調(diào)用 get_cookies 方法獲取所有的 Cookies。然后,我們再添加一個 Cookie,這里傳入一個字典,有 name、domain 和 value 等內(nèi)容。接下來,再次獲取所有的 Cookies,可以發(fā)現(xiàn),結(jié)果會多出這一項新加的 Cookie。最后,調(diào)用 delete_all_cookies 方法刪除所有的 Cookies。再重新獲取,發(fā)現(xiàn)結(jié)果就為空了。

控制臺的輸出如下:

[{'secure': False, 'value': '"NGM0ZTM5NDAwMWEyNDQwNDk5ODlkZWY3OTkxY2I0NDY=|1491604091|236e34290a6f407bfbb517888849ea509ac366d0"', '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|236e34290a6f407bfbb517888849ea509ac366d0"', 'domain': '.zhihu.com', 'path':'/', 'httpOnly': False, 'name': 'l_cap_id', 'expiry': 1494196091.403418}, ...] []

通過以上方法來操作 Cookies 還是非常方便的。

選項卡管理

在訪問網(wǎng)頁的時候,我們通常會開啟多個選項卡。在 Selenium 中,我們也可以對選項卡進(jìn)行操作。示例如下:

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'

控制臺輸出如下:

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

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

異常處理

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

首先,演示一下節(jié)點(diǎn)未找到的異常,示例如下:

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

這里我們首先打開百度頁面,然后嘗試選擇一個并不存在的節(jié)點(diǎn),此時就會遇到異常。

運(yùn)行之后控制臺的輸出如下:

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

可以看到,這里拋出了 NoSuchElementException 異常,通常代表節(jié)點(diǎn)未找到。為了防止程序遇到異常而中斷,我們需要捕獲這些異常,示例如下:

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 查找節(jié)點(diǎn)的方法捕獲 NoSuchElementException 異常,這樣一旦出現(xiàn)這樣的錯誤,就進(jìn)行異常處理,程序也不會中斷了。

控制臺的輸出如下:

No Element

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

反屏蔽

現(xiàn)在很多網(wǎng)站都加上了對 Selenium 的檢測,來防止一些爬蟲的惡意爬取。即如果檢測到有人在使用 Selenium 打開瀏覽器,那就直接屏蔽。

其大多數(shù)情況下,檢測基本原理是檢測當(dāng)前瀏覽器窗口下的 window.navigator 對象是否包含 webdriver 這個屬性。因為在正常使用瀏覽器的情況下,這個屬性是 undefined,然而一旦我們使用了 Selenium,Selenium 會給 window.navigator 設(shè)置 webdriver 屬性。很多網(wǎng)站就通過 JavaScript 判斷如果 webdriver 屬性存在,那就直接屏蔽。

這邊有一個典型的案例網(wǎng)站:https://antispider1.scrape.cuiqingcai.com/,這個網(wǎng)站就是使用了上述原理實(shí)現(xiàn)了 WebDriver 的檢測,如果使用 Selenium 直接爬取的話,那就會返回如下頁面:

這時候我們可能想到直接使用 JavaScript 直接把這個 webdriver 屬性置空,比如通過調(diào)用 execute_script 方法來執(zhí)行如下代碼:

Object.defineProperty(navigator, "webdriver", {get: () => undefined})

這行 JavaScript 的確是可以把 webdriver 屬性置空,但是 execute_script 調(diào)用這行 JavaScript 語句實(shí)際上是在頁面加載完畢之后才執(zhí)行的,執(zhí)行太晚了,網(wǎng)站早在最初頁面渲染之前就已經(jīng)對 webdriver 屬性進(jìn)行了檢測,所以用上述方法并不能達(dá)到效果。

在 Selenium 中,我們可以使用 CDP(即 Chrome Devtools-Protocol,Chrome 開發(fā)工具協(xié)議)來解決這個問題,通過 CDP 我們可以實(shí)現(xiàn)在每個頁面剛加載的時候執(zhí)行 JavaScript 代碼,執(zhí)行的 CDP 方法叫作 Page.addScriptToEvaluateOnNewDocument,然后傳入上文的 JavaScript 代碼即可,這樣我們就可以在每次頁面加載之前將 webdriver 屬性置空了。另外我們還可以加入幾個選項來隱藏 WebDriver 提示條和自動化擴(kuò)展信息,代碼實(shí)現(xiàn)如下:

from selenium import webdriver from selenium.webdriver import ChromeOptionsoption = ChromeOptions() option.add_experimental_option('excludeSwitches', ['enable-automation']) option.add_experimental_option('useAutomationExtension', False) browser = webdriver.Chrome(options=option) browser.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument', {'source': 'Object.defineProperty(navigator, "webdriver", {get: () => undefined})' }) browser.get('https://antispider1.scrape.cuiqingcai.com/')

這樣整個頁面就能被加載出來了:

對于大多數(shù)的情況,以上的方法均可以實(shí)現(xiàn) Selenium 反屏蔽。但對于一些特殊的網(wǎng)站,如果其有更多的 WebDriver 特征檢測,可能需要具體排查。

無頭模式

上面的案例在運(yùn)行的時候,我們可以觀察到其總會彈出一個瀏覽器窗口,雖然有助于觀察頁面爬取狀況,但在有些時候窗口彈來彈去也會形成一些干擾。

Chrome 瀏覽器從 60 版本已經(jīng)支持了無頭模式,即 Headless。無頭模式在運(yùn)行的時候不會再彈出瀏覽器窗口,減少了干擾,而且它減少了一些資源的加載,如圖片等資源,所以也在一定程度上節(jié)省了資源加載時間和網(wǎng)絡(luò)帶寬。

我們可以借助于 ChromeOptions 來開啟 Chrome Headless 模式,代碼實(shí)現(xiàn)如下:

from selenium import webdriver from selenium.webdriver import ChromeOptionsoption = ChromeOptions() option.add_argument('--headless') browser = webdriver.Chrome(options=option) browser.set_window_size(1366, 768) browser.get('https://www.baidu.com') browser.get_screenshot_as_file('preview.png')

這里我們通過 ChromeOptions 的 add_argument 方法添加了一個參數(shù) --headless,開啟了無頭模式。在無頭模式下,我們最好需要設(shè)置下窗口的大小,接著打開頁面,最后我們調(diào)用 get_screenshot_as_file 方法輸出了頁面的截圖。

運(yùn)行代碼之后,我們發(fā)現(xiàn) Chrome 窗口就不會再彈出來了,代碼依然正常運(yùn)行,最后輸出了頁面截圖如圖所示。

這樣我們就在無頭模式下完成了頁面的抓取和截圖操作。

現(xiàn)在,我們基本對 Selenium 的常規(guī)用法有了大體的了解。使用 Selenium,處理 JavaScript 渲染的頁面不再是難事。

本節(jié)代碼:https://github.com/Python3WebSpider/SeleniumTest

總結(jié)

以上是生活随笔為你收集整理的第14讲:Selenium 的基本使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

午夜私人影院 | 精品久久91 | 色中射| 亚洲人成在线电影 | 狠狠狠狠干 | 91av视频| 91av视频免费观看 | 久久在线精品视频 | 国产精品少妇 | 精品亚洲免费 | av在线一 | 欧美激情第十页 | 在线观看亚洲视频 | 国产精品久久久久久久久久久免费看 | 久久69av| 97在线视频免费播放 | 超级碰视频 | 日韩电影在线观看中文字幕 | 日韩久久久久久久久久久久 | 日韩网站免费观看 | 夜夜骑首页 | 五月激情片 | 国产123区在线观看 国产精品麻豆91 | 国产精品成人自拍 | 黄色成人91| 国产精品女人久久久 | 天天鲁天天干天天射 | 天天干人人插 | 久久国内精品视频 | 久草电影网 | av电影一区 | 高清久久久久久 | 日韩免费在线网站 | 在线观看免费一区 | 欧美韩国日本在线观看 | 女人18毛片a级毛片一区二区 | 美女在线黄 | 婷婷新五月 | 在线亚洲激情 | 天堂在线视频免费观看 | 国产一区在线视频 | 91大神电影| 国产专区日韩专区 | 色诱亚洲精品久久久久久 | 探花在线观看 | 国产在线小视频 | 在线免费黄色av | 精品国产一区二区三区免费 | 日韩精品中文字幕有码 | 成年人三级网站 | 日韩av三区| 午夜视频在线观看一区 | 国产粉嫩在线观看 | 欧美不卡视频在线 | 四虎在线观看精品视频 | 色吊丝在线永久观看最新版本 | 91精品视频在线播放 | 久久 国产一区 | 岛国av在线免费 | 久久观看最新视频 | 亚洲成av人片在线观看无 | 在线影视 一区 二区 三区 | 91视频免费看 | 久久久久久久影院 | 久草在线99| 97视频免费看 | 97自拍超碰 | 在线免费视频一区 | 免费一级特黄录像 | 久久精品国产精品亚洲 | 9999国产精品| 奇米影视999 | 中文字幕精品一区二区精品 | 天天色天天操天天爽 | 97国产精品视频 | 91在线免费观看网站 | 黄网站色成年免费观看 | 国产高清亚洲 | 在线不卡视频 | 干干操操| 伊人天堂av | 成人在线播放视频 | 欧美精品久久久久久久亚洲调教 | 亚洲精品国产精品99久久 | av中文字幕在线播放 | 国产精品永久免费 | 国产福利资源 | 天天操天天操天天操 | 日韩精品免费一区 | 在线亚洲午夜片av大片 | 中文av影院 | 亚洲一区二区视频在线 | 免费观看黄 | 成人黄色毛片视频 | 91精彩视频在线观看 | 国产青春久久久国产毛片 | 欧美日韩免费观看一区=区三区 | 欧美婷婷色 | 一区二区三区在线观看免费视频 | 亚洲专区在线播放 | 久久综合福利 | 中文字幕在线观看视频一区二区三区 | 午夜99| 色婷婷久久一区二区 | 亚洲成av人片一区二区梦乃 | 亚洲尺码电影av久久 | 欧美成人黄 | a午夜在线 | 婷婷六月网| 免费欧美| 久久精品国产精品亚洲精品 | 在线观看韩日电影免费 | 婷婷激情五月 | 精品高清美女精品国产区 | 久久久久久久久久久影视 | 少妇搡bbbb搡bbb搡忠贞 | 狠狠操天天射 | 久久久国产日韩 | 亚洲国产中文字幕在线观看 | 免费看av在线 | 一区二区国产精品 | 色av色av色av| 国产精品免费视频网站 | 国产精品久久久久久久久久免费看 | 久久热亚洲 | 欧美无极色 | 国产亚洲字幕 | 国产精品视频免费 | 99精品在线观看 | 精品国产区 | 天天操天天摸天天爽 | 性色av免费在线观看 | 亚洲综合小说电影qvod | 在线久热 | 特级西西www44高清大胆图片 | 特级免费毛片 | 亚洲黄色在线观看 | 免费av免费观看 | 欧美日韩有码 | 久久婷五月 | 激情网五月天 | 国产黄色片久久久 | 天堂av在线中文在线 | 婷婷久久五月 | 一级黄色片在线观看 | 免费日韩视 | 日韩理论在线播放 | 99久久精品无码一区二区毛片 | 亚洲激情综合网 | 国产精品久久久毛片 | 欧美色婷 | 久久久久久在线观看 | 免费色视频在线 | 午夜性生活 | 久久免费中文视频 | 日本精品在线视频 | 天天曰夜夜爽 | 国产精品毛片一区二区三区 | 久久国产视频网 | 九草视频在线 | 97免费视频在线播放 | 欧美少妇xxx| 日日夜夜免费精品 | 欧美一区二区三区特黄 | 97久久久免费福利网址 | 天天av在线播放 | 99久久久免费视频 | 国产.精品.日韩.另类.中文.在线.播放 | 成人免费观看视频大全 | 欧美乱码精品一区二区 | 人人澡人人爽欧一区 | 免费日韩一级片 | 亚洲国产精品成人综合 | 久久久久久免费毛片精品 | 五月婷婷丁香激情 | 国产一级91 | 中文字幕在线观看第三页 | 在线免费亚洲 | 中文字幕在线观看一区二区 | 日韩在线二区 | 久久99国产综合精品免费 | 日韩免费网址 | 精品一区二区av | av五月婷婷 | 久久 地址 | 亚洲国产一区在线观看 | 中文字幕在线观看av | 一区二区三区免费网站 | 亚洲精品在线观看免费 | 亚洲精品国产精品99久久 | 奇米四色影狠狠爱7777 | 黄色av一级| 伊人网综合在线观看 | 日本久久不卡视频 | 天天干天天操 | 日韩亚洲欧美中文字幕 | 高清不卡一区二区三区 | 色www. | 久久免费在线观看视频 | 精品久久久久_ | 国产小视频精品 | 国产高清av | 黄色精品久久 | 一区二区三区不卡在线 | av成人动漫 | 91精品国产欧美一区二区成人 | 中文字幕久久网 | 美女黄频视频大全 | 中文字幕 在线看 | 久久成熟 | 久草在线电影网 | 国产白浆视频 | 国产精品久久一 | 国产中文字幕视频在线观看 | 免费人成网ww44kk44 | 深爱五月激情网 | av在线电影播放 | 欧美亚洲国产日韩 | 国产成人a亚洲精品 | 狠狠色丁香婷婷综合久小说久 | 免费日韩一级片 | 久久美女视频 | 青草视频在线播放 | 揉bbb玩bbb少妇bbb | 天天天天天天天天操 | 亚洲精品乱码久久久久 | 日韩精品中文字幕在线不卡尤物 | 91av视频在线观看 | 欧美色图p | 在线观看视频一区二区三区 | 天天干天天操天天入 | 婷婷激情av | 久久经典国产视频 | 日韩视频一区二区在线观看 | 超碰人人超 | 五月婷婷操 | 精品一区二区在线免费观看 | 最近中文字幕免费大全 | a黄色| 国内三级在线观看 | 久久国产免费看 | 国产午夜一区 | 97视频在线观看网址 | 九九视频在线观看视频6 | 日日日爽爽爽 | 美女免费视频一区二区 | 国产一区二区影院 | 免费一级片观看 | 婷婷激情五月综合 | 黄色电影网站在线观看 | 亚洲精选在线观看 | 综合网天天射 | 偷拍精偷拍精品欧洲亚洲网站 | 久久久久久久久久免费视频 | 日韩精品一区二区在线观看视频 | 久久高清免费观看 | 狠狠干成人综合网 | 国产成人av在线影院 | 久久久久免费精品国产 | 国产色资源 | 国产精品2020 | 日日摸日日添夜夜爽97 | 一区二区久久 | av久久在线 | 成人av一二三区 | 国产一区二区不卡在线 | 国产精品久久久免费 | 香蕉视频日本 | 97天天干| 国产精品久久久久久久久久久久午夜片 | 青青草国产精品视频 | 国产原创中文在线 | 91成人精品一区在线播放69 | 欧美日韩免费在线视频 | 一区二区三区高清 | 亚洲激情校园春色 | 日韩欧美电影 | 国产码电影| 久久亚洲婷婷 | 香蕉视频最新网址 | 成人免费视频网站在线观看 | 亚洲精品乱码久久久久久蜜桃不爽 | 久久伊人免费视频 | 日本性高潮视频 | 综合国产在线观看 | 亚洲精品激情 | 亚洲资源一区 | 91丨九色丨蝌蚪丨老版 | 天天爽人人爽夜夜爽 | 色综合久久中文字幕综合网 | 91av官网 | 伊人宗合| 中文字幕在线影院 | 免费观看一区二区三区视频 | 中文字幕免费不卡视频 | 六月色丁 | 亚洲最大av | 婷婷精品国产欧美精品亚洲人人爽 | 天堂av网站 | 国产精品久久久久久久7电影 | 久艹视频在线观看 | 成人午夜网 | 色婷婷婷 | www.亚洲精品 | 亚洲色综合 | 久久久免费看片 | 久久污视频 | 91视频一8mav| 中文字幕一区二区三区精华液 | 国产99久久久国产精品免费看 | 免费毛片一区二区三区久久久 | 九九99靖品 | 99久久久久成人国产免费 | 在线观看国产www | 精品一区二区久久久久久久网站 | 九九热99视频| 午夜视频久久久 | 日日夜精品 | 伊人久久精品久久亚洲一区 | 9i看片成人免费看片 | 91av免费看| 免费一级特黄毛大片 | 国产精品美女久久久久久久 | 天天色天天干天天色 | 国产成人一区二区三区在线观看 | 成人免费视频视频在线观看 免费 | 免费在线一区二区三区 | 中文字幕视频播放 | 久久免费高清视频 | 久久久麻豆视频 | 久久高清免费 | 久久综合久久综合九色 | 一区精品久久 | 亚洲乱码久久久 | 香蕉精品视频在线观看 | 美女av免费看 | 在线观看黄网 | 中文在线免费视频 | 天天干夜夜夜操天 | 午夜精品婷婷 | 久久伊人免费视频 | 亚洲成人在线免费 | 久久久三级视频 | 国产高清不卡一区二区三区 | 久久一级片 | 日本少妇高清做爰视频 | 成人免费观看完整版电影 | 天堂av在线7 | 国产剧情在线一区 | 久久久久久黄 | 九九久久国产 | 丁香在线观看完整电影视频 | 一区二区三区在线电影 | 久久免费视频这里只有精品 | 人人看人人做人人澡 | 日本视频高清 | 99在线看 | 亚洲爱爱视频 | 干综合网| 一级黄色片在线 | 亚洲精品456在线播放第一页 | 国产亚洲欧洲 | 国产精品毛片久久蜜 | www.69xx| 欧美色图亚洲图片 | 西西444www大胆无视频 | 亚洲国产999 | 国产精品女教师 | 国产在线高清 | 超碰国产97 | 天天搞天天干 | 中文在线天堂资源 | 亚洲精品国产精品国自产观看浪潮 | 成年人毛片在线观看 | 色综合久久久久综合体 | 91女神的呻吟细腰翘臀美女 | 狠狠色丁香婷婷 | 97成人啪啪网 | 欧美日韩一区二区三区在线观看视频 | 深爱激情五月婷婷 | 欧美成年黄网站色视频 | 91在线91| 大胆欧美gogo免费视频一二区 | 国产精品毛片久久蜜 | 精品主播网红福利资源观看 | 国产成人一区三区 | 成人在线免费观看视视频 | 成人国产精品久久久 | 又紧又大又爽精品一区二区 | 欧美极品一区二区三区 | 亚洲激情在线播放 | 国产在线观看免费av | 亚洲91在线 | 久久精品99国产精品亚洲最刺激 | 国产精品久久久久久久久久久久午夜 | 在线观看久久 | 一区二区三区播放 | 国产精品久久久久久久久久直播 | 国产亚洲精品久久19p | 亚洲va在线va天堂va偷拍 | 美女网站在线 | 亚洲精品在线观看的 | 四虎成人精品永久免费av | 亚洲精品乱码久久久久久蜜桃不爽 | av观看网站| 精品国产午夜 | av免费网站观看 | 不卡电影免费在线播放一区 | 能在线观看的日韩av | 香蕉久久久久久久 | 在线观看成人福利 | 深夜福利视频在线观看 | 丝袜足交在线 | 久久影院亚洲 | 亚洲精品在线一区二区三区 | 亚洲午夜久久久影院 | 久久成人国产精品免费软件 | 亚洲欧美日本一区二区三区 | 欧美激情精品久久久久久免费印度 | 激情五月综合网 | 在线免费观看的av网站 | 又黄又爽又色无遮挡免费 | 国产日韩欧美自拍 | 精品视频在线免费观看 | 久久久久成人精品免费播放动漫 | 日本在线观看中文字幕无线观看 | 久久久久成人精品免费播放动漫 | 亚洲精品乱码久久久久v最新版 | 日日夜夜天天久久 | 4438全国亚洲精品观看视频 | 国产不卡在线播放 | 探花视频在线观看免费 | 欧美日韩伦理在线 | 国产又粗又长又硬免费视频 | 午夜丁香视频在线观看 | 色婷婷狠狠干 | 久久免费看 | www视频免费在线观看 | 欧美大jb| 99久视频 | 亚洲专区欧美专区 | 在线观看国产永久免费视频 | 亚洲午夜久久久久久久久久久 | 免费av观看| 97福利视频 | 久久久久久美女 | 国产色在线 | 日韩av看片 | 国产日韩欧美在线一区 | 99久久99久国产黄毛片 | 18做爰免费视频网站 | 色视频在线免费观看 | 激情视频91| 色99在线| 欧美一性一交一乱 | 免费观看www7722午夜电影 | 黄色午夜 | 久久久国产一区二区三区四区小说 | 视频精品一区二区三区 | 日韩欧美高清在线 | 伊人中文字幕在线 | 黄色的网站在线 | 欧美一二三区在线观看 | 激情欧美日韩一区二区 | 久久精品视频免费观看 | 99超碰在线播放 | 黄色大全在线观看 | 精品亚洲免费视频 | 亚洲国产精品推荐 | 色偷偷88888欧美精品久久 | 日韩最新在线视频 | 成人一级影视 | 亚洲激情中文 | 香蕉影院在线 | 黄色小网站在线 | 国产精品久久99综合免费观看尤物 | 免费a v网站| 亚洲激情在线观看 | 国产精品嫩草影院99网站 | 麻豆一区在线观看 | 亚洲精品h| 国产一区二区精品 | 国内一级片在线观看 | 婷婷久久网站 | 天天干天天射天天爽 | 国产在线观看,日本 | 人人爽人人爽 | 国产精品第10页 | 久久久久美女 | 婷婷久久综合网 | 亚洲影院色 | 色视频国产直接看 | 人人爽人人澡人人添人人人人 | 国产一区二区三精品久久久无广告 | 国产看片免费 | 成人资源在线播放 | 精品国产91亚洲一区二区三区www | 热久久免费视频 | 五月婷婷一区二区三区 | 黄影院| 激情欧美日韩一区二区 | 五月婷婷一区 | 国产午夜精品视频 | 激情综合婷婷 | 国产精品毛片一区二区 | 久久国产精品一区二区三区 | 五月天六月婷婷 | 在线国产一区二区 | 中文字幕在线影视资源 | 久久夜色精品国产欧美乱 | 国产韩国精品一区二区三区 | www.少妇 | 国产精品久久久久久久婷婷 | 日韩在线视频不卡 | 国产又粗又硬又爽视频 | 天天操天天干天天插 | 久久精美视频 | 欧美片一区二区三区 | 国产在线a不卡 | 国产午夜一级毛片 | 日韩a在线看 | 麻豆视频免费观看 | 69精品久久久 | 国产精品久久久久久久久久久久 | av中文在线 | 99精品一级欧美片免费播放 | 亚洲精品久久久久www | 国产麻豆视频免费观看 | 成人作爱视频 | 91视频免费国产 | 亚洲激情p | 成人免费在线看片 | 麻花豆传媒mv在线观看网站 | 偷拍精偷拍精品欧洲亚洲网站 | 色综合久久久久综合99 | 国产亚洲久一区二区 | 91九色网站 | 亚洲亚洲精品在线观看 | 国产亚洲婷婷免费 | 九九热免费精品视频 | 亚洲精品视频 | 久久99精品国产91久久来源 | 国产精品欧美久久 | 免费成人av网站 | 天天射网| 成 人 黄 色 片 在线播放 | 欧美一区在线观看视频 | 99 国产精品 | 蜜桃视频在线视频 | 日韩久久久久久久 | 99久久精品国产毛片 | 亚洲第一色 | 91成人精品 | 色鬼综合网 | 五月天久久久 | 国产精品久久网站 | 国产网红在线观看 | 亚洲国产大片 | 日韩午夜小视频 | 98精品国产自产在线观看 | 女人18精品一区二区三区 | 国产色影院 | 一级性视频 | 国产玖玖在线 | 精品国产乱子伦一区二区 | 国产午夜精品久久 | 毛片网在线观看 | 国产精品久久久久久一区二区 | 久久成人视屏 | 99精品在线视频观看 | 精久久久久 | 欧美一级特黄aaaaaa大片在线观看 | 日韩字幕 | 69国产盗摄一区二区三区五区 | 欧美中文字幕久久 | 中文在线亚洲 | 麻花传媒mv免费观看 | 天天操天天爽天天干 | 在线亚洲小视频 | 日日精品 | 午夜久久成人 | 欧美激情视频在线免费观看 | 日日夜夜天天 | 一区二区三区电影 | 亚洲精品视频在线观看免费视频 | 成av在线 | 免费看黄色小说的网站 | 亚洲天天看 | 日韩av一区二区三区 | 国产精品亚洲片夜色在线 | 国产五码一区 | 国产美女精品 | 国产精品一区二区av影院萌芽 | 91视频首页| 欧美调教网站 | 69国产盗摄一区二区三区五区 | 久久最新视频 | 欧美午夜久久久 | 久久国产女人 | 久久99久久99精品免费看小说 | 有码中文字幕在线观看 | 国产一级片播放 | 91午夜精品 | 麻豆视频在线观看 | 伊甸园永久入口www 99热 精品在线 | 亚洲精品久久久久中文字幕m男 | 黄色成人免费电影 | 国产成人精品一区在线 | 亚洲精品午夜久久久久久久久久久 | 999亚洲国产996395 | 国产精品网红直播 | 黄网站污| 久久久久久精 | 500部大龄熟乱视频使用方法 | 婷婷在线播放 | 色偷偷88欧美精品久久久 | 黄色一级网 | 最近中文字幕高清字幕在线视频 | 久久久片 | 又黄又爽免费视频 | 91免费网站在线观看 | 国产免费国产 | 97偷拍在线视频 | 一级免费看 | 综合影视 | 黄色软件在线观看视频 | 国产精品mm | 8x8x在线观看视频 | 伊人天堂网| 在线欧美最极品的av | 久久国产欧美日韩精品 | 欧美精品国产综合久久 | 亚洲人成人在线 | 久久综合五月婷婷 | 亚洲va天堂va欧美ⅴa在线 | 91污视频在线 | 2023天天干| 亚洲精品一区二区三区四区高清 | 综合久久精品 | 美女久久久久久久久久 | 国产高清不卡在线 | 天天干天天做天天操 | 国产91精品一区二区麻豆网站 | 99免费国产 | 久视频在线播放 | 久久99久久精品国产 | 国产视频一区二区三区在线 | 国产免费一区二区三区最新 | 国产精品久久久久久久久久免费看 | 91日韩在线专区 | 美女久久视频 | 国产午夜精品免费一区二区三区视频 | 欧美日韩精品国产 | 免费av的网站 | 亚洲人人爱 | 久草在线在线视频 | 九九视频在线 | 香蕉久草在线 | 成人午夜毛片 | 日本性生活免费看 | 亚洲精品综合在线观看 | 99热这里只有精品在线观看 | 4438全国亚洲精品在线观看视频 | 日本最新中文字幕 | 成人免费观看网站 | 成人性生爱a∨ | 成人av一级片 | 在线精品视频免费播放 | 99色婷婷| 操久在线| 手机看片1042 | 91男人影院| av丝袜制服| 午夜骚影 | 人人射人人爽 | 国产精品福利在线 | 91社区国产高清 | 不卡的av在线播放 | 免费在线一区二区三区 | 免费在线观看国产精品 | 免费中文字幕在线观看 | 成人在线中文字幕 | 亚洲最快最全在线视频 | 成人精品在线 | 亚洲精品国精品久久99热 | 天天射天天干天天 | 亚洲精品免费在线观看视频 | 特级片免费看 | 日日爱夜夜爱 | 亚洲午夜精品在线观看 | 亚洲成av片人久久久 | 日韩欧美极品 | 免费视频91| 玖玖爱在线观看 | 久久精品毛片基地 | 日韩欧美一区二区三区在线观看 | 欧美精品你懂的 | 天天艹天天爽 | 五月婷婷狠狠 | 在线观看中文字幕一区 | 美女视频黄在线 | 成人午夜电影网站 | 麻豆国产视频 | 国产精品精品久久久久久 | 国产精品成人国产乱 | 亚洲va综合va国产va中文 | 天天爱天天色 | 一区二区三区手机在线观看 | 精品国产精品一区二区夜夜嗨 | 涩涩网站在线看 | 久久精品国产亚洲精品 | 香蕉网在线观看 | 五月婷婷综合在线观看 | 成人av在线播放网站 | 日本精品一区二区三区在线观看 | 操操日 | 人人干人人爽 | 免费成人av在线看 | 五月婷久久 | 丝袜美女在线 | 午夜精品久久久久久久久久久久 | 日韩毛片精品 | 人人爽人人片 | av中文字幕在线观看网站 | 欧美日韩国产一二 | 欧美一级免费 | 欧美激情视频一区二区三区免费 | 国产a视频免费观看 | 久久精品网站免费观看 | 美女网站黄免费 | 欧美大香线蕉线伊人久久 | 91av网址| 91在线国产观看 | 免费观看丰满少妇做爰 | 国产精品一区二区av日韩在线 | 伊人久久婷婷 | 日韩在线视频精品 | 欧美日韩一区二区三区免费视频 | 欧美乱熟臀69xxxxxx | 亚洲 欧美 国产 va在线影院 | 日韩丝袜在线观看 | 久久久 精品 | 99视频网址 | 欧美精品中文 | 婷婷亚洲五月色综合 | 欧美激情视频在线观看免费 | 日日躁夜夜躁aaaaxxxx | 久久精品视频在线观看免费 | 麻豆国产视频下载 | 亚洲国内精品在线 | 亚洲黑丝少妇 | 色爱区综合激月婷婷 | h网站免费在线观看 | 偷拍区另类综合在线 | 成人午夜影院在线观看 | 久草在线免费在线观看 | 视频一区二区视频 | 91中文字幕在线观看 | 久久一区国产 | 日韩va在线观看 | 欧美一级高清片 | 亚洲成人软件 | 国产精品九九久久久久久久 | av日韩av | 婷婷综合在线 | 亚洲成人国产 | 在线看小早川怜子av | 久久精品亚洲一区二区三区观看模式 | 在线观看91久久久久久 | 国产黄大片 | 丝袜精品视频 | 天天射综合网站 | 国模一二三区 | 日韩av高潮 | 精品亚洲网 | 免费高清国产 | 天天干天天干天天色 | 久久高清视频免费 | av电影免费在线 | 日本激情动作片免费看 | 国产国语在线 | 日韩99热 | 日韩久久激情 | 999精品视频 | 日韩三区在线观看 | 亚洲日本一区二区在线 | 一区二区三区四区五区六区 | 久久国产精品99久久久久久丝袜 | 国产日韩欧美自拍 | 亚洲国产片色 | 麻豆传媒电影在线观看 | 国产精品久久久久一区 | 久久观看免费视频 | 91av原创| 国产精品ⅴa有声小说 | 91免费试看| 欧美精品久久天天躁 | 亚洲男女精品 | 亚州国产精品 | 欧美综合久久久 | 日本高清免费中文字幕 | www.久久色| 美女啪啪图片 | 欧美激情综合色综合啪啪五月 | 久久综合福利 | 黄污视频网站大全 | 一性一交视频 | 欧美亚洲国产日韩 | 99精品影视 | 国产 日韩 欧美 中文 在线播放 | 美女视频黄,久久 | 99r在线| 国产色婷婷 | 日本久久久精品视频 | 欧洲亚洲国产视频 | 久久久久久国产精品 | 久久视频这里只有精品 | 国产成人精品一区二区 | 天天干天天做天天爱 | 精品视频久久 | 成人久久影院 | 色噜噜狠狠色综合中国 | 色综合久久88色综合天天人守婷 | 黄色片亚洲 | 精品久久五月天 | 免费在线观看一区二区三区 | 国产成人久久av977小说 | 亚洲婷婷丁香 | 国产精品96久久久久久吹潮 | 激情自拍av | 成人免费观看完整版电影 | 色综合久久久久网 | a久久久久 | 日本视频网 | 狠狠色丁香婷婷综合久久片 | 黄色a大片 | 中文字幕在线播放av | 福利网址在线观看 | 婷婷在线免费 | 黄a网站 | 欧美日韩中文字幕在线视频 | 国产一级a毛片视频爆浆 | 亚洲精品国产高清 | 在线视频日韩一区 | 国产精品高清免费在线观看 | 国产精品日韩 | 久久婷婷精品视频 | 成年人三级网站 | 国产午夜精品一区二区三区嫩草 | 人人狠 | 久久综合色影院 | 欧美日韩中文国产一区发布 | 99在线热播精品免费 | 国产精品久久影院 | 日韩视频一二三区 | 日日夜夜国产 | 日韩在线资源 | 成人免费视频播放 | 91豆花在线观看 | 国产成人黄色 | 天天草综合网 | 蜜臀av性久久久久av蜜臀妖精 | 中文字幕在线视频一区二区三区 | 日韩免费电影一区二区 | 国产精品 国产精品 | 97在线看片 | 99免费在线播放99久久免费 | 精品特级毛片 | 五月婷婷欧美 | 亚洲国产片色 | 黄在线免费观看 | 最新超碰 | 亚洲伊人天堂 | 久久99最新地址 | 在线成人一区二区 | 精品嫩模福利一区二区蜜臀 | 欧美性性网 | 国产91免费在线观看 | 99精品视频播放 | 一区二区三区国产精品 | 国产a高清 | 欧美激情精品久久久久久免费 | 久久久久五月 | 色婷婷在线播放 | 久久99网站 | 日韩精品一卡 | 亚洲精品国产精品乱码在线观看 | 91网在线| 国产69精品久久久久9999apgf | www久草 | 黄色在线视频网址 | 最新日韩在线观看 | 国产精品av在线免费观看 | 99色资源| www.五月天色 | 四虎国产精品永久在线国在线 | 九九免费观看全部免费视频 | 成人九九视频 | 国产只有精品 | 久久黄色美女 | 国产精品欧美日韩 | 日韩av电影免费在线观看 | 久久综合久久综合九色 | 超级碰碰碰视频 | www.久久视频| 91天天操 | 亚洲黄色小说网 | 久久精品综合网 | 中文一区二区三区在线观看 | 在线观看mv的中文字幕网站 | 92av视频 | 中文字幕一区二区三区在线播放 | 欧美精品久久久久a | 日日干日日 | 午夜精品在线看 | 国产精品福利在线观看 | 久草视频免费看 | 国产伦理久久 | 在线观看电影av | 久久丁香 | 国产成人精品久久二区二区 | 午夜体验区 | 97超视频免费观看 | 国内精品久久久久久久久久清纯 | 999久久a精品合区久久久 | 国产玖玖精品视频 | 国产精品精品久久久久久 | 狠狠色伊人亚洲综合网站野外 | 91av在线免费观看 | 婷婷黄色片 | 蜜臀av夜夜澡人人爽人人桃色 | 毛片基地黄久久久久久天堂 | 日本久久久久久久久 | 午夜999| 亚洲a在线观看 | 夜夜躁日日躁狠狠久久av | 日日碰狠狠添天天爽超碰97久久 | 在线观看完整版免费 | 伊人首页| 天天干天天摸天天操 | 婷婷国产在线观看 | 久久男人视频 | 色就是色综合 | 91麻豆精品国产91久久久更新时间 | 国产人成一区二区三区影院 | 精品成人网 | 男女啪啪视屏 | 亚洲成人精品国产 | 欧美性大战久久久久 | 9999在线观看 | 成年美女黄网站色大片免费看 | 久久国产成人午夜av影院潦草 | 欧美视频网址 | 成人禁用看黄a在线 | 99精品视频一区二区 | 日本中文一级片 | 亚洲天堂网在线播放 | 欧美一级性视频 | 色综合久久久久久中文网 | 午夜电影久久久 | 国产成人性色生活片 | 亚洲电影院 | 日韩午夜网站 | zzijzzij亚洲成熟少妇 | 久久久久欠精品国产毛片国产毛生 | 久久久综合色 | 国产精品久久久久久久久岛 | 国产91在线观看 | 欧美一区二区三区免费观看 | 久久久久综合精品福利啪啪 | 二区视频在线观看 | 久草在线在线精品观看 | 欧美综合久久 | 中文字幕在线播放日韩 | 狠狠色狠狠色综合系列 | 亚洲一区二区三区精品在线观看 | 久久伦理电影网 | 成人一区在线观看 | 国产在线色站 | 日韩中文在线视频 | 国产一区在线精品 | 91中文字幕| 一区免费视频 | 婷婷精品国产欧美精品亚洲人人爽 | 高清免费在线视频 | 国产精品毛片久久久久久久 | 天天天天天干 | av成人免费 | 亚洲激情校园春色 | 日韩欧美黄色网址 | 日批视频 | 久久久久久美女 | 精品一区二区在线观看 | 97超碰国产在线 | 成人av免费看 | 黄色毛片观看 | 久草在线视频看看 | 久久这里只有精品视频99 |