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

C# Actor模型開發實例:網絡爬蟲

開發 后端
本文通過建立一個網絡爬蟲的實例,介紹了適合C# Actor的開發方法。

之前的幾篇文章大都在擺一些“小道理”,有經驗的朋友容易想象出來其中的含義,不過對于那些還不了解Actor模型的朋友來說,這些內容似乎有些太過了。此外,乒乓測試雖然經典,但是不太容易說明問題。因此,今天我們就來看一個簡單的有些簡陋的網絡爬蟲,對于Actor模型的使用來說,它至少比乒乓測試能夠說明問題。對了,我們先來使用那“中看不中用”的消息執行方式。

功能簡介

這個網絡爬蟲的功能還是用于演示,先來列舉出它的實現目標吧:
◆給出一個初始鏈接,然后抓取它的HTML并分析出所有html鏈接,然后繼續爬,不斷爬,直到爬完所有鏈接為止。
◆多線程運行,我們可以指定由多少個爬蟲同時工作。
◆多個爬蟲組成一個“工作單元”,程序中可以同時出現多個工作單元,工作單元之間互相獨立。
◆能簡化的地方便簡化,如一切不涉及任何永久性存儲(也就是說,只使用內存),沒有太復雜的容錯機制。

的確很簡單吧?那么,現在您不妨先在腦海中想象一下,在不用Actor模型的時候您會怎么實現這個功能。然后,我們就要動手使用ActorLite這個小類庫了。

協議制定

正如我們不斷強調的那樣,在Actor模型中唯一的通信方式便是互相發送消息。于是使用Actor模型的第一步往往便是設計Actor類型,以及它們之間傳遞的消息。在這個簡單的場景中,我們會定義兩種Actor類型。一是Monitor,二是Crawler。一個Monitor便代表一個“工作單元”,它管理了多個爬蟲,即Crawler。

Monitor將負責在合適的時候創建Crawler,并向其發送一個消息,讓其開始工作。在我們的系統中,我們使用ICrawlRequestHandler接口來表示這個消息:

C# Actor模型·創建網絡爬蟲:

  1. public interface ICrawlRequestHandler  
  2. {  
  3.     void Crawl(Monitor monitor, string url);  
  4. }  

在接受到上面的Crawl消息后,Crawler將去抓取指定的url對象,并將結果發還給Monitor。在這里我們要求報告Cralwer向Monitor報告“成功”和“失敗”兩種消息1:

C# Actor模型·爬蟲報告消息

  1. public interface ICrawlResponseHandler  
  2. {  
  3.     void Succeeded(Crawler crawler, string url, List<string> links);  
  4.     void Failed(Crawler crawler, string url, Exception ex);  
  5. }  

我們使用“接口”這種方式定義了“消息組”,把Succeeded和Failed兩種關系密切的消息綁定在一起。如果抓取成功,則Crawler會從抓取內容中獲得額外的鏈接,并發還給Monitor——失敗的時候自然就發還一個異常對象。此外,無論是成功還是失敗,我們都會把Crawler對象交給Monitor,Monitor會安排給Crawler新的抓取任務。

因此,Monitor和Cralwer類的定義大約應該是這樣的:

C# Actor模型·爬蟲和監控類的定義

  1. public class Monitor : Actor<Action<ICrawlResponseHandler>>, ICrawlResponseHandler  
  2. {  
  3.     protected override void Receive(Action<ICrawlResponseHandler> message)  
  4.     {  
  5.         message(this);  
  6.     }  
  7.  
  8.     #region ICrawlResponseHandler Members  
  9.  
  10.     void ICrawlResponseHandler.Succeeded(Crawler crawler, string url, List<string> links)  
  11.     {  
  12.         ...  
  13.     }  
  14.  
  15.     void ICrawlResponseHandler.Failed(Crawler crawler, string url, Exception ex)  
  16.     {  
  17.         ...  
  18.     }  
  19.  
  20.     #endregion  
  21. }  
  22.  
  23. public class Crawler : Actor<Action<ICrawlRequestHandler>>, ICrawlRequestHandler  
  24. {  
  25.     protected override void Receive(Action<ICrawlRequestHandler> message)  
  26.     {  
  27.         message(this);  
  28.     }  
  29.  
  30.     #region ICrawlRequestHandler Members  
  31.  
  32.     void ICrawlRequestHandler.Crawl(Monitor monitor, string url)  
  33.     {  
  34.         ...  
  35.     }  
  36.  
  37.     #endregion  
  38. }  
  39.  

