精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

基于 Node.js 的聲明式可監控爬蟲網絡

開發 開發工具
爬蟲是數據抓取的重要手段之一,而以 Scrapy、Crawler4j、Nutch 為代表的開源框架能夠幫我們快速構建分布式爬蟲系統。

[[189077]]

爬蟲是數據抓取的重要手段之一,而以 ScrapyCrawler4j、Nutch 為代表的開源框架能夠幫我們快速構建分布式爬蟲系統;就筆者淺見,我們在開發大規模爬蟲系統時可能會面臨以下挑戰:

  • 網頁抓?。鹤詈唵蔚淖ト【褪鞘褂?HTTPClient 或者 fetch 或者 request 這樣的 HTTP 客戶端?,F在隨著單頁應用這樣富客戶端應用的流行,我們可以使用 Selenium、PhantomJS 這樣的 Headless Brwoser 來動態執行腳本進行渲染。
  • 網頁解析:對于網頁內容的抽取與解析是個很麻煩的問題,DOM4j、Cherrio、beautifulsoup 這些為我們提供了基本的解析功能。筆者也嘗試過構建全配置型的爬蟲,類似于 Web-Scraper,然而還是輸給了復雜多變,多層嵌套的 iFrame 頁面。這里筆者秉持代碼即配置的理念,對于使用配置來聲明的內建復雜度比較低,但是對于那些業務復雜度較高的網頁,整體復雜度會以幾何倍數增長。而使用代碼來聲明其內建復雜度與門檻相對較高,但是能較好地處理業務復雜度較高的網頁。筆者在構思未來的交互式爬蟲生成界面時,也是希望借鑒 FaaS 的思路,直接使用代碼聲明整個解析流程,而不是使用配置。
  • 反爬蟲對抗:類似于淘寶這樣的主流網站基本上都有反爬蟲機制,它們會對于請求頻次、請求地址、請求行為與目標的連貫性等多個維度進行分析,從而判斷請求者是爬蟲還是真實用戶。我們常見的方式就是使用多 IP 或者多代理來避免同一源的頻繁請求,或者可以借鑒 GAN 或者增強學習的思路,讓爬蟲自動地針對目標網站的反爬蟲策略進行自我升級與改造。另一個常見的反爬蟲方式就是驗證碼,從最初的混淆圖片到現在常見的拖動式驗證碼都是不小的障礙,我們可以使用圖片中文字提取、模擬用戶行為等方式來嘗試繞過。
  • 分布式調度:單機的吞吐量和性能總是有瓶頸的,而分布式爬蟲與其他分布式系統一樣,需要考慮分布式治理、數據一致性、任務調度等多個方面的問題。筆者個人的感覺是應該將爬蟲的工作節點盡可能地無狀態化,以 Redis 或者 Consul 這樣的能保證高可用性的中心存儲存放整個爬蟲集群的狀態。
  • 在線有價值頁面預判:Google 經典的 PageRank 能夠基于網絡中的連接信息判斷某個 URL 的有價值程度,從而優先索引或者抓取有價值的頁面。而像 Anthelion 這樣的智能解析工具能夠基于之前的頁面提取內容的有價值程度來預判某個 URL 是否有抓取的必要。
  • 頁面內容提取與存儲:對于網頁中的結構化或者非結構化的內容實體提取是自然語言處理中的常見任務之一,而自動從海量數據中提取出有意義的內容也涉及到機器學習、大數據處理等多個領域的知識。我們可以使用 Hadoop MapReduce、Spark、Flink 等離線或者流式計算引擎來處理海量數據,使用詞嵌入、主題模型、LSTM 等等機器學習技術來分析文本,可以使用 HBase、ElasticSearch 來存儲或者對文本建立索引。

筆者本意并非想重新造個輪子,不過在改造我司某個簡單的命令式爬蟲的過程中發現,很多的調度與監控操作應該交由框架完成。Node.js 在開發大規模分布式應用程序的一致性(JavaScript 的不規范)與性能可能不如 Java 或者 Go。但是正如筆者在上文中提及,JavaScript 的優勢在于能夠通過同構代碼同時運行在客戶端與服務端,那么未來對于解析這一步完全可以在客戶端調試完畢然后直接將代碼運行在服務端,這對于構建靈活多變的解析可能有一定意義。

