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

Java 多線程爬蟲及分布式爬蟲架構(gòu)探索

開發(fā) 架構(gòu) 分布式
這是 Java 爬蟲系列博文的第五篇,在上一篇 Java 爬蟲服務(wù)器被屏蔽,不要慌,咱們換一臺服務(wù)器 中,我們簡單的聊反爬蟲策略和反反爬蟲方法,主要針對的是 IP 被封及其對應(yīng)辦法。前面幾篇文章我們把爬蟲相關(guān)的基本知識都講的差不多啦。這一篇我們來聊一聊爬蟲架構(gòu)相關(guān)的內(nèi)容。

 這是 Java 爬蟲系列博文的第五篇,在上一篇 Java 爬蟲服務(wù)器被屏蔽,不要慌,咱們換一臺服務(wù)器 中,我們簡單的聊反爬蟲策略和反反爬蟲方法,主要針對的是 IP 被封及其對應(yīng)辦法。前面幾篇文章我們把爬蟲相關(guān)的基本知識都講的差不多啦。這一篇我們來聊一聊爬蟲架構(gòu)相關(guān)的內(nèi)容。

[[279402]]

前面幾章內(nèi)容我們的爬蟲程序都是單線程,在我們調(diào)試爬蟲程序的時候,單線程爬蟲沒什么問題,但是當我們在線上環(huán)境使用單線程爬蟲程序去采集網(wǎng)頁時,單線程就暴露出了兩個致命的問題:

  • 采集效率特別慢,單線程之間都是串行的,下一個執(zhí)行動作需要等上一個執(zhí)行完才能執(zhí)行
  • 對服務(wù)器的CUP等利用率不高,想想我們的服務(wù)器都是 8核16G,32G 的只跑一個線程會不會太浪費啦

線上環(huán)境不可能像我們本地測試一樣,不在乎采集效率,只要能正確提取結(jié)果就行。在這個時間就是金錢的年代,不可能給你時間去慢慢的采集,所以單線程爬蟲程序是行不通的,我們需要將單線程改成多線程的模式,來提升采集效率和提高計算機利用率。

多線程的爬蟲程序設(shè)計比單線程就要復(fù)雜很多,但是與其他業(yè)務(wù)在高并發(fā)下要保證數(shù)據(jù)安全又不同,多線程爬蟲在數(shù)據(jù)安全上到要求不是那么的高,因為每個頁面都可以被看作是一個獨立體。要做好多線程爬蟲就必須做好兩點:第一點就是統(tǒng)一的待采集 URL 維護,第二點就是 URL 的去重, 下面我們簡單的來聊一聊這兩點。

維護待采集的 URL

多線程爬蟲程序就不能像單線程那樣,每個線程獨自維護這自己的待采集 URL,如果這樣的話,那么每個線程采集的網(wǎng)頁將是一樣的,你這就不是多線程采集啦,你這是將一個頁面采集的多次。基于這個原因我們就需要將待采集的 URL 統(tǒng)一維護,每個線程從統(tǒng)一 URL 維護處領(lǐng)取采集 URL ,完成采集任務(wù),如果在頁面上發(fā)現(xiàn)新的 URL 鏈接則添加到 統(tǒng)一 URL 維護的容器中。下面是幾種適合用作統(tǒng)一 URL 維護的容器:

  • JDK 的安全隊列,例如 LinkedBlockingQueue
  • 高性能的 NoSQL,比如 Redis、Mongodb
  • MQ 消息中間件

URL 的去重

URL 的去重也是多線程采集的關(guān)鍵一步,因為如果不去重的話,那么我們將采集到大量重復(fù)的 URL,這樣并沒有提升我們的采集效率,比如一個分頁的新聞列表,我們在采集第一頁的時候可以得到 2、3、4、5 頁的鏈接,在采集第二頁的時候又會得到 1、3、4、5 頁的鏈接,待采集的 URL 隊列中將存在大量的列表頁鏈接,這樣就會重復(fù)采集甚至進入到一個死循環(huán)當中,所以就需要 URL 去重。URL 去重的方法就非常多啦,下面是幾種常用的 URL 去重方式:

  • 將 URL 保存到數(shù)據(jù)庫進行去重,比如 redis、MongoDB
  • 將 URL 放到哈希表中去重,例如 hashset
  • 將 URL 經(jīng)過 MD5 之后保存到哈希表中去重,相比于上面一種,能夠節(jié)約空間
  • 使用 布隆過濾器(Bloom Filter)去重,這種方式能夠節(jié)約大量的空間,就是不那么準確。

