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

NodeJs爬蟲抓取古代典籍,共計16000個頁面心得體會總結及項目分享

開發 前端
之前研究數據,零零散散的寫過一些數據抓取的爬蟲,不過寫的比較隨意。有很多地方現在看起來并不是很合理 這段時間比較閑,本來是想給之前的項目做重構的。后來 利用這個周末,索性重新寫了一個項目,就是本項目 guwen-spider。目前這個爬蟲還是比較簡單的類型的, 直接抓取頁面,然后在頁面中提取數據,保存數據到數據庫。

前言

之前研究數據,零零散散的寫過一些數據抓取的爬蟲,不過寫的比較隨意。有很多地方現在看起來并不是很合理 這段時間比較閑,本來是想給之前的項目做重構的。

后來 利用這個周末,索性重新寫了一個項目,就是本項目 guwen-spider。目前這個爬蟲還是比較簡單的類型的, 直接抓取頁面,然后在頁面中提取數據,保存數據到數據庫。

通過與之前寫的對比,我覺得難點在于整個程序的健壯性,以及相應的容錯機制。在昨天寫代碼的過程中其實也有反映, 真正的主體代碼其實很快就寫完了 ,花了大部分時間是在

做穩定性的調試, 以及尋求一種更合理的方式來處理數據與流程控制的關系。

NodeJs爬蟲抓取古代典籍,共計16000個頁面心得體會總結及項目分享

背景

項目的背景是抓取一個一級頁面是目錄列表 ,點擊一個目錄進去 是一個章節 及篇幅列表 ,點擊章節或篇幅進入具體的內容頁面。

概述

