public PushResult ( |
||
result | ||
Результат | void |
public PhaseResult RunAsIteration(Context context) { Initialize(context); Boundary bound = _step > 0 ? new Boundary(LessOrEqual) : new Boundary(GreaterOrEqual); List<String> jsonResult = new List<string>(); for (int i = _from; bound(i, _to); i += _step) { _updatableRequest.Update(context, i); PhaseResult pr = Request.Run(context); context.PushResult(pr); // 检查是否可以更新_to if (!_toPageInitialized) { Match match = Regex.Match(context.LastRequestContent, To); String pageStr = match.Groups[1].Value; Int32 page; if (Int32.TryParse(pageStr, out page)) { _to = page; _toPageInitialized = true; } } pr = Parse.Run(context); context.PushResult(pr); if (pr.ListResult != null) { jsonResult.AddRange(pr.ListResult); } } PhaseResult result = new PhaseResult(this); result.Succeed = true; result.ListResult = jsonResult; context.PushResult(result); return result; }
public PhaseResult Run(Context context) { Boolean succ = true; foreach (IPhase phase in _logoutPhases) { PhaseResult pr = phase.Run(context); context.PushResult(pr); if (!pr.Succeed) { succ = false; break; } } PhaseResult result = new PhaseResult(this); result.Succeed = succ; return result; }
public PhaseResult RunAsNestedList(Context context) { PhaseResult list = MetaList.Run(context); PhaseResult pr = new PhaseResult(this); List<String> jsonResult = new List<string>(); if (list.ListResult != null) { GeckoWebBrowser browser = (GeckoWebBrowser)context.GetService(typeof(GeckoWebBrowser)); foreach (String item in list.ListResult) { Dictionary<String, String> itemDict = JsonConvert.DeserializeObject<Dictionary<String, String>>(item); if (itemDict.ContainsKey(MetaListUrlKey)) { String url = itemDict[MetaListUrlKey]; if (!url.StartsWith("http")) { url = String.Format("{0}/{1}", "http://club.autohome.com.cn", url.TrimStart('/')); } String content = String.Empty; if (browser != null) { content = RequestHelper.BrowserGet(browser, url); } else { content = RequestHelper.Get(url); } context.LastRequestContent = content; PhaseResult parseResult = Parse.Run(context); context.PushResult(parseResult); jsonResult.AddRange(parseResult.ListResult ?? new List<String>()); } } } pr.ListResult = jsonResult; pr.Succeed = true; return pr; }
/// <summary> /// context里的RuntimeProvider应该已经设置好 /// </summary> /// <returns></returns> private List<String> GenerateOneBatch(Context context) { Int32 from; Int32 to; Int32 step; List<String> result = new List<string>(); if (!Int32.TryParse(From, out from)) { throw new ArgumentException("From is corrupted."); } if (!Int32.TryParse(Step, out step)) { throw new ArgumentException("Step is corrupted."); } // 如果To不是一个数字,则是一个正则表达式,先使用FirstPage进行请求html if (!Int32.TryParse(To, out to)) { if (FirstPage == null) { String msg = "When To is a regular expression, FirstPage is expected."; throw new ArgumentException(msg); } PhaseResult html = FirstPage.Run(context); context.PushResult(html); Match match = Regex.Match(context.LastRequestContent, To); if (!match.Success || !Int32.TryParse(match.Groups[1].Value, out to)) { to = from; } } //String pattern = context.Resolve(Pattern); for (int i = from; i <= to; i += step) { Dictionary<String, String> dict = new Dictionary<string, string>(); foreach (Pattern pattern in Patterns) { String resolvedPattern = context.Resolve(pattern.RawPattern); if (ParameterResolver.HasDataBinding(resolvedPattern, Constant.RuntimePrefix)) { return null; } String gen = resolvedPattern.Replace(Constant.UpdatablePlaceHolder, i.ToString()); dict.Add(pattern.Name, gen); } result.Add(JsonConvert.SerializeObject(dict)); } if (Save) { context.JsonResult.AddRange(result); } return result; }
public PhaseResult Run(Context context) { //PhaseResult last = context.Stack.LastOrDefault(); List<String> bind = null; if (!String.IsNullOrWhiteSpace(Binding)) { if (context.JsonResults.ContainsKey(Binding)) { bind = context.JsonResults[Binding]; } else { bind = new List<string>(); } } else { PhaseResult last = context.Stack.LastOrDefault(); if (last != null) { bind = last.ListResult; } } PhaseResult pr = new PhaseResult(this); pr.ListResult = new List<string>(); if (bind != null) { foreach (String json in bind) { //IDataProvider provider = new BasicDataProvider(); // TODO:使用动态绑定来获取url // provider.SetString("url", json); try { IDataProvider provider = BasicDataProvider.CreateFromJson(json); context.RuntimeProviders.Push(provider); PhaseResult result = Request.Run(context); context.PushResult(result); result = Parse.Run(context); context.PushResult(result); if (result.ListResult != null) { pr.ListResult.AddRange(result.ListResult); } } finally { context.RuntimeProviders.Pop(); } } } else { PhaseResult result = Request.Run(context); context.PushResult(result); result = Parse.Run(context); context.PushResult(result); if (result.ListResult != null) { pr.ListResult.AddRange(result.ListResult); } } if (!String.IsNullOrWhiteSpace(ListID)) { if (context.JsonResults.ContainsKey(ListID)) { context.JsonResults[ListID] = pr.ListResult; } else { context.JsonResults.Add(ListID, pr.ListResult); } } return pr; }