Crawler實現

我們先從簡單的Crawler類的實現開始。Crawler類只需要實現ICrawlRequestHandler接口的Crawl方法即可:

C# Actor模型·爬蟲的實現

  1. void ICrawlRequestHandler.Crawl(Monitor monitor, string url)  
  2. {  
  3.     try 
  4.     {  
  5.         string content = new WebClient().DownloadString(url);  
  6.  
  7.         var matches = Regex.Matches(content, @"href=""(http://[^""]+)""").Cast<Match>();  
  8.         var links = matches.Select(m => m.Groups[1].Value).Distinct().ToList();  
  9.         monitor.Post(m => m.Succeeded(this, url, links));  
  10.     }  
  11.     catch (Exception ex)  
  12.     {  
  13.         monitor.Post(m => m.Failed(this, url, ex));  
  14.     }  
  15. }  
  16.  

沒錯,使用WebClient下載頁面內容只需要一行代碼就可以了。然后便是使用正則表達式提取出頁面上所有的鏈接。很顯然這里是有問題的,因為我們我只分析出以“http://”開頭的地址,但是無視其他的“相對地址”——不過作為一個小實驗來說已經足夠說明問題了。最后自然是使用Post方法將結果發還給Monitor。在拋出異常的情況下,這幾行代碼的邏輯也非常自然。

Monitor實現

Monitor相對來說便略顯復雜了一些。我們知道,Monitor要負責控制Crawler的數量,那么必然需要負責維護一些必要的字段:

C# Actor模型·監控的實現

  1. private HashSet<string> m_allUrls; // 所有待爬或爬過的url  
  2. private Queue<string> m_readyToCrawl; // 待爬的url  
  3.  
  4. public int MaxCrawlerCount { private setget; } // 最大爬蟲數目  
  5. public int WorkingCrawlerCount { private setget; } // 正在工作的爬蟲數目  
  6.  
  7. public Monitor(int maxCrawlerCount)  
  8. {  
  9.     this.m_allUrls = new HashSet<string>();  
  10.     this.m_readyToCrawl = new Queue<string>();  
  11.     this.MaxCrawlerCount = maxCrawlerCount;  
  12.     this.WorkingCrawlerCount = 0;  
  13. }  
  14.  

Monitor要處理的自然是ICrawlResponseHandler中的Succeeded或Failed方法:

  1. void ICrawlResponseHandler.Succeeded(Crawler crawler, string url, List<string> links)  
  2. {  
  3.     Console.WriteLine("{0} crawled, {1} link(s).", url, links.Count);  
  4.  
  5.     foreach (var newUrl in links)  
  6.     {  
  7.         if (!this.m_allUrls.Contains(newUrl))  
  8.         {  
  9.             this.m_allUrls.Add(newUrl);  
  10.             this.m_readyToCrawl.Enqueue(newUrl);  
  11.         }  
  12.     }  
  13.  
  14.     this.DispatchCrawlingTasks(crawler);  
  15. }  
  16.  
  17. void ICrawlResponseHandler.Failed(Crawler crawler, string url, Exception ex)  
  18. {  
  19.     Console.WriteLine("{0} error occurred: {1}.", url, ex.Message);  
  20.     this.DispatchCrawlingTasks(crawler);  
  21. }  
  22.  

