Guest User

Untitled

a guest
Apr 2nd, 2015
159
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 1.97 KB | None | 0 0
  1.         protected async Task<List<string>> DownloadUrls(string url)
  2.         {
  3.             var req = HttpWebRequest.CreateHttp(url);
  4.             var res = (HttpWebResponse)req.GetResponse();
  5.             if (!res.IsHtmlPage() || res.StatusCode != HttpStatusCode.OK) {
  6.                 return new List<string>();
  7.             }
  8.             var content = await Task.Factory.StartNew(() => req.GetResponse().Download());
  9.             return await Task.Factory.StartNew(() => {
  10.                 var dom = CsQuery.CQ.CreateDocument(content);
  11.                 return dom["a"]
  12.                     .Select(l => MakeAbsolute(l.GetAttribute("href"), this.BaseUrl))
  13.                     .ToList();
  14.             });
  15.         }
  16.  
  17.         protected async Task<List<string>[]> DownloadAsync(List<string> urls)
  18.         {
  19.             //Logger.Log(String.Join("\n", urls), LoggerMessageType.Info);
  20.             using (var semaphore = new SemaphoreSlim(5)) {
  21.                 var tasks = urls.Select(async (url) => {
  22.                     await semaphore.WaitAsync();
  23.                     try {
  24.                         var fetchedUrls = await DownloadUrls(url);
  25.                         return fetchedUrls;
  26.                     } finally {
  27.                         semaphore.Release();
  28.                     }
  29.                 });
  30.                 return await Task.WhenAll(tasks);
  31.             }
  32.         }
  33.  
  34.         protected async void RecursiveParse(string baseHost)
  35.         {
  36.             var urls = await DownloadAsync(new List<string> { baseHost });
  37.             foreach (var url in urls) {
  38.                 RecursiveParse(url, 3 /* depth of recursion */);
  39.             }
  40.         }
  41.  
  42.         protected async void RecursiveParse(List<string> urls, int depth)
  43.         {
  44.             if (depth <= 0) {
  45.                 return;
  46.             }
  47.             var newLinks = await DownloadAsync(urls);
  48.             var y = newLinks.SelectMany(x => x).Distinct().ToList();
  49.             RecursiveParse(y, depth - 1);
  50.         }
Advertisement
Add Comment
Please, Sign In to add comment