本項目github地址 : guwen-spider (PS:***面還有彩蛋 ~~逃

項目技術細節

項目大量用到了 ES7 的async 函數, 更直觀的反應程序了的流程。為了方便,在對數據遍歷的過程中直接使用了著名的async這個庫,所以不可避免的還是用到了回調promise ,因為數據的處理發生在回調函數中,不可避免的會遇到一些數據傳遞的問題,其實也可以直接用ES7的async await 寫一個方法來實現相同的功能。這里其實最贊的一個地方是使用了 Class 的 static 方法封裝對數據庫的操作, static 顧名思義 靜態方法 就跟 prototype 一樣 ,不會占用額外空間。

項目主要用到了

  1. ES7的 async await 協程做異步有關的邏輯處理。
  2. 使用 npm的 async庫 來做循環遍歷,以及并發請求操作。
  3. 使用 log4js 來做日志處理
  4. 使用 cheerio 來處理dom的操作。
  5. 使用 mongoose 來連接mongoDB 做數據的保存以及操作。

目錄結構

  • ├── bin // 入口
  • │ ├── booklist.js // 抓取書籍邏輯
  • │ ├── chapterlist.js // 抓取章節邏輯
  • │ ├── content.js // 抓取內容邏輯
  • │ └── index.js // 程序入口
  • ├── config // 配置文件
  • ├── dbhelper // 數據庫操作方法目錄
  • ├── logs // 項目日志目錄
  • ├── model // mongoDB 集合操作實例
  • ├── node_modules
  • ├── utils // 工具函數
  • ├── package.json

項目實現方案分析

項目是一個典型的多級抓取案例,目前只有三級,即 書籍列表, 書籍項對應的 章節列表,一個章節鏈接對應的內容。 抓取這樣的結構可以采用兩種方式, 一是 直接從外層到內層 內層抓取完以后再執行下一個外層的抓取, 還有一種就是先把外層抓取完成保存到數據庫,然后根據外層抓取到所有內層章節的鏈接,再次保存,然后從數據庫查詢到對應的鏈接單元 對之進行內容抓取。這兩種方案各有利弊,其實兩種方式我都試過, 后者有一個好處,因為對三個層級是分開抓取的, 這樣就能夠更方便,盡可能多的保存到對應章節的相關數據。 可以試想一下 ,如果采用前者 按照正常的邏輯

對一級目錄進行遍歷抓取到對應的二級章節目錄, 再對章節列表進行遍歷 抓取內容,到第三級 內容單元抓取完成 需要保存時,如果需要很多的一級目錄信息,就需要 這些分層的數據之間進行數據傳遞 ,想想其實應該是比較復雜的一件事情。所以分開保存數據 一定程度上避開了不必要的復雜的數據傳遞。

目前我們考慮到 其實我們要抓取到的古文書籍數量并不多,古文書籍大概只有180本囊括了各種經史。其和章節內容本身是一個很小的數據 ,即一個集合里面有180個文檔記錄。 這180本書所有章節抓取下來一共有一萬六千個章節,對應需要訪問一萬六千個頁面爬取到對應的內容。所以選擇第二種應該是合理的。

項目實現

主程有三個方法 bookListInit ,chapterListInit,contentListInit, 分別是抓取書籍目錄,章節列表,書籍內容的方法對外公開暴露的初始化方法。通過async 可以實現對這三個方法的運行流程進行控制,書籍目錄抓取完成將數據保存到數據庫,然后執行結果返回到主程序,如果運行成功 主程序則執行根據書籍列表對章節列表的抓取,同理對書籍內容進行抓取。

項目主入口

 

  1. /** 
  2.  * 爬蟲抓取主入口 
  3.  */ 
  4. const start = async() => { 
  5.     let booklistRes = await bookListInit(); 
  6.     if (!booklistRes) { 
  7.         logger.warn('書籍列表抓取出錯,程序終止...'); 
  8.         return
  9.     } 
  10.     logger.info('書籍列表抓取成功,現在進行書籍章節抓取...'); 
  11.  
  12.     let chapterlistRes = await chapterListInit(); 
  13.     if (!chapterlistRes) { 
  14.         logger.warn('書籍章節列表抓取出錯,程序終止...'); 
  15.         return
  16.     } 
  17.     logger.info('書籍章節列表抓取成功,現在進行書籍內容抓取...'); 
  18.  
  19.     let contentListRes = await contentListInit(); 
  20.     if (!contentListRes) { 
  21.         logger.warn('書籍章節內容抓取出錯,程序終止...'); 
  22.         return
  23.     } 
  24.     logger.info('書籍內容抓取成功'); 
  25. // 開始入口 
  26. if (typeof bookListInit === 'function' && typeof chapterListInit === 'function') { 
  27.     // 開始抓取 
  28.     start(); 

引入的 bookListInit ,chapterListInit,contentListInit, 三個方法

booklist.js

 

  1. /** 
  2.  * 初始化入口 
  3.  */ 
  4. const chapterListInit = async() => { 
  5.     const list = await bookHelper.getBookList(bookListModel); 
  6.     if (!list) { 
  7.         logger.error('初始化查詢書籍目錄失敗'); 
  8.     } 
  9.     logger.info('開始抓取書籍章節列表,書籍目錄共:' + list.length + '條'); 
  10.     let res = await asyncGetChapter(list); 
  11.     return res; 
  12. }; 

chapterlist.js

 

  1. /** 
  2.  * 初始化入口 
  3.  */ 
  4. const contentListInit = async() => { 
  5.     //獲取書籍列表 
  6.     const list = await bookHelper.getBookLi(bookListModel); 
  7.     if (!list) { 
  8.         logger.error('初始化查詢書籍目錄失敗'); 
  9.         return
  10.     } 
  11.     const res = await mapBookList(list); 
  12.     if (!res) { 
  13.         logger.error('抓取章節信息,調用 getCurBookSectionList() 進行串行遍歷操作,執行完成回調出錯,錯誤信息已打印,請查看日志!'); 
  14.         return
  15.     } 
  16.     return res; 

內容抓取的思考

書籍目錄抓取其實邏輯非常簡單,只需要使用async.mapLimit做一個遍歷就可以保存數據了,但是我們在保存內容的時候 簡化的邏輯其實就是 遍歷章節列表 抓取鏈接里的內容。但是實際的情況是鏈接數量多達幾萬 我們從內存占用角度也不能全部保存到一個數組中,然后對其遍歷,所以我們需要對內容抓取進行單元化。

普遍的遍歷方式 是每次查詢一定的數量,來做抓取,這樣缺點是只是以一定數量做分類,數據之間沒有關聯,以批量方式進行插入,如果出錯 則容錯會有一些小問題,而且我們想一本書作為一個集合單獨保存會遇到問題。因此我們采用第二種就是以一個書籍單元進行內容抓取和保存。

這里使用了 async.mapLimit(list, 1, (series, callback) => {}) 這個方法來進行遍歷,不可避免的用到了回調,感覺很惡心。async.mapLimit()的第二個參數可以設置同時請求數量。

 

  1. /*  
  2.  * 內容抓取步驟: 
  3.  * ***步得到書籍列表, 通過書籍列表查到一條書籍記錄下 對應的所有章節列表,  
  4.  * 第二步 對章節列表進行遍歷獲取內容保存到數據庫中  
  5.  * 第三步 保存完數據后 回到***步 進行下一步書籍的內容抓取和保存 
  6.  */ 
  7.  
  8. /** 
  9.  * 初始化入口 
  10.  */ 
  11. const contentListInit = async() => { 
  12.     //獲取書籍列表 
  13.     const list = await bookHelper.getBookList(bookListModel); 
  14.     if (!list) { 
  15.         logger.error('初始化查詢書籍目錄失敗'); 
  16.         return
  17.     } 
  18.     const res = await mapBookList(list); 
  19.     if (!res) { 
  20.         logger.error('抓取章節信息,調用 getCurBookSectionList() 進行串行遍歷操作,執行完成回調出錯,錯誤信息已打印,請查看日志!'); 
  21.         return
  22.     } 
  23.     return res; 
  24. /** 
  25.  * 遍歷書籍目錄下的章節列表 
  26.  * @param {*} list  
  27.  */ 
  28. const mapBookList = (list) => { 
  29.     return new Promise((resolve, reject) => { 
  30.         async.mapLimit(list, 1, (series, callback) => { 
  31.             let doc = series._doc; 
  32.             getCurBookSectionList(doc, callback); 
  33.         }, (err, result) => { 
  34.             if (err) { 
  35.                 logger.error('書籍目錄抓取異步執行出錯!'); 
  36.                 logger.error(err); 
  37.                 reject(false); 
  38.                 return
  39.             } 
  40.             resolve(true); 
  41.         }) 
  42.     }) 
  43.  
  44. /** 
  45.  * 獲取單本書籍下章節列表 調用章節列表遍歷進行抓取內容 
  46.  * @param {*} series  
  47.  * @param {*} callback  
  48.  */ 
  49. const getCurBookSectionList = async(series, callback) => { 
  50.  
  51.     let num = Math.random() * 1000 + 1000; 
  52.     await sleep(num); 
  53.     let key = series.key
  54.     const res = await bookHelper.querySectionList(chapterListModel, { 
  55.         keykey 
  56.     }); 
  57.     if (!res) { 
  58.         logger.error('獲取當前書籍: ' + series.bookName + ' 章節內容失敗,進入下一部書籍內容抓取!'); 
  59.         callback(nullnull); 
  60.         return
  61.     } 
  62.     //判斷當前數據是否已經存在 
  63.     const bookItemModel = getModel(key); 
  64.     const contentLength = await bookHelper.getCollectionLength(bookItemModel, {}); 
  65.     if (contentLength === res.length) { 
  66.         logger.info('當前書籍:' + series.bookName + '數據庫已經抓取完成,進入下一條數據任務'); 
  67.         callback(nullnull); 
  68.         return
  69.     } 
  70.     await mapSectionList(res); 
  71.     callback(nullnull); 

數據抓取完了 怎么保存是個問題

這里我們通過key 來給數據做分類,每次按照key來獲取鏈接,進行遍歷,這樣的好處是保存的數據是一個整體,現在思考數據保存的問題

1、可以以整體的方式進行插入

優點 : 速度快 數據庫操作不浪費時間。

缺點 : 有的書籍可能有幾百個章節 也就意味著要先保存幾百個頁面的內容再進行插入,這樣做同樣很消耗內存,有可能造成程序運行不穩定。

2、可以以每一篇文章的形式插入數據庫。

優點 : 頁面抓取即保存的方式 使得數據能夠及時保存,即使后續出錯也不需要重新保存前面的章節,

缺點 : 也很明顯 就是慢 ,仔細想想如果要爬幾萬個頁面 做 幾萬次*N 數據庫的操作 這里還可以做一個緩存器一次性保存一定條數 當條數達到再做保存這樣也是一個不錯的選擇。

 

  1. /** 
  2.  * 遍歷單條書籍下所有章節 調用內容抓取方法 
  3.  * @param {*} list  
  4.  */ 
  5. const mapSectionList = (list) => { 
  6.     return new Promise((resolve, reject) => { 
  7.         async.mapLimit(list, 1, (series, callback) => { 
  8.             let doc = series._doc; 
  9.             getContent(doc, callback) 
  10.         }, (err, result) => { 
  11.             if (err) { 
  12.                 logger.error('書籍目錄抓取異步執行出錯!'); 
  13.                 logger.error(err); 
  14.                 reject(false); 
  15.                 return
  16.             } 
  17.             const bookName = list[0].bookName; 
  18.             const key = list[0].key
  19.  
  20.             // 以整體為單元進行保存 
  21.             saveAllContentToDB(result, bookName, key, resolve); 
  22.  
  23.             //以每篇文章作為單元進行保存 
  24.             // logger.info(bookName + '數據抓取完成,進入下一部書籍抓取函數...'); 
  25.             // resolve(true); 
  26.  
  27.         }) 
  28.     }) 

兩者各有利弊,這里我們都做了嘗試。 準備了兩個錯誤保存的集合,errContentModel, errorCollectionModel,在插入出錯時 分別保存信息到對應的集合中,二者任選其一即可。增加集合來保存數據的原因是 便于一次性查看以及后續操作, 不用看日志。

(PS ,其實完全用 errorCollectionModel 這個集合就可以了 ,errContentModel這個集合可以完整保存章節信息)

 

  1. //保存出錯的數據名稱 
  2. const errorSpider = mongoose.Schema({ 
  3.     chapter: String, 
  4.     section: String, 
  5.     url: String, 
  6.     key: String, 
  7.     bookName: String, 
  8.     author: String, 
  9. }) 
  10. // 保存出錯的數據名稱 只保留key 和 bookName信息 
  11. const errorCollection = mongoose.Schema({ 
  12.     key: String, 
  13.     bookName: String, 
  14. }) 

我們將每一條書籍信息的內容 放到一個新的集合中,集合以key來進行命名。

總結

寫這個項目 其實主要的難點在于程序穩定性的控制,容錯機制的設置,以及錯誤的記錄,目前這個項目基本能夠實現直接運行 一次性跑通整個流程。 但是程序設計也肯定還存在許多問題 ,歡迎指正和交流。

彩蛋

寫完這個項目 做了一個基于React開的前端網站用于頁面瀏覽 和一個基于koa2.x開發的服務端, 整體技術棧相當于是 React + Redux + Koa2 ,前后端服務是分開部署的,各自獨立可以更好的去除前后端服務的耦合性,比如同一套服務端代碼,不僅可以給web端 還可以給 移動端 ,app 提供支持。目前整個一套還很簡陋,但是可以滿足基本的查詢瀏覽功能。希望后期有時間可以把項目變得更加豐富。

項目挺簡單的 ,但是多了一個學習和研究 從前端到服務端的開發的環境。

責任編輯:未麗燕 來源: SegmentFault
相關推薦

2010-04-07 11:36:56

JNCIP

2009-07-03 18:49:07

綜合布線工程實施

2011-04-01 15:22:12

Zabbix配置安裝

2009-11-04 14:45:18

接入網優化

2019-11-11 09:33:09

戴爾

2009-08-28 14:49:19

DHCP服務器管理維護

2009-09-09 18:07:49

CCNA考試資料

2009-04-27 16:04:47

Windows 7微軟操作系統

2011-09-28 13:21:16

軟件項目

2009-08-25 13:57:09

C#泛型集合類型

2009-11-25 17:24:42

無線路由器

2022-05-24 15:55:37

避障小車華為

2009-01-19 20:16:23

Oracle心得體會

2009-07-01 14:28:20

cisco1700路由器配置

2022-11-16 09:57:23

優化接口

2021-10-27 16:28:55

鴻蒙開發者大會華為

2009-07-28 12:52:50

ASP.NET coo

2009-09-03 09:39:42

思科CCIE認證考試心得

2017-02-16 13:46:27

可視化工具數據庫
點贊
收藏

51CTO技術棧公眾號

直接在线观看的三级网址| 特级西西444www高清大视频| 99a精品视频在线观看| 亚洲自拍偷拍欧美| 久久精品欧美| 中文在线字幕免费观| 亚洲电影影音先锋| 亚洲成人动漫在线播放| 欧美成人黑人猛交| 日韩精品毛片| 不卡区在线中文字幕| 国产精品久久久久一区二区| 欧美日韩国产精品一区二区三区| 欧洲亚洲视频| 欧美日韩不卡视频| 亚洲熟妇无码一区二区三区导航| 国产三级视频在线播放线观看| 久久91精品国产91久久小草| 97在线日本国产| 亚洲一区电影在线观看| 日韩精品丝袜美腿| 欧美二区三区91| 欧美激情成人网| 丰满诱人av在线播放| 中文字幕第一区| 国产亚洲情侣一区二区无| 一二三区在线播放| 性欧美暴力猛交另类hd| 欧美第一页在线| 污污视频网站在线免费观看| 欧美一区自拍| 精品国产91乱码一区二区三区| 亚洲不卡视频在线| 最新中文字幕在线播放| 亚洲电影一级黄| 大桥未久一区二区三区| 第一福利在线| 久久久久久久综合狠狠综合| 国产伦精品一区二区三区高清版 | 亚洲成a人片综合在线| 日日夜夜精品网站| 日韩精品一二| 99re这里都是精品| 国产二区不卡| 亚洲精品久久久久久久久久 | 黑人狂躁日本妞一区二区三区| 色乱码一区二区三区熟女| 国产精品秘入口| 久久先锋资源网| 国精产品一区二区| 亚洲国产www| 高清不卡在线观看| 成人av中文| 懂色av成人一区二区三区| 国产精品乡下勾搭老头1| 成人免费黄色网| 中文字幕欧美在线观看| 日本在线不卡视频| 国产精品久久久久久久久久| 波多野结衣日韩| 日本美女视频一区二区| 国产精品久久久久久久9999| 丰满熟女人妻一区二区三| 日韩av一区二区三区| 国产精品久久久久aaaa九色| 国产一级精品毛片| 奇米四色…亚洲| 国产色视频一区| 国产精品久久婷婷| 国产一区二区视频在线播放| 亚洲a中文字幕| 成 人 黄 色 片 在线播放| 国产成人av电影在线观看| 国产精品日韩二区| 涩涩视频在线观看免费| 欧美激情自拍偷拍| 中文精品一区二区三区| av片在线观看| 精品女同一区二区三区在线播放| 人妻有码中文字幕| 亚洲a∨精品一区二区三区导航| 在线观看一区不卡| av亚洲天堂网| 欧美中文高清| 日韩精品免费一线在线观看| 色哟哟精品观看| 91精品国产91久久久久久黑人| 欧美日韩福利在线观看| 久久夜色精品亚洲| 七七婷婷婷婷精品国产| 91在线视频一区| 日本xxxx人| 久久久久久久久蜜桃| 亚洲欧洲三级| 黄色小说在线播放| 色av综合在线| 伦伦影院午夜理论片| 欧美日韩另类图片| 深夜福利一区二区| 国产污片在线观看| 蜜臀精品一区二区三区在线观看 | 欧美大片网址| 日韩一区二区在线视频| 精品无码免费视频| 久久久久久穴| 99国产超薄肉色丝袜交足的后果| 欧洲亚洲精品视频| 一区二区三区中文在线| 日韩免费毛片视频| 成人污污www网站免费丝瓜| 亚洲黄色av女优在线观看 | 欧洲午夜精品久久久| 91麻豆成人精品国产免费网站| 成人精品一区二区三区四区| 午夜免费电影一区在线观看| 91www在线| 777色狠狠一区二区三区| 男女做爰猛烈刺激| 亚洲国产高清一区二区三区| 国产一区二区在线播放| 日本啊v在线| 亚洲午夜一二三区视频| 在线观看免费不卡av| 亚洲国产国产| 久久久久女教师免费一区| 97超碰国产在线| 欧美国产欧美亚州国产日韩mv天天看完整 | 国产普通话bbwbbwbbw| 久久九九全国免费| 97视频在线免费| 国产麻豆一区二区三区| 在线观看日韩视频| 高清乱码免费看污| 99久久精品国产麻豆演员表| 特级西西444| 色噜噜成人av在线| 中文字幕日韩视频| 国产美女www爽爽爽| 91视频com| 五月丁香综合缴情六月小说| xvideos.蜜桃一区二区| 久久久999国产精品| 亚洲一区二区激情| 欧美韩国一区二区| 久久久久久香蕉| 亚洲+变态+欧美+另类+精品| 26uuu久久噜噜噜噜| 天堂av2024| 亚洲成人免费影院| 成人午夜精品无码区| 亚洲精品欧洲| 精品国产乱码久久久久久88av | 亚洲激情图片一区| www激情五月| 欧美成熟视频| 97人人模人人爽视频一区二区| free性欧美hd另类精品| 欧美一级高清片| 欧美成人精品欧美一级| 国产白丝网站精品污在线入口| av动漫在线播放| 91精品国产乱码久久久竹菊| 欧美激情欧美激情在线五月| 亚洲精品成av人片天堂无码| 亚洲国产一区二区视频| 黄色在线免费播放| 在线亚洲自拍| 清纯唯美一区二区三区| 手机看片久久| 神马久久桃色视频| 国产男女猛烈无遮挡| 樱桃国产成人精品视频| 在线看黄色的网站| 老司机精品福利视频| 日韩精品资源| 国产欧美88| 久久免费国产视频| 好男人免费精品视频| 欧美三级一区二区| 黄色a级片在线观看| 成人一级片在线观看| 中文字幕乱码人妻综合二区三区| 欧美亚洲精品在线| 99国产超薄丝袜足j在线观看 | 午夜精品久久久久久久99水蜜桃| 少妇户外露出[11p]| 蜜臀a∨国产成人精品| 欧美一级中文字幕| 亚洲另类春色校园小说| 91精品久久久久| 18aaaa精品欧美大片h| 伊人男人综合视频网| 国产哺乳奶水91在线播放| 精品福利一区二区| 三级黄色录像视频| 成人精品免费网站| 亚洲最大成人在线观看| 亚洲网站视频| 亚洲精品一品区二品区三品区 | 老牛影视免费一区二区| 成人日韩在线| 欧美激情一二三| caoporn国产精品免费视频| 日韩一区二区精品葵司在线| 亚洲GV成人无码久久精品| 亚洲狠狠丁香婷婷综合久久久| 精品无码在线视频| 国产高清精品在线| www.色偷偷.com| 亚洲激情欧美| 中文字幕黄色大片| 九九久久成人| 国产精品香蕉视屏| 亚洲男女网站| 日韩av大片在线| 第四色日韩影片| 久久精品这里热有精品| 经典三级在线| 亚洲国产精品va| 97caocao| 欧美日韩一区二区三区免费看| 亚洲一区欧美在线| 有码一区二区三区| 欧美xxxooo| 国产日产精品一区| 特大黑人巨人吊xxxx| 成人亚洲一区二区一| 中文字幕一区二区在线观看视频| 亚洲在线国产日韩欧美| www婷婷av久久久影片| 第一社区sis001原创亚洲| 蜜桃狠狠色伊人亚洲综合网站| 亚洲精品观看| 亚洲一区二区三| 日韩美女在线| 国产精品日韩在线一区| 国产另类xxxxhd高清| 欧美综合一区第一页| 国产精品蜜芽在线观看| 久久久久久久一区二区三区| 18视频在线观看| 日韩色av导航| 精品176二区| 日韩一中文字幕| 1769在线观看| 中文字幕亚洲一区| www黄在线观看| 一区二区欧美在线| 二区三区在线| 中文字幕亚洲字幕| yw在线观看| 中文字幕亚洲在线| 69xxxx欧美| 精品国产欧美一区二区五十路| av在线三区| 日韩在线视频观看正片免费网站| 69久久夜色| 另类少妇人与禽zozz0性伦| 成人影欧美片| 欧美美最猛性xxxxxx| 免费在线国产视频| 91精品国产自产91精品| 中文一区一区三区高中清不卡免费| 国产91成人在在线播放| 黑人巨大精品| 国产有码一区二区| 国产精品亚洲四区在线观看| 99国产视频在线| 久久久久久毛片免费看 | 日本中文字幕在线不卡| 国产成人精品网址| 私密视频在线观看| 久久精品亚洲精品国产欧美kt∨| 91麻豆制片厂| 亚洲欧美色综合| 日韩欧美大片在线观看| 欧美性猛交xxxx偷拍洗澡| 小泽玛利亚一区二区三区视频| 欧美人牲a欧美精品| 国产超碰人人模人人爽人人添| 亚洲第一级黄色片| 麻豆av电影在线观看| 中文字幕日韩欧美在线| 性欧美ⅴideo另类hd| 性色av一区二区咪爱| 123成人网| 99久久精品无码一区二区毛片| 美日韩黄色大片| 一本一生久久a久久精品综合蜜| 国产精品videosex极品| 黄色片久久久久| 国产精品综合一区二区三区| 中文字幕日韩三级片| 一区二区中文视频| 日本在线视频免费| 欧亚洲嫩模精品一区三区| 精品二区在线观看| 亚洲女在线观看| 国产成人l区| 国产成人av网址| 亚洲精品高潮| 五月天亚洲综合情| 亚洲私人影院| 欧美三级午夜理伦三级富婆| 成人网在线播放| 国产成人精品视频免费| 午夜成人免费视频| 一区二区国产欧美| 亚洲老头同性xxxxx| 超碰最新在线| 国产精品精品视频| 日韩成人av在线资源| 成人性做爰片免费视频| 老司机精品导航| 97香蕉碰碰人妻国产欧美| 亚洲婷婷综合色高清在线| 精人妻无码一区二区三区| 亚洲第一色中文字幕| 成年人黄视频在线观看| 国产精品免费视频xxxx| 日韩黄色网络| 男女激情免费视频| 久久9热精品视频| 欧美三级视频网站| 福利二区91精品bt7086| 成人小说亚洲一区二区三区| 久久精品亚洲精品| 偷拍自拍亚洲| 亚洲午夜精品久久久久久浪潮| 丝袜美腿高跟呻吟高潮一区| 亚洲天堂2024| 亚洲综合色丁香婷婷六月图片| 国产一区二区三区四区视频| 一区二区av在线| 国产v综合v| 欧美色欧美亚洲另类七区| 夜夜嗨av一区二区三区网站四季av| 真实乱偷全部视频| 亚洲人成影院在线观看| 国产精品视频一区二区三区,| 一色桃子一区二区| 成人久久网站| 亚洲精品中文字幕乱码三区不卡| 日日夜夜免费精品| 欧美熟妇激情一区二区三区| 欧美日韩亚洲激情| 青青青草网站免费视频在线观看| 57pao成人国产永久免费| 亚洲综合图色| 五月婷婷深爱五月| 国产无遮挡一区二区三区毛片日本| 日韩免费av网站| 亚洲一区二区久久久| yiren22亚洲综合| 在线观看成人一级片| 国产一区日韩二区欧美三区| 青青草偷拍视频| 精品日本一线二线三线不卡| 国语对白在线刺激| 国产亚洲情侣一区二区无| 亚洲一区国产| 亚洲天堂岛国片| 91麻豆精品国产综合久久久久久| mm1313亚洲国产精品美女| 99精彩视频在线观看免费| 亚洲片区在线| 免费看污片网站| 欧美视频在线不卡| av毛片在线| 精品中文字幕人| 日本欧美在线观看| 波多野结衣家庭教师| 精品免费日韩av| 瑟瑟视频在线看| 亚洲bbw性色大片| 国产成人免费xxxxxxxx| 黄色一级片免费看| 国产亚洲人成网站在线观看| crdy在线观看欧美| 很污的网站在线观看| 国产亚洲一区二区三区在线观看| 一本色道久久综合无码人妻| 欧美高清一级大片| 久久综合影院| 中文字幕在线视频一区二区| 精品久久久久久久久国产字幕| 国产三级电影在线| 成人av免费看| 青青草97国产精品免费观看无弹窗版| 亚洲综合网在线| 亚洲欧美一区二区三区久久| 成人自拍视频| 逼特逼视频在线| 日韩理论片一区二区| 亚洲欧美日韩动漫| 91系列在线播放| 久久成人亚洲| 国产精品 欧美 日韩| 在线日韩日本国产亚洲| 成人av资源网址|