使用C#HttpClient登录网站并从另一个页面抓取信息

我正在尝试使用C#和Chrome Web Inspector登录http://www.morningstar.com并在页面http://financials.morningstar.com/income-statement/is.html?t=BTDPF&region上检索一些信息= usa&culture = en-US 。

我不太明白,必须使用什么心理过程来解释Web Inspector中的信息,以模拟登录并模拟保持会话并导航到下一页以收集信息。

有人可以解释或指向我的资源吗?

目前,我只有一些代码来获取主页和登录页面的内容:

public class Morningstar { public async static void Ru4n() { var url = "http://www.morningstar.com/"; var httpClient = new HttpClient(); httpClient.DefaultRequestHeaders.TryAddWithoutValidation("Accept", "text/html,application/xhtml+xml,application/xml"); httpClient.DefaultRequestHeaders.TryAddWithoutValidation("Accept-Encoding", "gzip, deflate"); httpClient.DefaultRequestHeaders.TryAddWithoutValidation("User-Agent", "Mozilla/5.0 (Windows NT 6.2; WOW64; rv:19.0) Gecko/20100101 Firefox/19.0"); httpClient.DefaultRequestHeaders.TryAddWithoutValidation("Accept-Charset", "ISO-8859-1"); var response = await httpClient.GetAsync(new Uri(url)); response.EnsureSuccessStatusCode(); using (var responseStream = await response.Content.ReadAsStreamAsync()) using (var decompressedStream = new GZipStream(responseStream, CompressionMode.Decompress)) using (var streamReader = new StreamReader(decompressedStream)) { //Console.WriteLine(streamReader.ReadToEnd()); } var loginURL = "https://members.morningstar.com/memberservice/login.aspx"; response = await httpClient.GetAsync(new Uri(loginURL)); response.EnsureSuccessStatusCode(); using (var responseStream = await response.Content.ReadAsStreamAsync()) using (var streamReader = new StreamReader(responseStream)) { Console.WriteLine(streamReader.ReadToEnd()); } } 

编辑:最后,根据穆罕默德的建议,我使用了以下代码:

  ScrapingBrowser browser = new ScrapingBrowser(); //set UseDefaultCookiesParser as false if a website returns invalid cookies format //browser.UseDefaultCookiesParser = false; WebPage homePage = browser.NavigateToPage(new Uri("https://members.morningstar.com/memberservice/login.aspx")); PageWebForm form = homePage.FindFormById("memberLoginForm"); form["email_textbox"] = "example@example.com"; form["pwd_textbox"] = "password"; form["go_button.x"] = "57"; form["go_button.y"] = "22"; form.Method = HttpVerb.Post; WebPage resultsPage = form.Submit(); 

您应该模拟网站的登录过程。 最简单的方法是通过一些调试器检查网站(例如Fiddler )。

这是网站的登录请求:

 POST https://members.morningstar.com/memberservice/login.aspx?CustId=&CType=&CName=&RememberMe=true&CookieTime= HTTP/1.1 Accept: text/html, application/xhtml+xml, */* Referer: https://members.morningstar.com/memberservice/login.aspx ** omitted ** Cookie: cookies=true; TestCookieExist=Exist; fp=001140581745182496; __utma=172984700.91600904.1405817457.1405817457.1405817457.1; __utmb=172984700.8.10.1405817457; __utmz=172984700.1405817457.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmc=172984700; ASP.NET_SessionId=b5bpepm3pftgoz55to3ql4me email_textbox=test@email.com&pwd_textbox=password&remember=on&email_textbox2=&go_button.x=36&go_button.y=16&__LASTFOCUS=&__EVENTTARGET=&__EVENTARGUMENT=&__VIEWSTATE=omitted&__EVENTVALIDATION=omited 

检查时,您会看到一些cookie和表单字段,如“__VIEWSTATE”。 您需要此字段的实际值才能登录。您可以使用以下步骤:

  1. 发出请求并废弃“__LASTFOCUS”,“__ EVENTTARGET”,“_ _ EVENTARGUMENT”,“_ _ _ JSTENT”,“_ _ EVVALIDATION”等字段; 和cookies。
  2. 在同一页面上创建一个新的POST请求,使用前一个的CookieContainer; 使用报废字段,用户名和密码构建post字符串。 使用MIME类型application/x-www-form-urlencoded
  3. 如果成功使用cookie以进一步请求保持登录状态。

注意:您可以使用htmlagilitypack或scrapysharp来废弃html。 ScrapySharp为表单发布表单和浏览网站提供易于使用的工具。

mental is process是模拟一个人在网站上登录,一些登录是使用AJAX或传统的POST请求进行的,所以,你要做的第一件事就是像浏览器这样的请求,在服务器响应中,你会得到cookie,标题和其他信息,您需要使用该信息来构建新请求,这是一个冗长的请求。

步骤是:

1)像浏览器一样构建请求,以向应用程序validation自己。 2)检查响应,并保存标题,cookie或其他有用信息以保持与服务器的会话。 3)使用从第二步收集的信息向服务器发出另一个请求。 4)检查响应,并使用数据分析算法或其他东西来提取数据。

提示:

你没有在这里使用javascript引擎,一些网站使用javascript来显示图形,或者在DOM文档中执行一些交互。 在这种情况下,您可能需要使用WebKit lib包装器。