在抓取成功時,Monitor將遍歷links列表中的所有地址,如果發現新的url,則加入相關集合中。在抓取失敗的情況下,我們也只是簡單的繼續下去而已。而“繼續”則是由DispatchCrawlingTasks方法實現的,我們需要傳入一個“可復用”的Crawler對象:

C# Actor模型·爬蟲的傳入

  1. private void DispatchCrawlingTasks(Crawler reusableCrawler)  
  2. {  
  3.     if (this.m_readyToCrawl.Count <= 0)  
  4.     {  
  5.         this.WorkingCrawlerCount--;  
  6.         return;  
  7.     }  
  8.  
  9.     var url = this.m_readyToCrawl.Dequeue();  
  10.     reusableCrawler.Post(c => c.Crawl(this, url));  
  11.  
  12.     while (this.m_readyToCrawl.Count > 0 &&  
  13.         this.WorkingCrawlerCount < this.MaxCrawlerCount)  
  14.     {  
  15.         var newUrl = this.m_readyToCrawl.Dequeue();  
  16.         new Crawler().Post(c => c.Crawl(this, newUrl));  
  17.  
  18.         this.WorkingCrawlerCount++;  
  19.     }  
  20. }  
  21.  

如果已經沒有需要抓取的內容了,則直接拋棄Crawler對象即可,否則則分派一個新任務。接著便不斷創建新的爬蟲,分配新的抓取任務,直到爬蟲數額用滿,或者沒有需要抓取的內容位置。

使用

我們使用區區幾十行代碼遍實現了一個簡單的多線程爬蟲,其中一個關鍵便是使用了Actor模型。使用Actor模型,對象之間通過消息傳遞進行交互。而且對于單個Actor對象來說,消息的執行完全是線程安全的。因此,我們只要作用最直接的邏輯便可以完成整個實現,從而回避了內存共享的并行模式中所使用的互斥體、鎖等各類組件。

不過有沒有發現,我們沒有一個入口可以“開啟”一個抓取任務啊,Monitor類中還缺少了點什么。好吧,那么我們補上一個Start方法:

C# Actor模型·爬蟲開始工作

  1. public class Monitor : Actor<Action<ICrawlResponseHandler>>, ICrawlResponseHandler  
  2. {  
  3.     ...  
  4.  
  5.     public void Start(string url)  
  6.     {  
  7.         this.m_allUrls.Add(url);  
  8.         this.WorkingCrawlerCount++;  
  9.         new Crawler().Post(c => c.Crawl(this, url));  
  10.     }  
  11. }  
  12.  

于是,我們便可以這樣打開一個或多個抓取任務:

  1. static class Program  
  2. {  
  3.     static void Main(string[] args)  
  4.     {  
  5.         new Monitor(5).Start("http://www.cnblogs.com/");  
  6.         new Monitor(10).Start("http://www.csdn.net/");  
  7.  
  8.         Console.ReadLine();  
  9.     }  
  10. }  
  11.  

這里我們新建兩個工作單元,也就是啟動了兩個抓取任務。一是使用5個爬蟲抓取cnblogs.com,二是使用10個爬蟲抓取csdn.net。

缺陷

這里的缺陷是什么?其實很明顯,您發現了嗎?

使用Actor模型可以保證消息執行的線程安全,不過很明顯Start方法并非如此,我們只能用它來“開啟”一個抓取任務。但是如果我們想再次“手動”提交一個需要抓取的URL怎么辦?所以理想的方法,其實也應該是向Monitor發送一個消息來啟動第一個URL抓取任務。需要補充,則發送多個URL即可。可是,這個消息定義在什么地方才合適呢?我們的Monitor類已經實現了Actor<Action<ICrawlResponseHandler>>,已經沒有辦法接受另一個接口作為消息了,不是嗎?

這就是一個致命的限制:一個Actor雖然可以實現多個接口,但只能接受其中一個作為消息。同樣的,如果我們要為Monitor提供其他功能,例如“查詢”某個URL的抓取狀態,也因為同樣的原因而無法實現。還有,便是在前幾篇文章中談到的問題了。Crawler和Monitor直接耦合,我們向Crawler發送的消息只能攜帶一個Monitor對象。

