/// <summary> /// Walk through pages of results /// </summary> /// <param name="url"></param> /// <param name="depth"></param> /// <returns></returns> private List <GoogleSearchResult> RecursiveResults(string url, int depth = 1) { var ret = new List <GoogleSearchResult>(); GoogleJsonFormat jResult = null; try { using (var webClient = new WebClient()) { webClient.Encoding = Encoding.UTF8; var json = webClient.DownloadString(url); jResult = JsonConvert.DeserializeObject <GoogleJsonFormat>(json); } } catch (Exception) { //This happens if you reach your daily or user limit } if (jResult != null) { if (jResult.items != null) { ret = jResult.items.Select(r => new GoogleSearchResult() { Mime = r.mime, Url = r.link, Title = r.title, Description = r.snippet }).ToList(); } if (depth < _maxPages && jResult.queries.nextPage != null && jResult.queries.nextPage.Any()) { //there is a next page string oldstart = null; if (Options.ContainsKey("start")) { oldstart = Options["start"]; } Options["start"] = jResult.queries.nextPage[0].startIndex.ToString(); try { var nextUrl = QueryUrl(); var theRestOfThePages = RecursiveResults(nextUrl, ++depth); ret.AddRange(theRestOfThePages); } catch (ArgumentOutOfRangeException) { //it won't search past 100 results } if (oldstart != null) { Options["start"] = oldstart; } else { Options.Remove("start"); } } return(ret); } return(ret); }
/// <summary> /// Used to search multiple pages and combine them with details /// </summary> /// <param name="url"></param> /// <returns></returns> private GoogleSearchResults RecursiveResultDetailed(string url) { var ret = new GoogleSearchResults { Results = new List <GoogleSearchResult>(), Promotions = new List <GoogleSearchResult>(), Labels = new Dictionary <string, string>(), TotalResults = 0, SearchTime = 0 }; GoogleJsonFormat jResult = null; try { using (var webClient = new WebClient()) { webClient.Encoding = Encoding.UTF8; var json = webClient.DownloadString(url); jResult = JsonConvert.DeserializeObject <GoogleJsonFormat>(json); } } catch (Exception) { //This happens if you reach your daily or user limit } if (jResult != null) { //handle the first page if (jResult.items != null) { ret.Results = jResult.items.Select(r => new GoogleSearchResult() { Mime = r.mime, Url = r.link, Title = r.title, Description = r.snippet }).ToList(); } if (jResult.queries.nextPage != null && jResult.queries.nextPage.Any()) { //there is a next page string oldstart = null; if (Options.ContainsKey("start")) { oldstart = Options["start"]; } Options["start"] = jResult.queries.nextPage[0].startIndex.ToString(); try { //let the simpler function handle the next page. var nextUrl = QueryUrl(); var theRestOfThePages = RecursiveResults(nextUrl, 2); ret.Results.AddRange(theRestOfThePages); } catch (ArgumentOutOfRangeException) { //it won't search past 100 results } if (oldstart != null) { Options["start"] = oldstart; } else { Options.Remove("start"); } } if (jResult.promotions != null) { ret.Promotions = jResult.promotions.Select(r => new GoogleSearchResult() { Mime = "text/html", Url = r.link, Title = r.title, Description = r.bodyLines[0].title }).ToList(); } if (jResult.context.facets != null) { foreach (var labelGroup in jResult.context.facets) { foreach (var label in labelGroup) { ret.Labels.Add(label.label, label.anchor); } } } ret.TotalResults = long.Parse(jResult.searchInformation.totalResults); ret.SearchTime = jResult.searchInformation.searchTime; } return(ret); }