Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 91精选国产91在线观看,精品女同一区二区三区在线观看 ,一区二区在线

          整合營銷服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢熱線:

          小白學(xué) Python(爬蟲框架 Scrapy 入門基

          小白學(xué) Python(爬蟲框架 Scrapy 入門基礎(chǔ)) Selector 選擇器

          我們之前有介紹過通過 pyquery 、 Beautiful Soup 、 lxml 來提取網(wǎng)頁數(shù)據(jù)。

          但是在 Scrapy 中,同樣也提供了自己獨(dú)有的數(shù)據(jù)提取方式,即 Selector(選擇器)。Selector 是基于 lxml 來構(gòu)建的,支持 XPath 選擇器、CSS 選擇器以及正則表達(dá)式,功能全面,解析速度和準(zhǔn)確度非常高。

          獨(dú)立使用

          Scrapy Selectors 是 Parsel 庫的包裝。包裝的目的是提供與 Scrapy Response 對象的更好的集成。

          Parsel 是一個獨(dú)立的 Web 抓取庫,無需 Scrapy 即可使用。它在后臺使用 lxml 庫,并在 lxml API 之上實現(xiàn)了一個簡單的 API 。這意味著 Scrapy 選擇器的速度和解析精度與 lxml 非常相似。

          我們可以寫一個簡單的示例代碼來測試一下 Selectors 的單獨(dú)使用。

          from?scrapy?import?Selector
          
          body?=?'<html><head><title>Hello?Python</title></head></html>'selector?=?Selector(text=body)
          title?=?selector.xpath('//title/text()').extract_first()print(title)

          執(zhí)行結(jié)果如下:

          Hello?Python

          這個簡單的示例我們并沒有在 Scrapy 框架中執(zhí)行,而是把 Scrapy 中的 Selector 單獨(dú)拿出來使用了。

          Selector 的使用同其他解析庫類似,如果方便的話,我們也可以在其他項目中直接使用 Selector 來提取數(shù)據(jù)。

          Scrapy Shell

          由于 Selector 主要是與 Scrapy 結(jié)合使用,如 Scrapy 的回調(diào)函數(shù)中的參數(shù) response 直接調(diào)用 xpath() 或者 css() 方法來提取數(shù)據(jù),所以在這里我們借助 Scrapy shell 來模擬 Scrapy 請求的過程,來講解相關(guān)的提取方法。

          這里我們借助官方文檔的示例進(jìn)行演示。

          https://docs.scrapy.org/en/latest/_static/selectors-sample1.html

          為了完整起見,以下是其完整的HTML代碼:

          <html>
          ?<head>
          ??<base??/>
          ??<title>Example?website</title>
          ?</head>
          ?<body>
          ??<div?id='images'>
          ???<a?href='image1.html'>Name:?My?image?1?<br?/><img?src='image1_thumb.jpg'?/></a>
          ???<a?href='image2.html'>Name:?My?image?2?<br?/><img?src='image2_thumb.jpg'?/></a>
          ???<a?href='image3.html'>Name:?My?image?3?<br?/><img?src='image3_thumb.jpg'?/></a>
          ???<a?href='image4.html'>Name:?My?image?4?<br?/><img?src='image4_thumb.jpg'?/></a>
          ???<a?href='image5.html'>Name:?My?image?5?<br?/><img?src='image5_thumb.jpg'?/></a>
          ??</div>
          ?</body></html>

          首先,讓我們開啟 Scrapy shell,在命令行輸入如下命令:

          scrapy?shell?https://docs.scrapy.org/en/latest/_static/selectors-sample1.html

          這時,我們進(jìn)入了 Scrapy Shell 模式,其實就是 Scrapy 發(fā)起了一次請求,然后把一些可操作的變量傳遞給我們:

          Xpath 選擇器

          目前我們在 Scrapy shell 之中,這里我們主要操作的對象是 response 。

          response 有一個屬性是 selector ,我們可以通過調(diào)用 response.selector.xpath 對數(shù)據(jù)進(jìn)行獲取,同時, Scrapy 為我們提供了兩個更加簡潔的方法, response.xpath() 和 response.css() ,這兩個方法完全等同于 response.selector.xpath() 和 response.selector.css() 。

          出于寫法上的簡便考慮,小編后續(xù)的代碼將全部使用 response.xpath() 和 response.css() 。

          首先,我們簡單的獲取一下 a 標(biāo)簽:

          >>>?result?=?response.xpath('//a')>>>?result
          [<Selector?xpath='//a'?data='<a?href="image1.html">Name:?My?image?...'>,?<Selector?xpath='//a'?data='<a?href="image2.html">Name:?My?image?...'>,?<Selector?xpath='//a'?data='<a?href="image3.html">Name:?My?image?...'>,?<Selector?xpath='//a'?data='<a?href="image4.html">Name:?My?image?...'>,?<Selector?xpath='//a'?data='<a?href="image5.html">Name:?My?image?...'>]>>>?type(result)
          <class?'scrapy.selector.unified.SelectorList'>

          這里我們獲取到的結(jié)果是由 Selector 組成的列表: SelectorList 。

          它的類型是 scrapy.selector.unified.SelectorList

          SelectorList 和 Selector 都可以繼續(xù)調(diào)用 xpath() 和 css() 等方法來進(jìn)一步提取數(shù)據(jù)。

          接著上面的例子,我們繼續(xù)嘗試獲取 a 標(biāo)簽中的 img 標(biāo)簽:

          >>>?result.xpath('./img')
          [<Selector?xpath='./img'?data='<img?src="image1_thumb.jpg">'>,?
          <Selector?xpath='./img'?data='<img?src="image2_thumb.jpg">'>,?
          <Selector?xpath='./img'?data='<img?src="image3_thumb.jpg">'>,?
          <Selector?xpath='./img'?data='<img?src="image4_thumb.jpg">'>,?
          <Selector?xpath='./img'?data='<img?src="image5_thumb.jpg">'>]

          這里我們獲取到了所有的 a 標(biāo)簽中的 img 標(biāo)簽。

          注意:選擇器的最前方加 . ,這代表提取元素內(nèi)部的數(shù)據(jù),如果沒有加點(diǎn),則代表從根節(jié)點(diǎn)開始提取。

          此處我們用了 ./img 的提取方式,則代表從 a 節(jié)點(diǎn)里進(jìn)行提取。如果此處我們用 //img ,則還是從 html 節(jié)點(diǎn)里進(jìn)行提取。

          現(xiàn)在我們已經(jīng)獲得了 Selector 類型的節(jié)點(diǎn) a ,如果我們想要將 a 節(jié)點(diǎn)元素提取出來,可以使用 extract() 方法,如下:

          >>>?result.extract()
          ['<a?href="image1.html">Name:?My?image?1?<br><img?src="image1_thumb.jpg"></a>',?'<a?href="image2.html">Name:?My?image?2?<br><img?src="image2_thumb.jpg"></a>',?'<a?href="image3.html">Name:?My?image?3?<br><img?src="image3_thumb.jpg"></a>',?'<a?href="image4.html">Name:?My?image?4?<br><img?src="image4_thumb.jpg"></a>',?'<a?href="image5.html">Name:?My?image?5?<br><img?src="image5_thumb.jpg"></a>']

          這里我們?nèi)绻胍@得內(nèi)容的文本內(nèi)容,可以使用 /text() ,如果想要獲取 href 屬性的內(nèi)容可以使用 /@href

          我們來看一個完整的示例:

          >>>?response.xpath('//a[@href="image1.html"]/text()').extract()['Name:?My?image?1?']

          這里我們限制的結(jié)果,只查到的一條數(shù)據(jù),很多情況下我們都會獲得多條數(shù)據(jù),這時如果想獲取第一個元素的內(nèi)容,可以使用索引的方式,如下:

          >>>?response.xpath('//a/text()').extract()[0]'Name:?My?image?1?'

          這樣其實有一點(diǎn)點(diǎn)的小問題,如果當(dāng)前我們需要的列表為空,這里直接會產(chǎn)生數(shù)組越界的異常。

          Scrapy 為我們提供了另一個方法 extract_first() ,專門用來解決這個問題,上面的示例可以改寫成下面的樣子:

          >>>?response.xpath('//a/text()').extract_first()'Name:?My?image?1?'

          同時我們也可以為 extract_first() 方法設(shè)置一個默認(rèn)值參數(shù),這樣當(dāng) XPath 規(guī)則提取不到內(nèi)容時會直接使用默認(rèn)值。

          >>>?response.xpath('//a[@href="image1"]/text()').extract_first('Default')'Default'

          CSS 選擇器

          我們接著看 CSS 選擇器,還是上面的示例,小編這里就不多 BB 了,直接上示例:

          >>>?response.css('a')[<Selector?xpath='descendant-or-self::a'?data='<a?href="image1.html">Name:?My?image?...'>,?<Selector?xpath='descendant-or-self::a'?data='<a?href="image2.html">Name:?My?image?...'>,?<Selector?xpath='descendant-or-self::a'?data='<a?href="image3.html">Name:?My?image?...'>,?<Selector?xpath='descendant-or-self::a'?data='<a?href="image4.html">Name:?My?image?...'>,?<Selector?xpath='descendant-or-self::a'?data='<a?href="image5.html">Name:?My?image?...'>]

          我們同樣可以進(jìn)行屬性選擇和嵌套選擇:

          >>>?response.css('a[href="image1.html"]').extract()['<a?href="image1.html">Name:?My?image?1?<br><img?src="image1_thumb.jpg"></a>']>>>?response.css('a[href="image1.html"]?img').extract()['<img?src="image1_thumb.jpg">']

          接下來獲取文本值和屬性值的方法稍有區(qū)別:

          >>>?response.css('a[href="image1.html"]::text').extract()['Name:?My?image?1?']>>>?response.css('a[href="image1.html"]?img::attr(src)').extract()['image1_thumb.jpg']

          獲取文本和屬性需要用 ::text::attr() 的寫法。

          當(dāng)然,我們的 CSS 選擇器和 Xpath 選擇器一樣可以嵌套選擇,一個簡單的小示例感受下:

          >>>?response.xpath('//a').css('img').xpath('@src').extract()
          ['image1_thumb.jpg',?'image2_thumb.jpg',?'image3_thumb.jpg',?'image4_thumb.jpg',?'image5_thumb.jpg']

          Selector 選擇器就先介紹到這里了,轉(zhuǎn)發(fā)此文+關(guān)注 并私信小編“資料”即可免費(fèi)領(lǐng)取2010最新python資料和零基礎(chǔ)入門教程!

          不定期分享干貨,歡迎初學(xué)和進(jìn)階中的小伙伴!

          多數(shù)現(xiàn)代網(wǎng)站都使用客戶端 JavaScript 框架,例如 React、Vue 或 Angular。在沒有服務(wù)器端渲染的情況下從動態(tài)網(wǎng)站抓取數(shù)據(jù)通常需要執(zhí)行 JavaScript 代碼。

          我已經(jīng)抓取了數(shù)百個網(wǎng)站,而且我總是使用 Scrapy。Scrapy 是一個流行的 Python 網(wǎng)頁抓取框架。與其他 Python 抓取庫(例如 Beautiful Soup)相比,Scrapy 幫助您根據(jù)一些最佳實踐來構(gòu)建代碼。Scrapy 負(fù)責(zé)并發(fā)、收集統(tǒng)計數(shù)據(jù)、緩存、處理重試邏輯和許多其他問題。

          在本文中,我比較了使用 Scrapy 執(zhí)行 JavaScript 的最流行的解決方案,包括如何擴(kuò)展無頭瀏覽器,并介紹了與 ScrapingBee API 的開源集成以支持 JavaScript 和代理輪換。

          使用 Scrapy 抓取動態(tài)網(wǎng)站

          使用 Scrapy 抓取客戶端呈現(xiàn)的網(wǎng)站曾經(jīng)很痛苦。我經(jīng)常自己檢查瀏覽器網(wǎng)絡(luò)工具上的 API 請求并從 JavaScript 變量中提取數(shù)據(jù)。雖然這些 hack 可能適用于某些網(wǎng)站,但我發(fā)現(xiàn)這些代碼比傳統(tǒng)的 XPATH 更難理解和維護(hù)。但要直接從 HTML 中抓取客戶端數(shù)據(jù),您首先需要執(zhí)行 JavaScript 代碼。

          用于無頭瀏覽器的 Scrapy 中間件

          無頭瀏覽器是沒有圖形用戶界面的網(wǎng)絡(luò)瀏覽器。我使用了三個庫來使用 Scrapy 執(zhí)行 JavaScript:scrapy-selenium、scrapy-splash 和 scrapy-scrapingbee。

          所有三個庫都集成為 Scrapy下載器中間件。一旦在您的項目設(shè)置中進(jìn)行配置,您就不會從您的spiders產(chǎn)生一個正常的 Scrapy 請求,而是產(chǎn)生一個 SeleniumRequest、SplashRequest 或 ScrapingBeeRequest。

          使用 Selenium 在 Scrapy 中執(zhí)行

          在本地,您可以使用帶有scrapy-selenium中間件的 Scrapy 與無頭瀏覽器交互。Selenium 是一個與瀏覽器交互的框架,通常用于測試應(yīng)用程序、網(wǎng)頁抓取和截屏。

          Selenium 需要一個Web 驅(qū)動程序來與瀏覽器交互。例如,F(xiàn)irefox 要求您安裝 geckodriver。然后,您可以在 Scrapy 項目設(shè)置中配置 Selenium。

          
          
          from shutil import which
          
          SELENIUM_DRIVER_NAME='firefox'
          
          SELENIUM_DRIVER_EXECUTABLE_PATH=which('geckodriver')
          
          SELENIUM_DRIVER_ARGUMENTS=['-headless']
          
          DOWNLOADER_MIDDLEWARES={
          
              'scrapy_selenium.SeleniumMiddleware': 800
          
          }

          在你的spiders中,你可以產(chǎn)生一個 SeleniumRequest。

          from scrapy_selenium import SeleniumRequest
          
          yield SeleniumRequest(url, callback=self.parse)

          Selenium 允許您使用 Python 和 JavaScript 與瀏覽器進(jìn)行交互。驅(qū)動程序?qū)ο罂梢詮?Scrapy 響應(yīng)中訪問。有時在單擊按鈕后檢查 HTML 代碼會很有用。在本地,您可以使用 ipdb 調(diào)試器設(shè)置斷點(diǎn)來檢查 HTML 響應(yīng)。

          def parse(self, response):
          
          
              driver=response.request.meta['driver']
              driver.find_element_by_id('show-price').click()
          
          
              import ipdb; ipdb.set_trace()
              print(driver.page_source)
          

          否則,可以從響應(yīng)對象訪問 Scrapy XPATH 和 CSS 選擇器以從 HTML 中選擇數(shù)據(jù)。

          def parse(self, response):
              title=response.selector.xpath(
                  '//title/@text'
              ).extract_first()

          SeleniumRequest 接受一些額外的參數(shù),例如在返回響應(yīng)之前等待的 wait_time,等待 HTML 元素的 wait_until,截取屏幕截圖的屏幕截圖和用于執(zhí)行自定義 JavaScript 腳本的腳本。

          在生產(chǎn)中,scrapy-selenium 的主要問題是沒有簡單的方法來設(shè)置Selenium 網(wǎng)格以在遠(yuǎn)程機(jī)器上運(yùn)行多個瀏覽器實例。接下來,我將比較兩種使用 Scrapy 大規(guī)模執(zhí)行 JavaScript 的解決方案。

          使用 Splash 在 Scrapy 中執(zhí)行 JavaScript

          Splash是一種帶有 API 的 Web 瀏覽器即服務(wù)。它由 Scrapy 的主要貢獻(xiàn)者 Scrapinghub 維護(hù),并通過scrapy-splash中間件與 Scrapy 集成。它也可以由 Scrapinghub 托管。

          Splash 創(chuàng)建于 2013 年,在無頭 Chrome 和其他主要無頭瀏覽器于 2017 年發(fā)布之前。從那時起,其他流行的項目(如 PhantomJS)已停止使用,轉(zhuǎn)而支持 Firefox、Chrome 和 Safari 無頭瀏覽器。

          您可以使用 Docker 在本地運(yùn)行 Splash 實例。

          docker run -p 8050:8050 scrapinghub/splash`
          

          配置 Splash 中間件需要添加多個中間件并在項目設(shè)置中更改 HttpCompressionMiddleware 的默認(rèn)優(yōu)先級。

          SPLASH_URL='http://192.168.59.103:8050'
          
          
          DOWNLOADER_MIDDLEWARES={
              'scrapy_splash.SplashCookiesMiddleware': 723,
              'scrapy_splash.SplashMiddleware': 725,
              'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 810,
          }
          
          
          SPIDER_MIDDLEWARES={
              'scrapy_splash.SplashDeduplicateArgsMiddleware': 100,
          }
          
          
          DUPEFILTER_CLASS='scrapy_splash.SplashAwareDupeFilter'
          HTTPCACHE_STORAGE='scrapy_splash.SplashAwareFSCacheStorage'
          

          然后你可以產(chǎn)生一個帶有可選參數(shù) wait 和 lua_source 的 SplashRequest。

          from scrapy_splash import SplashRequest
          
          yield SplashRequest(url, callback=self.parse, args={
          	'wait': 0.5,
              'lua_source': script
          })
          

          Splash 是一種流行的解決方案,因為它已經(jīng)推出了很長時間,但它有兩個主要問題:它使用自定義的無頭瀏覽器,并且需要在 Lua 中編碼才能與網(wǎng)站交互。由于這兩個問題,在我的最后一個抓取項目中,我決定為 ScrapingBee API 創(chuàng)建一個中間件。

          使用 ScrapingBee 在 Scrapy 中執(zhí)行 JavaScript

          ScrapingBee是一個 Web 抓取 API,可以為您處理無頭瀏覽器和代理。ScrapingBee 使用最新的無頭 Chrome 版本并支持 JavaScript 腳本。

          與其他兩個中間件一樣,您可以簡單地使用 pip 安裝scrapy-scrapingbee中間件。

          pip install scrapy-scrapingbee

          首先,您需要創(chuàng)建一個 ScrapingBee 帳戶以獲取 API 密鑰。然后你可以根據(jù)你的項目設(shè)置中的 ScrapingBee 計劃添加下載器中間件并設(shè)置并發(fā)。

          SCRAPINGBEE_API_KEY='REPLACE-WITH-YOUR-API-KEY'
          
          DOWNLOADER_MIDDLEWARES={
              'scrapy_scrapingbee.ScrapingBeeMiddleware': 725,
          }
          
          CONCURRENT_REQUESTS=1

          然后你可以從 ScrapingBeeSpider 繼承你的蜘蛛并產(chǎn)生一個 ScrapingBeeRequest。

          from scrapy_scrapingbee import ScrapingBeeSpider, ScrapingBeeRequest
          
          class HttpbinSpider(ScrapingBeeSpider):
              name='httpbin'
              start_urls=[
                  'https://httpbin.org',
              ]
          
          
              def start_requests(self):
                  for url in self.start_urls:
                      yield ScrapingBeeRequest(url)
          
          
              def parse(self, response):
                  …

          ScrapingBeeRequest 采用可選的 params 參數(shù)來執(zhí)行 js_snippet,在返回響應(yīng)之前設(shè)置自定義等待,或者使用 wait_for 在 HTML 代碼中等待 CSS 或 XPATH 選擇器。

          在某些網(wǎng)站中,當(dāng)您滾動瀏覽頁面時,HTML 會異步加載。您可以使用下面的 JavaScript 片段滾動到頁面末尾。

          JS_SNIPPET='window.scrollTo(0, document.body.scrollHeight);'
          
          yield ScrapingBeeRequest(url, params={
                     'js_snippet': JS_SNIPPET,
                     # 'wait': 3000,
                     # 'wait_for': '#swagger-ui',
                 })

          ScrapingBee 收集了其他常見的 JavaScript 片段,以便與ScrapingBee 文檔中的網(wǎng)站進(jìn)行交互。

          在幕后,scraping-scrapingbee 中間件將原始請求轉(zhuǎn)換為轉(zhuǎn)發(fā)到 ScrapingBee API 的請求,并對 URL 查詢字符串中的每個參數(shù)進(jìn)行編碼。API 端點(diǎn)記錄在您的 Scrapy 日志中,并且 api_key 被 ScrapingBeeSpider 隱藏。

          2020-06-22 12:32:07 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://app.scrapingbee.com/api/v1/?api_key=HIDDEN&url=https://httpbin.org&js_snippet=d2luZG93LnNjcm9sbFRvKDAsIGRvY3VtZW50LmJvZHkuc2Nyb2xsSGVpZ2h0KTs=&wait=3000> (referer: None)

          在您的蜘蛛的解析方法中,中間件將 response.url 解析為傳遞給 ScrapingBeeRequest 的原始 URL。

          def parse(self, response):
              assert response.url=='https://httpbin.org'
          

          使用 ScrapingBee 的另一個優(yōu)點(diǎn)是您可以使用以下參數(shù)訪問不同國家的住宅代理和開箱即用的代理輪換。

          yield ScrapingBeeRequest(url, params={
             'premium_proxy': True,
             'country_code': 'fr',
          })
          

          使用 Scrapy 緩存和并發(fā)來更快地抓取

          Scrapy 在底層使用了 Twisted,這是一個異步網(wǎng)絡(luò)框架。Twisted 使 Scrapy 快速并且能夠同時抓取多個頁面。但是,要執(zhí)行 JavaScript 代碼,您需要使用真正的瀏覽器或無頭瀏覽器來解析請求。無頭瀏覽器有兩個挑戰(zhàn):它們速度較慢且難以擴(kuò)展。

          在無頭瀏覽器中執(zhí)行 JavaScript 并等待所有網(wǎng)絡(luò)調(diào)用每頁可能需要幾秒鐘。抓取多個頁面時,它會使抓取器顯著變慢。希望 Scrapy 提供緩存來加速生產(chǎn)運(yùn)行的開發(fā)和并發(fā)請求。

          在本地,在開發(fā)爬蟲時,您可以使用 Scrapy 的內(nèi)置緩存系統(tǒng)。由于響應(yīng)存儲在計算機(jī)上的隱藏文件夾 .scrapy/httpcache 中,它將使后續(xù)運(yùn)行更快。您可以在項目設(shè)置中激活 HttpCacheMiddleware:

          HTTPCACHE_ENABLED=True
          

          無頭瀏覽器的另一個問題是它們會為每個請求消耗內(nèi)存。在生產(chǎn)環(huán)境中,您需要一個可以處理多個瀏覽器的環(huán)境。要同時發(fā)出多個請求,您可以修改項目設(shè)置:

          CONCURRENT_REQUESTS=1
          

          使用 ScrapingBee 時,請記住根據(jù)您的 ScrapingBee 計劃設(shè)置并發(fā)。

          結(jié)論

          我比較了三個使用 Scrapy 渲染和執(zhí)行 JavaScript 的 Scrapy 中間件。Selenium 允許您在所有主要的無頭瀏覽器中使用 Python 與 Web 瀏覽器進(jìn)行交互,但可能難以擴(kuò)展。Splash 可以使用 Docker 在本地運(yùn)行或部署到 Scrapinghub,但依賴于自定義瀏覽器實現(xiàn),您必須在 Lua 中編寫腳本。ScrapingBee 使用最新的 Chrome 無頭瀏覽器,允許您在 JavaScript 中執(zhí)行自定義腳本,并為最難抓取的網(wǎng)站提供代理輪換。


          scrapy-selenium

          scrapy-splash

          scrapy-scrapingbee

          本地運(yùn)行

          是的

          是的,使用 Docker

          遠(yuǎn)程擴(kuò)展

          使用Selenium Grid

          使用 Scrapinghub

          使用ScrapingBee

          腳本語言

          JavaScript、Python

          lua

          JavaScript

          瀏覽器支持

          Chrome, Firefox, Edge, Safari

          Splash

          Latest Headless Chrome

          代理輪換

          由另一項服務(wù) Crawlera 提供

          是的,由相同的中間件提供


          主站蜘蛛池模板: 午夜视频一区二区三区| 无码人妻精品一区二区三| 国产成人精品一区二三区在线观看| 午夜爽爽性刺激一区二区视频| 成人免费观看一区二区| 国产精品盗摄一区二区在线| 日韩人妻无码免费视频一区二区三区| 精品人妻少妇一区二区三区不卡| 视频在线观看一区| 国产在线精品一区免费香蕉 | 色狠狠一区二区三区香蕉| 亚洲AV无码一区二区三区系列| 99精品国产一区二区三区不卡 | 日韩在线一区二区三区视频| 国产一区二区三区在线| 亚洲人成人一区二区三区| 亚洲字幕AV一区二区三区四区| 国产精品视频免费一区二区三区| 色系一区二区三区四区五区| 精品国产一区二区三区av片| av在线亚洲欧洲日产一区二区| 国产激情无码一区二区app| 在线视频一区二区| 精品女同一区二区三区在线 | 日韩有码一区二区| 亚洲色精品aⅴ一区区三区| 亚洲熟女综合一区二区三区| 国产成人一区在线不卡| 亚洲电影唐人社一区二区| 一区三区三区不卡| 91大神在线精品视频一区| 性色AV 一区二区三区| 97se色综合一区二区二区| 亚洲日韩精品一区二区三区| 国产成人高清亚洲一区91| 日韩人妻无码一区二区三区99 | 在线精品国产一区二区| 亚洲男人的天堂一区二区| 99国产精品欧美一区二区三区| 国产一区二区三区高清视频| 午夜在线视频一区二区三区 |