整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          網絡爬蟲框架Scrapy詳解之Request

          網絡爬蟲框架Scrapy詳解之Request

          介: Request類是一個http請求的類,對于爬蟲而言是一個很重要的類。通常在Spider中創建這樣的一個請求,在Downloader中執行這樣的一個請求。同時也有一個子類FormRequest繼承于它,用于post請求。

          介紹

          Request類是一個http請求的類,對于爬蟲而言是一個很重要的類。通常在Spider中創建這樣的一個請求,在Downloader中執行這樣的一個請求。同時也有一個子類FormRequest繼承于它,用于post請求。

          在Spider中通常用法:

          yield
           scrapy.
          Request
          (url='zarten.com'
          )
          

          類屬性和方法有:

          url
          method
          headers
          body
          meta
          copy()
          replace([url, method, headers, body, cookies, meta, encoding, dont_filter, callback, errback])
          Request
          class
           scrapy.http.
          

          Request

          (url[, callback, method='GET'
          , headers, body, cookies, meta, encoding='utf-8'
          , priority=0
          , dont_filter=False
          , errback, flags])
          

          參數說明:

          url 請求的url

          callback 回調函數,用于接收請求后的返回信息,若沒指定,則默認為parse()函數

          method http請求的方式,默認為GET請求,一般不需要指定。若需要POST請求,用FormRequest即可

          headers 請求頭信息,一般在settings中設置即可,也可在middlewares中設置

          body str類型,為請求體,一般不需要設置(get和post其實都可以通過body來傳遞參數,不過一般不用)

          cookies dict或list類型,請求的cookie dict方式(name和value的鍵值對):

          cookies={
          'name1'
           : 
          'value1'
           , 
          'name2'
           : 
          'value2'
          }
          

          list方式:

          cookies=[
          {
          'name'
          : 
          'Zarten'
          , 
          'value'
          : 
          'my name is Zarten'
          , 
          'domain'
          : 
          'example.com'
          , 
          'path'
          : 
          '/currency'
          }
          ]
          

          encoding 請求的編碼方式,默認為'utf-8'

          priority int類型,指定請求的優先級,數字越大優先級越高,可以為負數,默認為0

          dont_filter 默認為False,若設置為True,這次請求將不會過濾(不會加入到去重隊列中),可以多次執行相同的請求

          errback 拋出錯誤的回調函數,錯誤包括404,超時,DNS錯誤等,第一個參數為Twisted Failure實例

          from
           scrapy.spidermiddlewares.httperror 
          import
           
          HttpError
          from
           twisted.internet.error 
          import
           
          DNSLookupError
          from
           twisted.internet.error 
          import
           
          TimeoutError
          , 
          TCPTimedOutError
          class
           
          ToScrapeCSSSpider
          (scrapy.
          Spider
          ):
           name="toscrape-css"
           
          # start_urls=[
           
          # 'http://quotes.toscrape.com/',
           
          # ]
           start_urls=[
           
          "http://www.httpbin.org/"
          , 
          # HTTP 200 expected
           
          "http://www.httpbin.org/status/404"
          , 
          # Not found error
           
          "http://www.httpbin.org/status/500"
          , 
          # server issue
           
          "http://www.httpbin.org:12345/"
          , 
          # non-responding host, timeout expected
           
          "http://www.httphttpbinbin.org/"
          , 
          # DNS error expected
           ]
           
          def
           start_requests(
          self
          ):
           
          for
           u 
          in
           
          self
          .start_urls:
           
          yield
           scrapy.
          Request
          (u, callback=self
          .parse_httpbin,
           errback=self
          .errback_httpbin,
           dont_filter=True
          )
           
          def
           parse_httpbin(
          self
          , response):
           
          self
          .logger.info(
          'Got successful response from {}'
          .format(response.url))
           
          # do something useful here...
           
          def
           errback_httpbin(
          self
          , failure):
           
          # log all failures
           
          self
          .logger.info(repr(failure))
           
          # in case you want to do something special for some errors,
           
          # you may need the failure's type:
           
          if
           failure.check(
          HttpError
          ):
           
          # these exceptions come from HttpError spider middleware
           
          # you can get the non-200 response
           response=failure.value.response
           
          self
          .logger.info(
          'HttpError錯誤 on %s'
          , response.url)
           
          elif
           failure.check(
          DNSLookupError
          ):
           
          # this is the original request
           request=failure.request
           
          self
          .logger.info(
          'DNSLookupError錯誤 on %s'
          , request.url)
           
          elif
           failure.check(
          TimeoutError
          , 
          TCPTimedOutError
          ):
           request=failure.request
           
          self
          .logger.info(
          'TimeoutError錯誤 on %s'
          , request.url)
          

          flags list類型,一般不會用到,發送請求的標志,一般用于日志記錄

          meta 可用戶自定義從Request到Response傳遞參數,這個參數一般也可在middlewares中處理

          yield
           scrapy.
          Request
          (url='zarten.com'
          , meta={
          'name'
           : 
          'Zarten'
          })
          

          在Response中:

          my_name=response.meta[
          'name'
          ]
          

          不過也有scrapy內置的特殊key,也非常有用,它們如下:

          proxy 設置代理,一般在middlewares中設置

          可以設置http或https代理

          request.meta[
          'proxy'
          ]='https://'
           + 
          'ip:port'
          

          downloadtimeout 設置請求超時等待時間(秒),通常在settings中設置DOWNLOADTIMEOUT,默認是180秒(3分鐘)

          maxretrytimes 最大重試次數(除去第一次下載),默認為2次,通常在settings中 RETRY_TIMES設置

          dont_redirect 設為True后,Request將不會重定向

          dont_retry 設為True后,對于http鏈接錯誤或超時的請求將不再重試請求

          handlehttpstatuslist http返回碼200-300之間都是成功的返回,超出這個范圍的都是失敗返回,scrapy默認是過濾了這些返回,不會接收這些錯誤的返回進行處理。不過可以自定義處理哪些錯誤返回:

          yield
           scrapy.
          Request
          (url='https://httpbin.org/get/zarten'
          , meta={
          'handle_httpstatus_list'
           : [
          404
          ]})
          

          在parse函數中可以看到處理404錯誤:

          def
           parse(
          self
          , response):
           
          print
          (
          '返回信息為:'
          ,response.text)
          

          handlehttpstatusall 設為True后,Response將接收處理任意狀態碼的返回信息

          dontmergecookies scrapy會自動保存返回的cookies,用于它的下次請求,當我們指定了自定義cookies時,如果我們不需要合并返回的cookies而使用自己指定的cookies,可以設為True

          cookiejar 可以在單個spider中追蹤多個cookie,它不是粘性的,需要在每次請求時都帶上

          def
           start_requests(
          self
          ):
           urls=[
          'http://quotes.toscrape.com/page/1'
          ,
           
          'http://quotes.toscrape.com/page/3'
          ,
           
          'http://quotes.toscrape.com/page/5'
          ,
           ]
           
          for
           i ,url 
          in
           enumerate(urls):
           
          yield
           scrapy.
          Request
          (url=url, meta={
          'cookiejar'
           : i})
           
          def
           parse(
          self
          , response):
           next_page_url=response.css(
          "li.next > a::attr(href)"
          ).extract_first()
           
          if
           next_page_url 
          is
           
          not
           
          None
          :
           
          yield
           scrapy.
          Request
          (response.urljoin(next_page_url), meta={
          'cookiejar'
           : response.meta[
          'cookiejar'
          ]}, callback=self
          .parse_next)
           
          def
           parse_next(
          self
          , response):
           
          print
          (
          'cookiejar:'
          , response.meta[
          'cookiejar'
          ])
          

          dont_cache 設為True后,不會緩存

          redirect_urls 暫時還不清楚具體的作用,知道的小伙伴們歡迎在評論留言

          bindaddress 綁定輸出IP

          dontobeyrobotstxt 設為True,不遵守robots協議,通常在settings中設置

          downloadmaxsize 設置下載器最大下載的大小(字節),通常在settings中設置DOWNLOADMAXSIZE,默認為1073741824 (1024MB=1G),若不設置最大的下載限制,設為0

          download_latency 只讀屬性,獲取請求的響應時間(秒)

          def
           start_requests(
          self
          ):
           headers={
           
          'user-agent'
           : 
          'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'
           }
           
          yield
           scrapy.
          Request
          (url='https://www.amazon.com'
          , headers=headers)
           
          def
           parse(
          self
          , response):
           
          print
          (
          '響應時間為:'
          , response.meta[
          'download_latency'
          ])
          

          downloadfailon_dataloss 很少用到,詳情看這里

          referrer_policy 設置Referrer Policy

          FormRequest

          FormRequest 類為Request的子類,用于POST請求

          這個類新增了一個參數 formdata,其他參數與Request一樣,詳細可參考上面的講述

          一般用法為:

          yield
           scrapy.
          FormRequest
          (url="http://www.example.com/post/action"
          ,
           formdata={
          'name'
          : 
          'Zarten'
          , 
          'age'
          : 
          '27'
          },
           callback=self
          .after_post)
          

          點擊“了解更多”看源代碼,建議收藏

          得十多年前,自己還是個高中生的時候,所謂的智能手機還完全沒有普及,如果想在學校里面大量閱讀電子書的話,基本上靠的就是有閱讀 功能的MP3或者MP4了。而電子書的來源呢?在無法隨時隨地接觸網絡的情況下,有時靠的就是笨辦法:將一些小說網站上的內容一頁頁的粘貼復制下來。而那些動輒幾百章節的網絡小說,靠這樣的手工操作,確實讓人非常頭疼。那時候是多么希望有一個工具能幫我自動完成這些吃力的手工活啊?。。?/p>

          好吧,言歸正傳,最近在研究怎么使用爬蟲框架Scrapy。先說說想要學習Scrapy的初衷吧。

          • 學習目的:抓取自己經常瀏覽的十幾個新聞類網站的新聞數據,然后統一在的html頁面中瀏覽。
          • 實現方法:第一步,使用Scrapy抓取數據。第二步,使用Django生成html頁面
          • Scrapy介紹

          Scrapy是Python開發的一個快速、高層次的屏幕抓取和web抓取框架,用于抓取web站點并從頁面中提取結構化的數據。Scrapy用途廣泛,可以用于數據挖掘、監測和自動化測試(百度百科上的介紹)。

          經過幾天的學習,Scrapy的初步使用,首先需要了解的就是如下幾個概念了:

          • Spiders:用于解析網頁的類,你的大部分工作就是如何寫一個繼承自Spiders的類了。
          • Selectors:幫助你方便的查詢到網頁中你所需要的內容。(在Spiders中使用)
          • Items:數據類,將你抓取到的內容保存到其中。
          • Item Pipeline:在這里定義你想要對數據類進行的所有操作。

          所以,你需要做得就是寫好上面提到的四個類,剩下的只要交給Scrapy框架就可以了。

          可以先創建一個scrapy項目:

          scrapy startproject getMyFavoritePages

          文件spiderForShortPageMsg.py里面就是我們要寫的 Spiders子類了。

          • 簡單的實例

          舉例:現在我想要將網站https://lobste.rs/中所有文章的標題和文章的地址抓取下來。

          第一步:寫一個繼承自 Spiders的類

          Scrapy框架會自動調用該類的方法parse(),在這里parse()最后調用了自定義的方法parse_lobste_com()來解析具體的html頁面,并從中找到我想要的數據,然后保存于一個 Items的數據類對象當中。

          不要被下面的這行代碼嚇到:

          response.xpath("http://div/div[2]/span[1]/a[@class='u-url']"

          它就是之前提到的 Selectors。這就是用來定位你想要查找的html標簽的方法。有倆種 Selectors, 分別是 XPath Selectors 和 CSS Selectors,上面都有用到。

          這是我的Item數據類(即上面的pageItem)。

          第二步:在Item Pipeline中定義你想要對數據類Item進行的所有操作。

          現在想要的數據已經在Item對象當中了??紤]到自己的最終目的,最好的選擇當然是把所有的數據都保存在數據庫當中了。

          而說到數據庫的操作,就不得不提Django中的models類了,通過幾步簡單的設置,你可以直接調用Django中的models類,進而省去復雜了數據庫操作,簡直不要太省心了。誰用誰知道啊!!

          、Scrapy 框架

          • Scrapy是用純Python實現一個為了爬取網站數據、提取結構性數據而編寫的應用框架,用途非常廣泛。
          • 框架的力量,用戶只需要定制開發幾個模塊就可以輕松地實現一個爬蟲,用來抓取網頁內容以及各種圖片,非常之方便。
          • Scrapy 使用了 Twisted['tw?st?d](其主要對手是Tornado)異步網絡框架來處理網絡通訊,可以加快我們的下載速度,不用自己去實現異步框架,并且包含了各種中間件接口,可以靈活的完成各種需求。

          Scrapy架構圖(綠線是數據流向):

          • Scrapy Engine(引擎): 負責Spider、ItemPipelineDownloader、Scheduler中間的通訊,信號、數據傳遞等。
          • Scheduler(調度器): 它負責接受引擎發送過來的Request請求,并按照一定的方式進行整理排列,入隊,當引擎需要時,交還給引擎
          • Downloader(下載器):負責下載Scrapy Engine(引擎)發送的所有Requests請求,并將其獲取到的Responses交還給Scrapy Engine(引擎),由引擎交給Spider來處理,
          • Spider(爬蟲):它負責處理所有Responses,從中分析提取數據,獲取Item字段需要的數據,并將需要跟進的URL提交給引擎,再次進入Scheduler(調度器),
          • Item Pipeline(管道):它負責處理Spider中獲取到的Item,并進行進行后期處理(詳細分析、過濾、存儲等)的地方.
          • Downloader Middlewares(下載中間件):你可以當作是一個可以自定義擴展下載功能的組件。
          • Spider Middlewares(Spider中間件):你可以理解為是一個可以自定擴展和操作引擎Spider中間通信的功能組件(比如進入Spider的Responses;和從Spider出去的Requests)

          Scrapy的運作流程

          代碼寫好,程序開始運行...

          1. 引擎:Hi!Spider, 你要處理哪一個網站?
          2. Spider:老大要我處理xxxx.com。
          3. 引擎:你把第一個需要處理的URL給我吧。
          4. Spider:給你,第一個URL是xxxxxxx.com。
          5. 引擎:Hi!調度器,我這有request請求你幫我排序入隊一下。
          6. 調度器:好的,正在處理你等一下。
          7. 引擎:Hi!調度器,把你處理好的request請求給我。
          8. 調度器:給你,這是我處理好的request
          9. 引擎:Hi!下載器,你按照老大的下載中間件的設置幫我下載一下這個request請求
          10. 下載器:好的!給你,這是下載好的東西。(如果失?。簊orry,這個request下載失敗了。然后引擎告訴調度器,這個request下載失敗了,你記錄一下,我們待會兒再下載)
          11. 引擎:Hi!Spider,這是下載好的東西,并且已經按照老大的下載中間件處理過了,你自己處理一下(注意!這兒responses默認是交給def parse()這個函數處理的)
          12. Spider:(處理完畢數據之后對于需要跟進的URL),Hi!引擎,我這里有兩個結果,這個是我需要跟進的URL,還有這個是我獲取到的Item數據。
          13. 引擎:Hi !管道 我這兒有個item你幫我處理一下!調度器!這是需要跟進URL你幫我處理下。然后從第四步開始循環,直到獲取完老大需要全部信息。
          14. 管道``調度器:好的,現在就做!

          注意!只有當調度器中不存在任何request了,整個程序才會停止,(也就是說,對于下載失敗的URL,Scrapy也會重新下載。)

          制作 Scrapy 爬蟲 一共需要4步:

          • 新建項目 (scrapy startproject xxx):新建一個新的爬蟲項目
          • 明確目標 (編寫items.py):明確你想要抓取的目標
          • 制作爬蟲 (spiders/xxspider.py):制作爬蟲開始爬取網頁
          • 存儲內容 (pipelines.py):設計管道存儲爬取內容

          二、配置安裝

          Scrapy的安裝介紹

          Scrapy框架官方網址:http://doc.scrapy.org/en/latest

          Scrapy中文維護站點:http://scrapy-chs.readthedocs.io/zh_CN/latest/index.html

          Windows 安裝方式

          • Python 2 / 3
          • 升級pip版本:pip install --upgrade pip
          • 通過pip 安裝 Scrapy 框架pip install Scrapy

          Ubuntu 需要9.10或以上版本安裝方式

          • Python 2 / 3
          • 安裝非Python的依賴 sudo apt-get install python-dev python-pip libxml2-dev libxslt1-dev zlib1g-dev libffi-dev libssl-dev
          • 通過pip 安裝 Scrapy 框架 sudo pip install scrapy

          安裝后,只要在命令終端輸入 scrapy,提示類似以下結果,代表已經安裝成功

          具體Scrapy安裝流程參考:http://doc.scrapy.org/en/latest/intro/install.html#intro-install-platform-notes 里面有各個平臺的安裝方法

          三、入門案例

          1. 新建項目(scrapy startproject)

          • 在開始爬取之前,必須創建一個新的Scrapy項目。進入自定義的項目目錄中,運行下列命令:
          scrapy startproject mySpider
          • 其中, mySpider 為項目名稱,可以看到將會創建一個 mySpider 文件夾,目錄結構大致如下:

          下面來簡單介紹一下各個主要文件的作用:

          scrapy.cfg :項目的配置文件
          mySpider/ :項目的Python模塊,將會從這里引用代碼
          mySpider/items.py :項目的目標文件
          mySpider/pipelines.py :項目的管道文件
          mySpider/settings.py :項目的設置文件
          mySpider/spiders/ :存儲爬蟲代碼目錄

          2. 明確目標(mySpider/items.py)

          我們打算抓?。篽ttp://www.itcast.cn/channel/teacher.shtml 網站里的所有講師的姓名、職稱和個人信息。

          1. 打開mySpider目錄下的items.py
          2. Item 定義結構化數據字段,用來保存爬取到的數據,有點像Python中的dict,但是提供了一些額外的保護減少錯誤。
          3. 可以通過創建一個 scrapy.Item 類, 并且定義類型為 scrapy.Field的類屬性來定義一個Item(可以理解成類似于ORM的映射關系)。
          4. 接下來,創建一個ItcastItem 類,和構建item模型(model)。
          import scrapy
          
          class ItcastItem(scrapy.Item):
              name=scrapy.Field()
              level=scrapy.Field()
              info=scrapy.Field()

          3. 制作爬蟲 (spiders/itcastSpider.py)

          爬蟲功能要分兩步:

          (1)爬數據

          • 在當前目錄下輸入命令,將在mySpider/spider目錄下創建一個名為itcast的爬蟲,并指定爬取域的范圍:
          scrapy genspider itcast "itcast.cn"
          • 打開 mySpider/spider目錄里的 itcast.py,默認增加了下列代碼:
          import scrapy
          
          class ItcastSpider(scrapy.Spider):
              name="itcast"
              allowed_domains=["itcast.cn"]
              start_urls=(
                  'http://www.itcast.cn/',
              )
          
              def parse(self, response):
                  pass

          其實也可以由我們自行創建itcast.py并編寫上面的代碼,只不過使用命令可以免去編寫固定代碼的麻煩

          要建立一個Spider, 你必須用scrapy.Spider類創建一個子類,并確定了三個強制的屬性 和 一個方法。

          • name="" :這個爬蟲的識別名稱,必須是唯一的,在不同的爬蟲必須定義不同的名字。
          • allow_domains=[] 是搜索的域名范圍,也就是爬蟲的約束區域,規定爬蟲只爬取這個域名下的網頁,不存在的URL會被忽略。
          • start_urls=() :爬取的URL元祖/列表。爬蟲從這里開始抓取數據,所以,第一次下載的數據將會從這些urls開始。其他子URL將會從這些起始URL中繼承性生成。
          • parse(self, response) :解析的方法,每個初始URL完成下載后將被調用,調用的時候傳入從每一個URL傳回的Response對象來作為唯一參數,主要作用如下:
          1. 負責解析返回的網頁數據(response.body),提取結構化數據(生成item)
          2. 生成需要下一頁的URL請求。

          將start_urls的值修改為需要爬取的第一個url

          start_urls=("http://www.itcast.cn/channel/teacher.shtml",)

          修改parse()方法

          def parse(self, response):
              with open("teacher.html", "w") as f:
                  f.write(response.text)

          然后運行一下看看,在mySpider目錄下執行:

          scrapy crawl itcast

          是的,就是 itcast,看上面代碼,它是 ItcastSpider 類的 name 屬性,也就是使用 scrapy genspider命令的爬蟲名。

          一個Scrapy爬蟲項目里,可以存在多個爬蟲。各個爬蟲在執行時,就是按照 name 屬性來區分。

          運行之后,如果打印的日志出現 [scrapy] INFO: Spider closed (finished),代表執行完成。 之后當前文件夾中就出現了一個 teacher.html 文件,里面就是我們剛剛要爬取的網頁的全部源代碼信息。

          # 注意,Python2.x默認編碼環境是ASCII,當和取回的數據編碼格式不一致時,可能會造成亂碼;
          # 我們可以指定保存內容的編碼格式,一般情況下,我們可以在代碼最上方添加:
          
              import sys
              reload(sys)
              sys.setdefaultencoding("utf-8")
          
          # 這三行代碼是Python2.x里解決中文編碼的萬能鑰匙,經過這么多年的吐槽后Python3學乖了,默認編碼是Unicode了...(祝大家早日擁抱Python3)

          (2)取數據

          • 爬取整個網頁完畢,接下來的就是的取過程了,首先觀察頁面源碼:

          <div class="li_txt">
              <h3>  xxx  </h3>
              <h4> xxxxx </h4>
              <p> xxxxxxxx </p>

          是不是一目了然?直接上XPath開始提取數據吧。

          • 我們之前在mySpider/items.py 里定義了一個ItcastItem類。 這里引入進來
          from mySpider.items import ItcastItem
          • 然后將我們得到的數據封裝到一個 ItcastItem 對象中,可以保存每個老師的屬性:
          from mySpider.items import ItcastItem
          
          def parse(self, response):
              #open("teacher.html","wb").write(response.body).close()
          
              # 存放老師信息的集合
              items=[]
          
              for each in response.xpath("//div[@class='li_txt']"):
                  # 將我們得到的數據封裝到一個 `ItcastItem` 對象
                  item=ItcastItem()
                  #extract()方法返回的都是unicode字符串
                  name=each.xpath("h3/text()").extract()
                  title=each.xpath("h4/text()").extract()
                  info=each.xpath("p/text()").extract()
          
                  #xpath返回的是包含一個元素的列表
                  item['name']=name[0]
                  item['title']=title[0]
                  item['info']=info[0]
          
                  items.append(item)
          
              # 直接返回最后數據
              return items
          • 我們暫時先不處理管道,后面會詳細介紹。

          保存數據

          scrapy保存信息的最簡單的方法主要有四種,-o 輸出指定格式的文件,,命令如下:

          # json格式,默認為Unicode編碼
          scrapy crawl itcast -o teachers.json
          
          # json lines格式,默認為Unicode編碼
          scrapy crawl itcast -o teachers.jsonl
          
          # csv 逗號表達式,可用Excel打開
          scrapy crawl itcast -o teachers.csv
          
          # xml格式
          scrapy crawl itcast -o teachers.xml

          思考

          如果將代碼改成下面形式,結果完全一樣。

          請思考 yield 在這里的作用:


          主站蜘蛛池模板: 免费日本一区二区| 久久久无码精品人妻一区| 亚洲国产一区二区三区在线观看| 精品永久久福利一区二区| 亚拍精品一区二区三区| 亚洲欧洲∨国产一区二区三区| 色国产在线视频一区| 国产伦理一区二区三区| 日本一道高清一区二区三区| 无码欧精品亚洲日韩一区| 中文字幕精品一区| 一区二区网站在线观看| 国产成人av一区二区三区在线| 国产精品久久一区二区三区| 精品少妇一区二区三区视频| 亚洲爽爽一区二区三区| 国内精品视频一区二区八戒| 亚洲色精品三区二区一区| 国产日本一区二区三区| 水蜜桃av无码一区二区| 99精品一区二区免费视频| 日本不卡免费新一区二区三区| 国产一区二区三区播放| 国产一区二区在线视频播放| 精品国产一区二区三区| 爱爱帝国亚洲一区二区三区 | 日本精品一区二区三本中文| 亚洲乱码一区二区三区国产精品 | 久久久精品人妻一区二区三区四 | 美女AV一区二区三区| 无码aⅴ精品一区二区三区| 国产乱码精品一区二区三区麻豆| 亚洲AV无码一区二区三区牲色 | 日本一区视频在线播放| 午夜无码视频一区二区三区| 亚洲一区视频在线播放| 亚洲乱码日产一区三区| 精品无码成人片一区二区98| 无码aⅴ精品一区二区三区| 国产精品一区12p| 国产精品高清一区二区三区不卡|