關(guān)于多線程爬蟲的兩個核心知識點我們都知道啦,下面我畫了一個簡單的多線程爬蟲架構(gòu)圖,如下圖所示:  

多線程爬蟲架構(gòu)圖

上面我們主要了解了多線程爬蟲的架構(gòu)設(shè)計,接下來我們不妨來試試 Java 多線程爬蟲,我們以采集虎撲新聞為例來實戰(zhàn)一下 Java 多線程爬蟲,Java 多線程爬蟲中設(shè)計到了 待采集 URL 的維護和 URL 去重,由于我們這里只是演示,所以我們就使用 JDK 內(nèi)置的容器來完成,我們使用 LinkedBlockingQueue 作為待采集 URL 維護容器,HashSet 作為 URL 去重容器。下面是 Java 多線程爬蟲核心代碼,詳細代碼以上傳 GitHub,地址在文末:

  1. /** 
  2.  * 多線程爬蟲 
  3.  */ 
  4. public class ThreadCrawler implements Runnable { 
  5.     // 采集的文章數(shù) 
  6.     private final AtomicLong pageCount = new AtomicLong(0); 
  7.     // 列表頁鏈接正則表達式 
  8.     public static final String URL_LIST = "https://voice.hupu.com/nba"
  9.     protected Logger logger = LoggerFactory.getLogger(getClass()); 
  10.     // 待采集的隊列 
  11.     LinkedBlockingQueue<String> taskQueue; 
  12.     // 采集過的鏈接列表 
  13.     HashSet<String> visited; 
  14.     // 線程池 
  15.     CountableThreadPool threadPool; 
  16.     /** 
  17.      * 
  18.      * @param url 起始頁 
  19.      * @param threadNum 線程數(shù) 
  20.      * @throws InterruptedException 
  21.      */ 
  22.     public ThreadCrawler(String url, int threadNum) throws InterruptedException { 
  23.         this.taskQueue = new LinkedBlockingQueue<>(); 
  24.         this.threadPool = new CountableThreadPool(threadNum); 
  25.         this.visited = new HashSet<>(); 
  26.         // 將起始頁添加到待采集隊列中 
  27.         this.taskQueue.put(url); 
  28.     } 
  29.  
  30.     @Override 
  31.     public void run() { 
  32.         logger.info("Spider started!"); 
  33.         while (!Thread.currentThread().isInterrupted()) { 
  34.             // 從隊列中獲取待采集 URL 
  35.             final String request = taskQueue.poll(); 
  36.             // 如果獲取 request 為空,并且當前的線程采已經(jīng)沒有線程在運行 
  37.             if (request == null) { 
  38.                 if (threadPool.getThreadAlive() == 0) { 
  39.                     break; 
  40.                 } 
  41.             } else { 
  42.                 // 執(zhí)行采集任務(wù) 
  43.                 threadPool.execute(new Runnable() { 
  44.                     @Override 
  45.                     public void run() { 
  46.                         try { 
  47.                             processRequest(request); 
  48.                         } catch (Exception e) { 
  49.                             logger.error("process request " + request + " error", e); 
  50.                         } finally { 
  51.                             // 采集頁面 +1 
  52.                             pageCount.incrementAndGet(); 
  53.                         } 
  54.                     } 
  55.                 }); 
  56.             } 
  57.         } 
  58.         threadPool.shutdown(); 
  59.         logger.info("Spider closed! {} pages downloaded.", pageCount.get()); 
  60.     } 
  61.  
  62.     /** 
  63.      * 處理采集請求 
  64.      * @param url 
  65.      */ 
  66.     protected void processRequest(String url) { 
  67.         // 判斷是否為列表頁 
  68.         if (url.matches(URL_LIST)) { 
  69.             // 列表頁解析出詳情頁鏈接添加到待采集URL隊列中 
  70.             processTaskQueue(url); 
  71.         } else { 
  72.             // 解析網(wǎng)頁 
  73.             processPage(url); 
  74.         } 
  75.     } 
  76.     /** 
  77.      * 處理鏈接采集 
  78.      * 處理列表頁,將 url 添加到隊列中 
  79.      * 
  80.      * @param url 
  81.      */ 
  82.     protected void processTaskQueue(String url) { 
  83.         try { 
  84.             Document doc = Jsoup.connect(url).get(); 
  85.             // 詳情頁鏈接 
  86.             Elements elements = doc.select(" div.news-list > ul > li > div.list-hd > h4 > a"); 
  87.             elements.stream().forEach((element -> { 
  88.                 String request = element.attr("href"); 
  89.                 // 判斷該鏈接是否存在隊列或者已采集的 set 中,不存在則添加到隊列中 
  90.                 if (!visited.contains(request) && !taskQueue.contains(request)) { 
  91.                     try { 
  92.                         taskQueue.put(request); 
  93.                     } catch (InterruptedException e) { 
  94.                         e.printStackTrace(); 
  95.                     } 
  96.                 } 
  97.             })); 
  98.             // 列表頁鏈接 
  99.             Elements list_urls = doc.select("div.voice-paging > a"); 
  100.             list_urls.stream().forEach((element -> { 
  101.                 String request = element.absUrl("href"); 
  102.                 // 判斷是否符合要提取的列表鏈接要求 
  103.                 if (request.matches(URL_LIST)) { 
  104.                     // 判斷該鏈接是否存在隊列或者已采集的 set 中,不存在則添加到隊列中 
  105.                     if (!visited.contains(request) && !taskQueue.contains(request)) { 
  106.                         try { 
  107.                             taskQueue.put(request); 
  108.                         } catch (InterruptedException e) { 
  109.                             e.printStackTrace(); 
  110.                         } 
  111.                     } 
  112.                 } 
  113.             })); 
  114.  
  115.         } catch (Exception e) { 
  116.             e.printStackTrace(); 
  117.         } 
  118.     } 
  119.     /** 
  120.      * 解析頁面 
  121.      * 
  122.      * @param url 
  123.      */ 
  124.     protected void processPage(String url) { 
  125.         try { 
  126.             Document doc = Jsoup.connect(url).get(); 
  127.             String title = doc.select("body > div.hp-wrap > div.voice-main > div.artical-title > h1").first().ownText(); 
  128.  
  129.             System.out.println(Thread.currentThread().getName() + " 在 " + new Date() + " 采集了虎撲新聞 " + title); 
  130.             // 將采集完的 url 存入到已經(jīng)采集的 set 中 
  131.             visited.add(url); 
  132.  
  133.         } catch (IOException e) { 
  134.             e.printStackTrace(); 
  135.         } 
  136.     } 
  137.  
  138.     public static void main(String[] args) { 
  139.  
  140.         try { 
  141.             new ThreadCrawler("https://voice.hupu.com/nba", 5).run(); 
  142.         } catch (InterruptedException e) { 
  143.             e.printStackTrace(); 
  144.         } 
  145.     } 

我們用 5 個線程去采集虎撲新聞列表頁看看效果如果?運行該程序,得到如下結(jié)果:


多線程采集結(jié)果

 

 

結(jié)果中可以看出,我們啟動了 5 個線程采集了 61 頁頁面,一共耗時 2 秒鐘,可以說效果還是不錯的,我們來跟單線程對比一下,看看差距有多大?我們將線程數(shù)設(shè)置為 1 ,再次啟動程序,得到如下結(jié)果:

 

 

 

單線程運行結(jié)果

可以看出單線程采集虎撲 61 條新聞花費了 7 秒鐘,耗時差不多是多線程的 4 倍,你想想這可只是 61 個頁面,頁面更多的話,差距會越來越大,所以多線程爬蟲效率還是非常高的。

分布式爬蟲架構(gòu)

分布式爬蟲架構(gòu)是一個大型采集程序才需要使用的架構(gòu),一般情況下使用單機多線程就可以解決業(yè)務(wù)需求,反正我是沒有分布式爬蟲項目的經(jīng)驗,所以這一塊我也沒什么可以講的,但是我們作為技術(shù)人員,我們需要對技術(shù)保存熱度,雖然不用,但是了解了解也無妨,我查閱了不少資料得出了如下結(jié)論:

分布式爬蟲架構(gòu)跟我們多線程爬蟲架構(gòu)在思路上來說是一樣的,我們只需要在多線程的基礎(chǔ)上稍加改進就可以變成一個簡單的分布式爬蟲架構(gòu)。因為分布式爬蟲架構(gòu)中爬蟲程序部署在不同的機器上,所以我們待采集的 URL 和 采集過的 URL 就不能存放在爬蟲程序機器的內(nèi)存中啦,我們需要將它統(tǒng)一在某臺機器上維護啦,比如存放在 Redis 或者 MongoDB 中,每臺機器都從這上面獲取采集鏈接,而不是從 LinkedBlockingQueue 這樣的內(nèi)存隊列中取鏈接啦,這樣一個簡單的分布式爬蟲架構(gòu)就出現(xiàn)了,當然這里面還會有很多細節(jié)問題,因為我沒有分布式架構(gòu)的經(jīng)驗,我也無從說起,如果你有興趣的話,歡迎交流。

 

責(zé)任編輯:華軒 來源: 平頭哥的技術(shù)博文
相關(guān)推薦

2015-04-21 09:39:03

javajava分布式爬蟲

2018-05-22 15:30:30

Python網(wǎng)絡(luò)爬蟲分布式爬蟲

2019-10-28 11:30:43

架構(gòu)數(shù)據(jù)結(jié)構(gòu)布隆過濾器

2020-10-13 07:44:45

理解分布式

2023-12-29 08:18:31

Session分布式系統(tǒng)微服務(wù)

2023-05-29 14:07:00

Zuul網(wǎng)關(guān)系統(tǒng)

2016-09-30 10:13:07

分布式爬蟲系統(tǒng)

2015-05-28 10:58:57

分布式彈性計算云計算架構(gòu)

2019-10-10 09:16:34

Zookeeper架構(gòu)分布式

2023-07-05 00:09:13

分布式存儲架構(gòu)

2019-07-19 19:53:01

2019-07-19 08:46:58

2023-03-07 09:49:04

分布式數(shù)據(jù)庫

2018-05-09 09:44:51

Java分布式系統(tǒng)

2024-04-08 11:04:03

2018-12-20 09:30:59

分布式高并發(fā)多線程

2025-02-14 08:50:00

架構(gòu)開發(fā)軟件

2017-10-30 08:52:27

vSAN架構(gòu)RAID

2022-03-06 21:43:05

Citus架構(gòu)PostgreSQL

2021-09-10 21:25:43

Redis分布式
點贊
收藏

51CTO技術(shù)棧公眾號

日本久久久网站| 91九色在线观看| 蜜桃传媒一区二区亚洲| 国产69精品久久久久按摩| 亚洲欧洲国产专区| 成人在线观看av| 老熟妇仑乱一区二区av| 久久日文中文字幕乱码| 精品国产一区久久| 日韩视频免费在线播放| 顶级网黄在线播放| 不卡视频在线观看| 国产精品美女免费| 久久久久久久久久久97| 奇米狠狠一区二区三区| 日韩一卡二卡三卡国产欧美| 日日橹狠狠爱欧美超碰| 免费在线观看黄色网| 高清shemale亚洲人妖| 国产精品96久久久久久又黄又硬 | 国产精品美女久久久久aⅴ国产馆| 91成人免费在线观看| 国产精品久久久久久久久夜色| 综合久久久久| 国产一区二区三区久久精品 | 久久久天堂av| 国产另类自拍| 国产一区二区视频免费观看| 新67194成人永久网站| 色综合91久久精品中文字幕| 精品人伦一区二区| 美女网站色精品尤物极品姐弟| 欧美日精品一区视频| 日本在线观看a| 国产免费拔擦拔擦8x高清在线人 | 成人一区二区三区中文字幕| 91久久久久久久久久久久久| av首页在线观看| 国产欧美大片| 97精品国产91久久久久久| 国产十六处破外女视频| 97精品视频| 中文字幕亚洲国产| 日本成人免费视频| 欧美日韩爱爱| 亚洲欧美国产精品va在线观看| 精品久久久久久无码人妻| 国产精久久一区二区| 欧美日韩精品一区二区三区蜜桃| 国产精品69页| 理论不卡电影大全神| 性做久久久久久免费观看| 蜜臀av性久久久久蜜臀av| 3d成人动漫在线| 国产色一区二区| 日韩欧美亚洲v片| 大地资源中文在线观看免费版| 久久久久免费观看| 欧洲精品在线一区| 精品美女视频在线观看免费软件| 久久影院电视剧免费观看| 久久久综合亚洲91久久98| 色视频在线观看| 国产亚洲人成网站| 日韩久久不卡| 麻豆电影在线播放| 伊人夜夜躁av伊人久久| 国产精品无码免费专区午夜| www.8ⅹ8ⅹ羞羞漫画在线看| 狠狠操狠狠色综合网| 久久精品一区二| 国产精品无码久久久久| 欧美精品久久99| 久久久无码人妻精品无码| 国语一区二区三区| 亚洲欧美福利视频| 少妇愉情理伦三级| 欧美一区成人| 91tv亚洲精品香蕉国产一区7ujn| 中文字幕精品视频在线观看| 蜜桃视频一区二区| 97se国产在线视频| 人妻少妇一区二区三区| 久久人人97超碰com| 亚洲欧美久久234| 羞羞网站在线免费观看| 欧美日韩国产在线播放| 欧美黄色性生活| 亚洲一区二区免费在线观看| 日韩电影在线观看中文字幕| 欧美成人另类视频| 欧美涩涩网站| 国产成人精品视频在线| 国产伦精品一区二区三区免.费| 福利一区二区在线| 欧洲视频一区二区三区| 国产视频一区二区| 欧美性69xxxx肥| 午夜av中文字幕| 亚洲成aⅴ人片久久青草影院| 社区色欧美激情 | 国产乡下妇女做爰视频| 视频一区二区不卡| 99久re热视频这里只有精品6| 欧美性孕妇孕交| 亚洲视频综合在线| 欧美亚洲一二三区| 国产一区二区久久久久| 亚洲免费电影一区| 欧美日韩国产精品综合| 视频一区二区国产| 精品无码久久久久国产| av在线麻豆| 欧美亚洲综合网| 亚洲国产精品自拍视频| 日韩欧美精品综合| 日本精品在线视频| 日本高清视频免费看| 日韩一区欧美小说| www.xxx亚洲| 久久久亚洲欧洲日产| 久久伊人精品视频| 中文字幕一区二区三区波野结 | 免费观看成人在线| 美女精品导航| 欧美一区二区三区视频免费播放| 黑人巨大精品欧美| 亚洲国产日韩欧美一区二区三区| 91久久精品国产91久久| caoporn国产精品免费视频| 激情成人在线视频| 国产伦精品一区二区三区88av| 国产精品久久久久久久免费观看 | 国产69精品久久久久99| 99国产成人精品| 国产精品国产自产拍高清av王其| 成人在线观看黄| 亚洲欧洲美洲国产香蕉| 91福利视频网| 亚洲欧美色视频| 香蕉av福利精品导航| 久久久久中文字幕亚洲精品| 综合精品久久| 99中文视频在线| 欧美亚洲系列| 欧美成人午夜电影| 免费一级a毛片夜夜看 | 亚洲永久免费精品| 国内外成人免费视频| √天堂8资源中文在线| 精品日韩在线观看| 国产无套粉嫩白浆内谢| 不卡影院免费观看| 国产极品尤物在线| 日韩成人动漫在线观看| 日本中文字幕久久看| 男女视频在线观看免费| 在线观看亚洲专区| 亚洲综合第一区| 精品一区二区三区日韩| 99热都是精品| 136福利精品导航| 97久久精品国产| 免费在线一级视频| 91精品91久久久中77777| 阿v天堂2014| 国产美女主播视频一区| 免费一级淫片aaa片毛片a级| 精品久久ai电影| 国产不卡精品视男人的天堂| 在线日本中文字幕| 91精品国产91久久久久久最新毛片| 精品国产乱码久久久久久鸭王1| 顶级嫩模精品视频在线看| 奇米精品一区二区三区| 国产精品一区高清| 成人激情视频小说免费下载| 日韩精品亚洲人成在线观看| 亚洲精品国产美女| 色婷婷久久综合中文久久蜜桃av| 亚洲欧洲中文日韩久久av乱码| 又色又爽又黄18网站| 亚洲一区久久| 不卡中文字幕在线| 日本亚洲不卡| 国产美女精彩久久| 国产精品69xx| 亚洲一级免费视频| www.综合色| 日本韩国欧美在线| 久久精品视频免费在线观看| 97久久超碰国产精品| 国产一级片自拍| 影音先锋亚洲精品| 午夜精品美女久久久久av福利| 视频精品国内| 欧美专区中文字幕| dy888亚洲精品一区二区三区| 日韩电影在线观看中文字幕| 国产精品毛片久久久久久久av| 激情成人在线视频| 黄色录像一级片| 久久九九久精品国产免费直播| 亚洲五月激情网| 久久久久久久高潮| 成人免费a级片| 国产国产精品| 日韩欧美视频一区二区| 老司机凹凸av亚洲导航| 国产中文字幕亚洲| 91看片一区| 性色av一区二区三区免费 | 免费成人网www| 99se婷婷在线视频观看| 巨胸喷奶水www久久久免费动漫| 久久久女女女女999久久| 日本中文字幕视频在线| 亚洲国产精品免费| 亚洲av无码乱码国产精品久久| 欧美视频三区在线播放| 永久免费看片在线播放| 亚洲最新在线观看| 国产精品成人69xxx免费视频| 久久精品免费在线观看| aaaaaav| 粉嫩在线一区二区三区视频| 青青草原播放器| 免费久久99精品国产| 黄色高清无遮挡| 国产精品婷婷| 久久亚洲中文字幕无码| 国产精品激情| 欧洲精品在线播放| 欧美日本二区| 国产成人免费高清视频| 66国产精品| 一本二本三本亚洲码| 日韩在线观看| 一区二区视频在线播放| 日韩国产欧美| 亚洲国产精品毛片| jizzjizz欧美69巨大| 日韩av电影免费播放| 国内黄色精品| 天堂av一区二区| 欧美日韩老妇| 亚洲一区二区高清视频| 四季av在线一区二区三区| 日韩高清在线播放| 不卡av一区二区| 亚洲欧美日韩精品久久久 | 一色桃子久久精品亚洲| 成人无码精品1区2区3区免费看| 国产女主播一区| 亚洲色图日韩精品| 成人免费一区二区三区视频| 免费看特级毛片| 亚洲自拍偷拍av| 免费看日韩毛片| 日韩欧美国产视频| 伊人网视频在线| 91麻豆精品久久久久蜜臀 | 亚洲福利影视| 亚洲一区二区三区乱码aⅴ蜜桃女| 久久久久久亚洲精品美女| 51成人做爰www免费看网站| 日韩精品一区二区三区中文 | 福利视频999| 国产成人午夜精品5599| 人妻无码中文久久久久专区| 久久久五月婷婷| 日本午夜在线观看| 午夜精品久久久久久久| 国产精品免费无遮挡无码永久视频| 欧美色图在线观看| 亚洲AV无码一区二区三区少妇| 国产丝袜一区二区三区免费视频| 国产精品久久久久久久龚玥菲| 日韩在线视频观看正片免费网站| 中文字幕伦理免费在线视频| 97成人在线视频| 欧美视频免费看| 俄罗斯精品一区二区三区| 久久不卡国产精品一区二区 | 国产精品久久波多野结衣| 中日韩免视频上线全都免费| 亚洲图片都市激情| 亚洲私拍自拍| 日日噜噜夜夜狠狠| 福利电影一区二区| 女人裸体性做爰全过| 亚洲国产精品欧美一二99| 天天综合久久综合| 亚洲成人久久电影| 又爽又大又黄a级毛片在线视频| 欧美激情一区二区三区高清视频| 欧美天堂视频| 成人在线免费网站| 日韩欧美大片| 国产成人a亚洲精v品无码| 国产一区不卡视频| 免费污网站在线观看| 亚洲一卡二卡三卡四卡五卡| 国产男人搡女人免费视频| 精品福利在线导航| 麻豆视频在线观看免费| 日韩av免费在线| 荡女精品导航| 免费观看国产视频在线| 天使萌一区二区三区免费观看| 麻豆tv在线观看| 日韩毛片一二三区| 在线视频精品免费| 国产视频亚洲视频| 草草在线视频| 成人欧美一区二区三区在线观看| 久久日文中文字幕乱码| 妓院一钑片免看黄大片| 99久久久精品| 精品视频在线观看免费| 欧美精品一二三| av影片在线看| 国产极品jizzhd欧美| 网红女主播少妇精品视频| 777久久精品一区二区三区无码| 久久精品久久99精品久久| 久久只有这里有精品| 欧美日韩在线视频首页| 国模无码一区二区三区| 欧美乱妇40p| 国产精品亚洲欧美一级在线| 亚洲精品一区二区三区av| 日韩高清不卡一区二区| 国产色视频一区二区三区qq号| 欧美日韩另类视频| 色综合免费视频| 91精品国产高清久久久久久久久| 国产日本亚洲| 蜜臀av.com| 国产精品香蕉一区二区三区| 五月天av网站| 日韩一级大片在线观看| 午夜在线激情影院| 亚洲综合中文字幕在线| 欧美在线三区| 不许穿内裤随时挨c调教h苏绵| 伊人色综合久久天天人手人婷| 精品人妻一区二区三区含羞草| 萌白酱国产一区二区| 亚洲高清在线一区| 国产在线观看欧美| 国产69精品久久久久毛片| 久久亚洲AV无码| 亚洲精品国产综合久久| 热色播在线视频| 免费一区二区三区在在线视频| 久久久精品日韩| 免费看黄色三级| 911精品产国品一二三产区| 国产原创精品视频| 国产高清在线一区| 国产欧美日韩一区二区三区在线| 久久精品国产亚洲AV熟女| 一本色道久久综合亚洲aⅴ蜜桃 | 精品国产成人| 日本中文字幕二区| 一区二区三区欧美激情| 熟妇人妻系列aⅴ无码专区友真希 熟妇人妻av无码一区二区三区 | 欧美激情午夜| 91亚洲精品丁香在线观看| 一区二区黄色| av永久免费观看| 欧美一三区三区四区免费在线看| 金瓶狂野欧美性猛交xxxx | 美国一级片在线免费观看视频| 国产精品久久久久久久9999| 91中文字幕精品永久在线| 91九色蝌蚪porny| 色老汉av一区二区三区| 日韩黄色影院| 国产一区二区无遮挡| 免费精品视频在线| 国产午夜免费视频| 在线亚洲欧美视频| 国产精品99久久免费观看| 国产又黄又猛视频| 一个色妞综合视频在线观看| 九色视频成人自拍| 99re6热在线精品视频播放速度| 午夜亚洲视频| 欧美人与禽zozzo禽性配| 亚洲深夜福利网站| 草莓视频一区二区三区| 成人午夜激情av| 亚洲电影第三页| 日本视频在线观看| 精品日本一区二区| 激情六月婷婷久久| 天天干天天色综合| 欧美激情综合色|