最后,便是一個略顯特別的問題了。我們這里使用WebClient的DownloadString方法來獲取網頁的內容,但是這是個同步IO操作,理想的做法中我們應該使用異步的方法。所以,我們可以這么寫:

  1. void ICrawlRequestHandler.Crawl(Monitor monitor, string url)  
  2. {  
  3.     WebClient webClient = new WebClient();  
  4.     webClient.DownloadStringCompleted += (sender, e) =>  
  5.     {  
  6.         if (e.Error == null)  
  7.         {  
  8.             var matches = Regex.Matches(e.Result, @"href=""(http://[^""]+)""").Cast<Match>();  
  9.             var links = matches.Select(m => m.Groups[1].Value).Distinct().ToList();  
  10.             monitor.Post(m => m.Succeeded(this, url, links));  
  11.         }  
  12.         else 
  13.         {  
  14.             monitor.Post(m => m.Failed(this, url, e.Error));  
  15.         }  
  16.     };  
  17.     webClient.DownloadStringAsync(new Uri(url));  
  18. }  

如果您還記得老趙在最近一篇文章中關于IO線程池的討論,就可以了解到DownloadStringCompleted事件的處理方法會在統一的IO線程池中運行,這樣我們無法控制其運算能力。因此,我們應該在回調函數中向Crawler自己發送一條消息表示抓取完畢……呃,但是我們現在做不到埃

嗯,下次再說吧。

【編輯推薦】

  1. 強類型和Actor:ActorLite的演示
  2. C#的Tag Message回顧:繁瑣而危險
  3. Erlang的Actor回顧:將消息轉化為邏輯執行
  4. Actor模型的本質:究竟是要解決什么問題
  5. 順暢的使用C# Actor:另一個解決方案
責任編輯:yangsai 來源: 老趙點滴
相關推薦

2024-05-31 12:31:54

C#爬蟲Python

2015-07-09 10:44:48

C#WebService

2009-08-18 17:19:33

C#事件模型

2009-09-07 06:18:57

C#窗體設計器

2009-08-31 09:41:05

C#反射靜態方法開發

2009-09-01 17:08:14

C#畫線控件

2009-08-24 15:56:28

C#項目開發實例

2009-08-28 16:37:32

C# for循環

2009-08-27 13:30:11

C# interfac

2009-08-24 16:08:45

C# DrawStri

2021-03-15 08:18:23

C#反射模塊

2009-08-25 16:03:51

C# SQLDMO對象

2009-09-01 18:29:10

C#繼承C#多態

2009-08-27 15:17:18

C# interfacinterface使用

2009-09-07 06:31:32

C#窗體移動

2009-08-27 17:59:56

C#接口定義

2009-09-01 18:36:35

C#委托實例

2009-08-19 16:09:15

C#操作Access

2009-08-18 10:14:19

C#插件構架

2009-08-26 12:14:44

C#打印設置
點贊
收藏

51CTO技術棧公眾號