總而言之,我只是想有一個可擴展、能監控、簡單易用的爬蟲框架,所以我快速擼了一個 declarative-crawler,目前只是處于原型階段,尚未發布到 npm 中;希望有興趣的大大不吝賜教,特別是發現了有同類型的框架可以吱一聲,我看看能不能拿來主義,多多學習。

設計思想與架構概覽

當筆者幾年前編寫***個爬蟲時,整體思路是典型的命令式編程,即先抓取再解析,***持久化存儲,就如下述代碼:

  1. await fetchListAndContentThenIndex( 
  2.     'jsgc'
  3.     section.name
  4.     section.menuCode, 
  5.     section.category 
  6. ).then(() => { 
  7. }).catch(error => { 
  8.     console.log(error); 
  9. }); 

命令式編程相較于聲明式編程耦合度更高,可測試性與可控性更低;就好像從 jQuery 切換到 React、Angular、Vue.js 這樣的框架,我們應該盡可能將業務之外的事情交由工具,交由框架去管理與解決,這樣也會方便我們進行自定義地監控??偨Y而言,筆者的設計思想主要包含以下幾點:

  • 關注點分離,整個架構分為了爬蟲調度 CrawlerScheduler、Crawler、Spider、dcEmitter、Store、KoaServer、MonitorUI 等幾個部分,盡可能地分離職責。
  • 聲明式編程,每個蜘蛛的生命周期包含抓取、抽取、解析與持久化存儲這幾個部分;開發者應該獨立地聲明這幾個部分,而完整的調用與調度應該由框架去完成。
  • 分層獨立可測試,以爬蟲的生命周期為例,抽取與解析應當聲明為純函數,而抓取與持久化存儲更多的是面向業務,可以進行 Mock 或者包含副作用進行測試。

整個爬蟲網絡架構如下所示,目前全部代碼參考這里。

自定義蜘蛛與爬蟲

我們以抓取某個在線列表與詳情頁為例,首先我們需要針對兩個頁面構建蜘蛛,注意,每個蜘蛛負責針對某個 URL 進行抓取與解析,用戶應該首先編寫列表爬蟲,其需要聲明 model 屬性、復寫 before_extract、parse 與 persist 方法,各個方法會被串行調用。另一個需要注意的是,我們爬蟲可能會外部傳入一些配置信息,統一的聲明在了 extra 屬性內,這樣在持久化時也能用到。

  1. type ExtraType = { 
  2.   module?: string, 
  3.   name?: string, 
  4.   menuCode?: string, 
  5.   category?: string 
  6. }; 
  7.  
  8. export default class UAListSpider extends Spider { 
  9.  
  10.   displayName = "通用公告列表蜘蛛"
  11.  
  12.   extra: ExtraType = {}; 
  13.  
  14.   model = { 
  15.     $announcements: 'tr[height="25"]' 
  16.   }; 
  17.  
  18.   constructor(extra: ExtraType) { 
  19.     super(); 
  20.  
  21.     this.extra = extra; 
  22.   } 
  23.  
  24.   before_extract(pageHTML: string) { 
  25.     return pageHTML.replace(/<TR height=\d*>/gim, "<tr height=25>"); 
  26.   } 
  27.  
  28.   parse(pageElements: Object) { 
  29.     let announcements = []; 
  30.  
  31.     let announcementsLength = pageElements.$announcements.length; 
  32.  
  33.     for (let i = 0; i < announcementsLength; i++) { 
  34.       let $announcement = $(pageElements.$announcements[i]); 
  35.  
  36.       let $a = $announcement.find("a"); 
  37.       let title = $a.text(); 
  38.       let href = $a.attr("href"); 
  39.       let date = $announcement.find('td[align="right"]').text(); 
  40.  
  41.       announcements.push({ title: title, datedate, href: href }); 
  42.     } 
  43.  
  44.     return announcements; 
  45.   } 
  46.  
  47.   /** 
  48.    * @function 對采集到的數據進行持久化更新 
  49.    * @param pageObject 
  50.    */ 
  51.   async persist(announcements): Promise<boolean> { 
  52.     let flag = true
  53.  
  54.     // 這里每個 URL 對應一個公告數組 
  55.     for (let announcement of announcements) { 
  56.       try { 
  57.         await insertOrUpdateAnnouncement({ 
  58.           ...this.extra, 
  59.           ...announcement, 
  60.           infoID: href2infoID(announcement.href) 
  61.         }); 
  62.       } catch (err) { 
  63.         flag = false
  64.       } 
  65.     } 
  66.  
  67.     return flag; 
  68.   } 

我們可以針對這個蜘蛛進行單獨測試,這里使用 Jest。注意,這里為了方便描述沒有對抽取、解析等進行單元測試,在大型項目中我們是建議要加上這些純函數的測試用例。

  1. var expect = require("chai").expect; 
  2.  
  3. import UAListSpider from "../../src/universal_announcements/UAListSpider.js"
  4.  
  5. let uaListSpider: UAListSpider = new UAListSpider({ 
  6.   module: "jsgc"
  7.   name"房建市政招標公告-服務類"
  8.   menuCode: "001001/001001001/00100100100"
  9.   category: "1" 
  10. }).setRequest( 
  11.   "http://ggzy.njzwfw.gov.cn/njggzy/jsgc/001001/001001001/001001001001/?Paging=1"
  12.   {} 
  13. ); 
  14.  
  15. test("抓取公共列表", async () => { 
  16.   let announcements = await uaListSpider.run(false); 
  17.  
  18.   expect(announcements, "返回數據為列表并且長度大于10").to.have.length.above(2); 
  19. }); 
  20.  
  21. test("抓取公共列表 并且進行持久化操作", async () => { 
  22.   let announcements = await uaListSpider.run(true); 
  23.  
  24.   expect(announcements, "返回數據為列表并且長度大于10").to.have.length.above(2); 
  25. }); 

同理,我們可以定義對于詳情頁的蜘蛛:

  1. export default class UAContentSpider extends Spider { 
  2.   displayName = "通用公告內容蜘蛛"
  3.  
  4.   model = { 
  5.     // 標題 
  6.     $title: "#tblInfo #tdTitle b"
  7.  
  8.     // 時間 
  9.     $time"#tblInfo #tdTitle font"
  10.  
  11.     // 內容 
  12.     $content: "#tblInfo #TDContent" 
  13.   }; 
  14.  
  15.   parse(pageElements: Object) { 
  16.     ... 
  17.   } 
  18.  
  19.   async persist(announcement: Object) { 
  20.     ... 
  21.   } 

在定義完蜘蛛之后,我們可以定義負責爬取整個系列任務的 Crawler,注意,Spider 僅負責爬取單個頁面,而分頁等操作是由 Crawler 進行:

  1. /** 
  2.  * @function 通用的爬蟲 
  3.  */ 
  4. export default class UACrawler extends Crawler { 
  5.   displayName = "通用公告爬蟲"
  6.  
  7.   /** 
  8.    * @構造函數 
  9.    * @param config 
  10.    * @param extra 
  11.    */ 
  12.   constructor(extra: ExtraType) { 
  13.     super(); 
  14.  
  15.     extra && (this.extra = extra); 
  16.   } 
  17.  
  18.   initialize() { 
  19.     // 構建所有的爬蟲 
  20.     let requests = []; 
  21.  
  22.     for (let i = startPage; i < endPage + 1; i++) { 
  23.       requests.push( 
  24.         buildRequest({ 
  25.           ...this.extra, 
  26.           page: i 
  27.         }) 
  28.       ); 
  29.     } 
  30.  
  31.     this.setRequests(requests) 
  32.       .setSpider(new UAListSpider(this.extra)) 
  33.       .transform(announcements => { 
  34.         if (!Array.isArray(announcements)) { 
  35.           throw new Error("爬蟲連接失敗!"); 
  36.         } 
  37.         return announcements.map(announcement => ({ 
  38.           url: `http://ggzy.njzwfw.gov.cn/${announcement.href}` 
  39.         })); 
  40.       }) 
  41.       .setSpider(new UAContentSpider(this.extra)); 
  42.   } 

一個 Crawler 最關鍵的就是 initialize 函數,需要在其中完成爬蟲的初始化。首先我們需要構造所有的種子鏈接,這里既是多個列表頁;然后通過 setSpider 方法加入對應的蜘蛛。不同蜘蛛之間通過自定義的 Transformer 函數來從上一個結果中抽取出所需要的鏈接傳入到下一個蜘蛛中。至此我們爬蟲網絡的關鍵組件定義完畢。

本地運行

定義完 Crawler 之后,我們可以通過將爬蟲注冊到 CrawlerScheduler 來運行爬蟲:

  1. const crawlerScheduler: CrawlerScheduler = new CrawlerScheduler(); 
  2.  
  3. let uaCrawler = new UACrawler({ 
  4.   module: "jsgc"
  5.   name"房建市政招標公告-服務類"
  6.   menuCode: "001001/001001001/00100100100"
  7.   category: "1" 
  8. }); 
  9.  
  10. crawlerScheduler.register(uaCrawler); 
  11.  
  12. dcEmitter.on("StoreChange", () => { 
  13.   console.log("-----------" + new Date() + "-----------"); 
  14.   console.log(store.crawlerStatisticsMap); 
  15. }); 
  16.  
  17. crawlerScheduler.run().then(() => {}); 

這里的 dcEmitter 是整個狀態的中轉站,如果選擇使用本地運行,可以自己監聽 dcEmitter 中的事件:

  1. -----------Wed Apr 19 2017 22:12:54 GMT+0800 (CST)----------- 
  2. { UACrawler:  
  3.    CrawlerStatistics { 
  4.      isRunning: true
  5.      spiderStatisticsList: { UAListSpider: [Object], UAContentSpider: [Object] }, 
  6.      instance:  
  7.       UACrawler { 
  8.         name'UACrawler'
  9.         displayName: '通用公告爬蟲'
  10.         spiders: [Object], 
  11.         transforms: [Object], 
  12.         requests: [Object], 
  13.         isRunning: true
  14.         extra: [Object] }, 
  15.      lastStartTime: 2017-04-19T14:12:51.373Z } } 

服務端運行

我們也可以以服務的方式運行爬蟲:

  1. const crawlerScheduler: CrawlerScheduler = new CrawlerScheduler(); 
  2.  
  3. let uaCrawler = new UACrawler({ 
  4.   module: "jsgc"
  5.   name"房建市政招標公告-服務類"
  6.   menuCode: "001001/001001001/00100100100"
  7.   category: "1" 
  8. }); 
  9.  
  10. crawlerScheduler.register(uaCrawler); 
  11.  
  12. new CrawlerServer(crawlerScheduler).run().then(()=>{},(error)=>{console.log(error)}); 

此時會啟動框架內置的 Koa 服務器,允許用戶通過 RESTful 接口來控制爬蟲網絡與獲取當前狀態。

接口說明

關鍵字段

  • 爬蟲
  1. // 判斷爬蟲是否正在運行 
  2. isRunning: boolean = false
  3.  
  4. // 爬蟲***一次激活時間 
  5. lastStartTime: Date
  6.  
  7. // 爬蟲***一次運行結束時間 
  8. lastFinishTime: Date
  9.  
  10. // 爬蟲***的異常信息 
  11. lastError: Error; 
  • 蜘蛛
  1. // ***一次運行時間 
  2. lastActiveTime: Date
  3.  
  4. // 平均總執行時間 / ms 
  5. executeDuration: number = 0; 
  6.  
  7. // 爬蟲次數統計 
  8. count: number = 0; 
  9.  
  10. // 異常次數統計 
  11. errorCount: number = 0; 
  12.  
  13. countByTime: { [number]: number } = {}; 

localhost:3001/ 獲取當前爬蟲運行狀態

  • 尚未啟動
  1.     { 
  2.         name"UACrawler"
  3.         displayName: "通用公告爬蟲"
  4.         isRunning: false
  5.     } 
  • 正常返回
  1.     { 
  2.         name"UACrawler"
  3.         displayName: "通用公告爬蟲"
  4.         isRunning: true
  5.         lastStartTime: "2017-04-19T06:41:55.407Z" 
  6.     } 
  • 出現錯誤
  1.     { 
  2.         name"UACrawler"
  3.         displayName: "通用公告爬蟲"
  4.         isRunning: true
  5.         lastStartTime: "2017-04-19T06:46:05.410Z"
  6.         lastError: { 
  7.             spiderName: "UAListSpider"
  8.             message: "抓取超時"
  9.             url: "http://ggzy.njzwfw.gov.cn/njggzy/jsgc/001001/001001001/001001001001?Paging=1"
  10.             time"2017-04-19T06:47:05.414Z" 
  11.         } 
  12.     } 

localhost:3001/start 啟動爬蟲

  1.     message:"OK" 

localhost:3001/status 返回當前系統狀態

  1.     "cpu":0, 
  2.     "memory":0.9945211410522461 

localhost:3001/UACrawler 根據爬蟲名查看爬蟲運行狀態

  1. [   
  2.    {   
  3.       "name":"UAListSpider"
  4.       "displayName":"通用公告列表蜘蛛"
  5.       "count":6, 
  6.       "countByTime":{   
  7.          "0":0, 
  8.          "1":0, 
  9.          "2":0, 
  10.          "3":0, 
  11.          ... 
  12.          "58":0, 
  13.          "59":0 
  14.       }, 
  15.       "lastActiveTime":"2017-04-19T06:50:06.935Z"
  16.       "executeDuration":1207.4375, 
  17.       "errorCount":0 
  18.    }, 
  19.    {   
  20.       "name":"UAContentSpider"
  21.       "displayName":"通用公告內容蜘蛛"
  22.       "count":120, 
  23.       "countByTime":{   
  24.          "0":0, 
  25.          ... 
  26.          "59":0 
  27.       }, 
  28.       "lastActiveTime":"2017-04-19T06:51:11.072Z"
  29.       "executeDuration":1000.1596102359835, 
  30.       "errorCount":0 
  31.    } 

自定義監控界面

CrawlerServer 提供了 RESTful API 來返回當前爬蟲的狀態信息,我們可以利用 React 或者其他框架來快速搭建監控界面。

【本文是51CTO專欄作者“張梓雄 ”的原創文章,如需轉載請通過51CTO與作者聯系】

戳這里,看該作者更多好文

責任編輯:武曉燕 來源: 51CTO專欄
相關推薦

2021-12-25 22:29:57

Node.js 微任務處理事件循環

2025-07-24 06:54:11

Node.jsCPU負載

2021-12-18 07:42:15

Ebpf 監控 Node.js

2015-03-10 10:59:18

Node.js開發指南基礎介紹

2013-11-01 09:34:56

Node.js技術

2011-10-25 09:28:30

Node.js

2012-02-03 09:25:39

Node.js

2020-05-29 15:33:28

Node.js框架JavaScript

2012-10-24 14:56:30

IBMdw

2011-11-10 08:55:00

Node.js

2011-11-01 10:30:36

Node.js

2011-09-08 13:46:14

node.js

2011-09-09 14:23:13

Node.js

2011-09-02 14:47:48

Node

2015-07-21 16:23:22

Node.js構建分布式

2021-11-06 18:40:27

js底層模塊

2021-09-26 05:06:04

Node.js模塊機制

2011-11-02 09:04:15

Node.js

2025-07-21 01:00:00

UDP性能QPS

2017-09-01 08:37:54

Node.jsGhost1.8.1 版本
點贊
收藏

51CTO技術棧公眾號

日韩中文字幕在线视频| 欧美色播在线播放| 国产福利一区二区三区在线观看| 日本三级免费看| 欧美禁忌电影网| 欧美剧在线免费观看网站| 国内自拍中文字幕| 欧美精品久久久久久久久久丰满| 蜜桃视频在线观看一区二区| 欧美成人免费全部| 亚洲综合网在线观看| 成人免费观看49www在线观看| 性做久久久久久免费观看欧美| 日本精品一区二区三区高清 久久| 国产日韩成人内射视频| 天堂中文在线视频| 韩国三级在线一区| 欧美一区二区三区精品电影| 亚洲精品一区二区三区在线播放| 女同一区二区三区| 91精品国产麻豆国产自产在线 | 黄色在线视频观看网站| 国产在线播精品第三| 日韩美女主播视频| 精品视频一区二区在线观看| 首页国产精品| 亚洲免费高清视频| 日本美女视频网站| 99精品美女视频在线观看热舞| 欧美色视频日本高清在线观看| 好吊色视频988gao在线观看| 91亚洲欧美| 国产亚洲欧美在线| 久久青青草综合| 亚洲第一页综合| 国产精品中文字幕日韩精品| 国产女人18毛片水18精品| 自拍偷拍18p| 国产农村妇女精品一区二区| 国产69精品久久久久9999| 污软件在线观看| 日本黄色精品| 一区二区三欧美| 国产人妻一区二区| 国产精品一在线观看| 日韩电影中文字幕| 亚洲高清无码久久| 97久久精品| 日韩一区二区电影网| 一区二区三区四区毛片| 国产亚洲精彩久久| 欧美日韩一区中文字幕| 国产又猛又黄的视频| 日韩免费小视频| 色欧美88888久久久久久影院| 成人三级视频在线播放 | 国产日韩欧美在线观看| 最近中文字幕在线视频| 日本美女一区二区三区| 国产精品视频久久久久| 亚洲天堂自拍偷拍| 久久福利视频一区二区| 成人精品在线视频| 国产草草影院ccyycom| 国产精品一区二区在线播放 | 亚洲精品午夜久久久| 在线观看18视频网站| www国产在线观看 | 亚洲欧美一区二区三区在线观看| 久久国产99| 国产精品电影在线观看| 国产精品sm调教免费专区| 久久精品国产色蜜蜜麻豆| 成人一区二区电影| 高h放荡受浪受bl| 91亚洲大成网污www| 秋霞毛片久久久久久久久| 成人亚洲综合天堂| 亚洲欧美一区二区三区极速播放| 激情五月六月婷婷| 亚洲精华液一区二区三区| 在线中文字幕不卡| 在线观看免费av网址| 久久精品免视看国产成人| 337p日本欧洲亚洲大胆精品| 91精品国产自产| 日韩成人激情| 久久久久免费视频| 波多野结衣影片| 国产精品一区二区在线播放| 久久综合一区二区三区| 色视频在线免费观看| 亚洲一区二区视频在线观看| 97在线免费公开视频| 99re8精品视频在线观看| 亚洲成年人在线播放| 中文字幕第24页| 红桃视频欧美| 国产精品一区专区欧美日韩| 欧美特黄一级视频| 国产精品情趣视频| 浮妇高潮喷白浆视频| 2019中文亚洲字幕| 亚洲美女精品成人在线视频| 私库av在线播放| 日韩高清一区在线| 国产精品一区二区在线观看| 一区二区三区视频在线观看视频| 亚洲成人激情av| www.com黄色片| 久久精品凹凸全集| xvideos亚洲| 亚洲毛片一区二区三区| 成人午夜在线视频| 男人天堂成人网| 色8久久影院午夜场| 精品奇米国产一区二区三区| av免费播放网站| 久久国产精品99国产| 国产伦视频一区二区三区| 麻豆视频网站在线观看| 在线免费观看一区| 国产精品300页| 欧美色123| 亚洲综合中文字幕68页| 日本在线免费看| 欧洲视频一区二区| 香蕉网在线播放| 日韩视频不卡| 国产伦视频一区二区三区| 日韩三级电影视频| 91精品国产麻豆国产自产在线| 日本猛少妇色xxxxx免费网站| 久久aⅴ国产紧身牛仔裤| 精品一区久久久久久| rebdb初裸写真在线观看| 日韩欧美在线123| 亚洲综合网在线| 国精品**一区二区三区在线蜜桃 | 国产精品豆花视频| 精品无人区卡一卡二卡三乱码免费卡| 欧美多人爱爱视频网站| 国产免费久久久| 中文字幕中文字幕在线一区| 亚洲免费一级视频| 日韩精品免费| 国产在线日韩在线| 日韩在线观看www| 欧美日韩国产高清一区二区三区| 黄大色黄女片18免费| 男女性色大片免费观看一区二区| 日本精品一区二区| 天堂久久午夜av| 色一区av在线| 国产精选久久久| 亚洲乱码中文字幕综合| 一级全黄裸体片| 激情久久久久久久| 精品视频高清无人区区二区三区| 色综合桃花网| 亚洲香蕉成人av网站在线观看| 成人一二三四区| 国产精品久久久久久久久图文区| 香蕉视频999| 欧美日韩国产精品一区二区亚洲| 国产精品视频在线免费观看| 九色porny丨国产首页在线| 亚洲免费av网址| 亚洲综合精品国产一区二区三区| 亚洲欧美一区二区三区孕妇| 中国极品少妇xxxx| 日日摸夜夜添夜夜添国产精品 | 好吊日精品视频| 精品一区久久久| 国产精品久久久久77777丨| 久久精品国产一区| 免费观看黄色一级视频| 一本大道综合伊人精品热热| 日本不卡一二区| 成人性生交大片免费看中文网站| 国产精品宾馆在线精品酒店| 欧美影院三区| 9a蜜桃久久久久久免费| 中文字幕在线看片| 久久亚洲精品一区| 天堂av网在线| 777午夜精品视频在线播放| 国产一级生活片| 国产婷婷色一区二区三区| 亚洲一区二区图片| 嫩草成人www欧美| 2021狠狠干| 久久99国产精品视频| 91久久久久久久久久| 国产伦久视频在线观看| 日韩在线资源网| 日韩中文字幕综合| 欧美日韩国产一级| 女人十八岁毛片| 亚洲人亚洲人成电影网站色| 少妇精品一区二区三区| 国产一区二区在线观看免费 | 日韩欧美另类一区二区| 欧美乱人伦中文字幕在线| 国产黄色在线| 精品国产精品网麻豆系列| 中文字幕一区二区在线视频| 欧美日韩国产激情| 欧美日韩国产精品综合| 中文一区在线播放| 一本色道综合久久欧美日韩精品 | 亚洲男人的天堂在线观看| 9.1在线观看免费| 久久精品国产99国产精品| 浮妇高潮喷白浆视频| 欧美人成在线| 一本一本a久久| 中文精品一区二区| 国产一区二区精品免费| 免费看一区二区三区| 国产精品一区二区3区| 中文在线а√天堂| 午夜免费在线观看精品视频| 四虎影视国产在线视频| 久久精品国产综合| 2017亚洲天堂1024| 国产亚洲精品久久| 色综合888| 亚洲国产精品va在线看黑人动漫 | 亚洲香蕉伊综合在人在线视看| 少妇又色又爽又黄的视频| 精品国产三级a在线观看| va婷婷在线免费观看| 91精品国产综合久久婷婷香蕉| 中日精品一色哟哟| 欧美午夜影院一区| 看黄色一级大片| 91激情五月电影| 黄色在线免费观看| 欧美日韩一区二区三区| 午夜精品久久久久久久久久久久久蜜桃 | 精品一区二区三区自拍图片区 | 美国黄色小视频| 国产精品久99| 中文字幕91视频| 国产精品欧美极品| 又色又爽的视频| 国产精品免费人成网站| 九九九视频在线观看| 日本一区二区三级电影在线观看| 在线国产视频一区| 国产欧美日韩在线观看| 久久久国产一级片| 中文字幕一区二区视频| 久草福利资源在线| 亚洲色图丝袜美腿| 免费一级肉体全黄毛片| 亚洲一二三级电影| www.日本少妇| 国产中文在线| 亚洲乱码一区av黑人高潮 | 国产精品毛片无码| 97在线资源站| 日韩欧美国产大片| 日韩精品久久久| 久久综合88| 91传媒免费视频| 日韩午夜激情| 国产成人精品视频ⅴa片软件竹菊| 热久久久久久久| 中文字幕avav| 99国产精品久久久久| 成人乱码一区二区三区av| 国产精品美女一区二区三区 | 欧美日韩一区二区在线| 精品人妻一区二区三区潮喷在线| 欧美三级电影一区| 精品美女www爽爽爽视频| 日韩电影第一页| 午夜视频成人| 欧美精品激情视频| 成人激情综合| av电影成人| 国产免费av一区二区三区| 中国成人亚色综合网站| 99国产精品| 成人日韩在线视频| av成人免费在线观看| 很污很黄的网站| 亚洲狠狠爱一区二区三区| 欧美视频xxxx| 亚洲成人网久久久| 2021av在线| 91国内在线视频| 国产精品一区二区三区av| 久久婷婷人人澡人人喊人人爽| 色喇叭免费久久综合网| 日韩欧美一区二| 韩国午夜理伦三级不卡影院| 91精品人妻一区二区| 亚洲精品视频在线看| 免费av中文字幕| 欧美xxx久久| 在线观看美女网站大全免费| 69久久夜色精品国产7777| 国产精品视频一区二区三区综合| 欧美日韩最好看的视频| 亚洲无线视频| 亚洲精品mv在线观看| 国产无遮挡一区二区三区毛片日本| 国产一级生活片| 日韩一级在线观看| freemovies性欧美| 欧洲s码亚洲m码精品一区| 国产suv精品一区二区四区视频| 亚洲一卡二卡三卡四卡无卡网站在线看| 99亚洲伊人久久精品影院红桃| 日韩av片免费观看| 国产三级精品三级在线专区| 永久免费看片在线播放| 日韩一级大片在线观看| 色欧美激情视频在线| 国产精品美乳一区二区免费| 亚洲色图美女| 夫妻免费无码v看片| 成人av中文字幕| 久久国产露脸精品国产| 91精品一区二区三区在线观看| 成人影视在线播放| 国产成人涩涩涩视频在线观看| 欧美美女啪啪| 5月婷婷6月丁香| av在线一区二区| 国产午夜小视频| 亚洲成人久久久久| 超碰在线cao| 国内精品视频免费| 亚洲另类自拍| 国产伦精品一区三区精东| 亚洲国产欧美在线人成| 亚洲av无码一区二区乱子伦| 欧美成aaa人片在线观看蜜臀| 亚洲ww精品| 亚洲视频在线播放| 992tv人人草| 国产传媒久久文化传媒| 卡通动漫亚洲综合| 欧美一级片免费看| 中文字幕有码在线视频| 亚洲影院色无极综合| 欧美国产先锋| 美女伦理水蜜桃4| 五月婷婷激情综合| 亚洲欧美日韩综合在线| 青草青草久热精品视频在线观看| 亚洲自拍电影| 欧美在线观看视频网站| 国产精品午夜在线观看| 国产精品国产一区二区三区四区| 久久精品一区中文字幕| 精品一区二区三区亚洲| 福利在线一区二区| 91农村精品一区二区在线| 中文字幕成人免费视频| 欧美jizz18| 六月婷婷久久| 日韩国产欧美三级| av激情在线观看| 亚洲第一网中文字幕| 3d欧美精品动漫xxxx无尽| 国产精品h视频| 成人丝袜高跟foot| 波多野结衣人妻| 裸体女人亚洲精品一区| 国产在线播放精品| 99久久久无码国产精品6| 国产精品美女久久久久久久久久久 | 亚洲久久视频| 国产视频三区四区| 日韩一区二区三区在线观看| 小草在线视频免费播放| 亚洲一区二区不卡视频| 粉嫩一区二区三区性色av| 国产精品久久久久久久久久精爆| 久久精品亚洲国产| 精品视频自拍| 中文字幕亚洲乱码| 亚洲成人动漫av| 在线观看的av| 国产伦精品一区二区三区高清版| 天堂成人国产精品一区| 中文字幕在线观看成人| 亚洲欧美中文日韩在线| 色播一区二区| 性欧美极品xxxx欧美一区二区| 亚洲精品午夜久久久| 福利片在线看| 国产伦精品一区二区三区照片| 蜜臀a∨国产成人精品| 日韩精品无码一区二区|