欧美激情在线观看视频| 日韩一区和二区| 日本精品一区二区三区高清 久久 日本精品一区二区三区不卡无字幕 | 欧美少妇一区| a在线观看免费| 亚洲福利免费| 这里只有精品在线观看| 精品久久久久久无码人妻| 625成人欧美午夜电影| 亚洲欧洲日韩一区二区三区| 精品卡一卡二| av手机免费看| 免费成人在线观看| 国内精品伊人久久| 神马午夜精品91| 久草成人在线| 精品乱人伦小说| 一区二区三区 欧美| 黄色视屏在线免费观看| 亚洲欧美综合色| 欧美一区免费视频| 蜜桃视频污在线观看| 精品一区二区在线看| 4k岛国日韩精品**专区| 欧美精品乱码视频一二专区| 色综合狠狠操| 国产亚洲精品91在线| 午夜剧场免费看| 久久综合给合| 欧美人妇做爰xxxⅹ性高电影| 亚洲欧洲日产国码无码久久99| 91在线中文| 亚洲欧美激情在线| 一区不卡字幕| 91caoporm在线视频| 久久美女艺术照精彩视频福利播放| 超碰97网站| 国产suv一区二区| 激情丁香综合五月| 国产日韩在线看| 中文字幕你懂的| 丝袜亚洲精品中文字幕一区| 欧美多人爱爱视频网站| 青青草原在线免费观看| 亚洲激情中文| 久久福利视频导航| 538精品在线观看| 欧美国内亚洲| 久久综合五月天| 欧美大片xxxx| 欧美精品黄色| 另类专区欧美制服同性| 黄色a级片在线观看| 亚洲香蕉av| 欧美成人黑人xx视频免费观看| 欧美日韩午夜视频| 欧美精品国产| 97超级碰在线看视频免费在线看| 国产特黄大片aaaa毛片| 国产日本精品| 日韩av手机在线| 亚洲 小说区 图片区| 蜜臀久久99精品久久久久宅男| 国产精品久久久亚洲| 在线观看国产黄| 国产在线观看免费一区| 91免费在线观看网站| 国精产品乱码一区一区三区四区| 成人av在线资源网站| 精品国产免费一区二区三区 | 欧美日韩国产123| 免费日韩在线视频| 香蕉av777xxx色综合一区| 国产成人精品最新| 国产原创中文av| 国产91对白在线观看九色| 精品高清视频| 91社区在线高清| 依依成人精品视频| 播放灌醉水嫩大学生国内精品| 国产私拍福利精品视频二区| 日韩一区二区三区视频| chinese麻豆新拍video| 红桃成人av在线播放| 久久精品福利视频| 五月天婷婷网站| 日韩激情视频在线观看| 51成人做爰www免费看网站| 天天干天天插天天操| 久久久噜噜噜久噜久久综合| 中文字幕久精品免| 天堂av中文在线观看| 欧美日韩欧美一区二区| 国产人成视频在线观看| 日韩精品中文字幕第1页| 欧美俄罗斯性视频| 中文字幕视频在线播放| 成人综合激情网| 亚洲精品久久区二区三区蜜桃臀| 毛片在线导航| 欧美午夜寂寞影院| 97香蕉碰碰人妻国产欧美 | 国产亚洲一区二区三区在线观看 | 欧美成va人片在线观看| 谁有免费的黄色网址| 激情婷婷亚洲| 91精品中文在线| 欧美一区二区视频| 一区二区三区四区在线免费观看| 国产福利一区视频| 丁香一区二区| 久久亚洲影音av资源网| 不卡av电影在线| 波多野结衣亚洲一区| 中文字幕一区二区三区5566| 欧美电影网址| 亚洲成人网在线| 青青草激情视频| 美国毛片一区二区三区| 欧美性bbwbbwbbwhd| 国产探花视频在线观看| 777色狠狠一区二区三区| av女人的天堂| 先锋影音久久久| 黄色小网站91| 国产高清在线a视频大全| 7777精品伊人久久久大香线蕉的 | 成人欧美精品一区二区| 国产精品二区不卡| 国产精品国语对白| 美州a亚洲一视本频v色道| 午夜久久久久久| 少妇熟女视频一区二区三区| 久久久久国产| 91精品久久久久久久久久| 成年人在线观看网站| 欧美日韩在线免费| 免费成人深夜夜行p站| 韩国亚洲精品| 国产精品乱子乱xxxx| 欧美aaaaaaa| 日韩精品一区二区三区四区 | fc2ppv国产精品久久| 5566中文字幕一区二区电影 | 国产精品视频一区二区久久| 色综合天天在线| brazzers精品成人一区| 麻豆九一精品爱看视频在线观看免费| 久久riav| 丝袜美腿诱惑一区二区三区| 亚洲人成电影在线播放| 福利网址在线观看| 国产清纯白嫩初高生在线观看91 | 狠狠88综合久久久久综合网| 99久久伊人精品影院| 九色91在线| 亚洲精品国产精品国自产在线 | 国产性xxxx高清| 91在线精品秘密一区二区| 国产最新免费视频| 成人av国产| 亚洲va男人天堂| 麻豆福利在线观看| 国产偷国产偷亚洲清高网站| 无码人妻熟妇av又粗又大| 国产亚洲一区二区三区四区| 尤物国产在线观看| 欧美日韩天堂| 久久久久久久久久久一区| 写真福利精品福利在线观看| 中文字幕欧美日韩在线| av中文在线观看| 精品久久久久久亚洲国产300| 扒开jk护士狂揉免费| 免费精品视频在线| 免费的av在线| 台湾色综合娱乐中文网| 国产精品欧美久久久| √天堂8在线网| 精品夜色国产国偷在线| 亚洲一级在线播放| 亚洲成人午夜电影| 日韩视频在线观看免费视频| 国产一区二区调教| 国内性生活视频| 午夜精品久久久久久久四虎美女版| 欧美日韩一区精品| 97视频在线观看播放| 日日夜夜精品免费| 欧美网站一区二区| 国产亚洲精品成人| 国产欧美一区二区在线| ass极品水嫩小美女ass| 久久一日本道色综合久久| 精品国产一区二区三区在线| 日韩成人av在线资源| 91精品视频在线| 美女福利一区二区| 欧美激情在线狂野欧美精品| 99青草视频在线播放视| 精品粉嫩aⅴ一区二区三区四区| 黄色一区二区视频| 黄色91在线观看| www.xxxx日本| 国产日韩欧美高清| 少妇献身老头系列| 久久99在线观看| 欧美性大战久久久久xxx| 一区二区电影在线观看| 日本一区二区久久精品| 国产精品一线| 亚洲自拍另类欧美丝袜| 日本成人福利| 欧洲s码亚洲m码精品一区| 污片在线免费观看| 最新国产精品拍自在线播放 | av一区二区不卡| 久久精品国产99久久99久久久| 久久综合影音| 日韩在线一级片| 亚洲精品社区| 日本一区午夜艳熟免费| 亚洲国产精品成人| 一区二区91美女张开腿让人桶| 国产免费av一区二区三区| 久久久久网址| 免费看久久久| 国产精品永久入口久久久| 欧美久久一区二区三区| 国产精品中文字幕久久久| 美女写真久久影院| 国产成人精品在线播放| 免费观看亚洲| 日韩av不卡电影| 亚洲黄色中文字幕| 欧美日韩视频一区二区| 相泽南亚洲一区二区在线播放| 亚洲一区二区三区日本久久九| 成人午夜高潮视频| 青青草国产一区二区三区| 国产精品久久久久久久久久久不卡| 9i看片成人免费高清| 26uuu另类亚洲欧美日本老年| 校园春色亚洲| 日韩美女av在线免费观看| 欧美sm一区| 日韩美女激情视频| 在线国产成人影院| 国产精品爽爽ⅴa在线观看| 国产精品66| 91精品视频在线| 88久久精品| 韩国一区二区三区美女美女秀| 国产亚洲精品美女久久| 久久精品日产第一区二区三区精品版 | 在线成人欧美| 国内性生活视频| 首页欧美精品中文字幕| 天天操天天摸天天爽| 九一九一国产精品| 中文写幕一区二区三区免费观成熟| 大桥未久av一区二区三区中文| 国产不卡一二三| 久久久久九九视频| 婷婷国产成人精品视频| 亚洲男人的天堂在线观看| 国产真实乱人偷精品视频| 欧美视频在线观看免费网址| 一级黄色在线观看| 欧美一区二区在线播放| 高h震动喷水双性1v1| 亚洲精品永久免费| 免费黄网站在线| 久久久久久国产| 澳门av一区二区三区| 97伦理在线四区| 亚洲69av| 糖心vlog在线免费观看| 亚洲视频二区| 日本黄大片一区二区三区| 国产91精品一区二区麻豆亚洲| 99久久人妻无码精品系列| 亚洲欧美色综合| 99热在线观看免费精品| 欧美日韩和欧美的一区二区| 欧美 日韩 中文字幕| 日韩精品一区二区三区第95| 麻豆tv免费在线观看| 午夜精品久久久久久久99热| 91九色综合| 狠狠色狠狠色综合人人| 色琪琪久久se色| 日韩av一二三四区| 国产乱码精品一区二区三区忘忧草 | 在线免费观看不卡av| www.色播.com| 中文字幕亚洲精品| yellow在线观看网址| 国产精品一区二区性色av| 中文字幕亚洲在线观看| 日韩精品极品视频在线观看免费| 亚洲高清资源在线观看| 久热免费在线观看| 成人免费电影视频| 欧美人与禽zoz0善交| 午夜婷婷国产麻豆精品| 国产喷水吹潮视频www| 亚洲视频在线看| 草草在线观看| 91久久精品一区二区别| 日韩欧美一区免费| jizzjizzxxxx| 成人午夜私人影院| 国产极品美女在线| 在线看日本不卡| 亚洲欧美日韩免费| 欧美激情欧美狂野欧美精品| 亚洲伊人伊成久久人综合网| 日韩高清国产一区在线观看| 国产精品毛片在线| 在线免费看黄色片| 亚洲精品少妇30p| 亚洲永久精品视频| 深夜福利91大全| 精品网站在线| 特级西西444www大精品视频| 久久久久久久欧美精品| 这里只有精品在线观看视频| 一区二区三区欧美在线观看| 99精品视频免费看| 精品国产区一区二区三区在线观看| 免费污视频在线一区| 欧美午夜免费| 日本视频免费一区| 亚洲人成人无码网www国产| 日韩欧美在线国产| 欧洲亚洲在线| 国产精品成av人在线视午夜片| 国产精品欧美在线观看| 国产精品免费成人| 国产亲近乱来精品视频| 久久国产香蕉视频| 在线日韩日本国产亚洲| 香蕉成人影院| 亚洲砖区区免费| 国产一区啦啦啦在线观看| 午夜精品一区二区三区视频| 欧美一区二区福利视频| 在线观看电影av| 国产精品免费一区二区三区四区 | 国产美女av在线| 91免费版网站入口| 欧美日韩免费| 一级欧美一级日韩片| 欧美日韩国产精品一区二区不卡中文| 天堂a√在线| 国产成人97精品免费看片| 成人午夜av| 深爱五月综合网| 亚洲国产综合色| 欧美偷拍视频| 国产日韩欧美成人| 午夜久久影院| 亚洲黄色在线网站| 欧美性大战久久久久久久蜜臀| 很黄的网站在线观看| 国产精品视频福利| 视频在线在亚洲| 99久久99久久精品国产| 亚洲国产欧美一区二区三区同亚洲| 蜜臀国产一区| 六月婷婷激情网| 91视频91自| 国产精品久久久久久免费播放| 久久久综合av| 青青草91久久久久久久久| 秋霞午夜鲁丝一区二区| 欧美特黄级在线| 黄视频网站在线看| 久久99精品久久久久久秒播放器| 日韩精品色哟哟| 朝桐光av在线| 亚洲欧洲美洲在线综合| 白嫩亚洲一区二区三区| 久久国产亚洲精品无码| 亚洲桃色在线一区| 免费毛片在线| av资源一区二区| 蜜臀久久99精品久久久画质超高清 | 欧美片网站yy| 精品极品在线| 三年中国中文在线观看免费播放| 91首页免费视频| 国产视频手机在线| 日韩免费在线看| 国产综合亚洲精品一区二| 欧美精品日韩在线| 亚洲精品国产综合区久久久久久久| 久久精品国产福利| 日本精品一区在线观看|