使用HTMLAgilityPack登录网站

在下面的代码中,我可以使用HTMLAgilitypack设置用户名和密码的值,但是我无法调用登录按钮的click事件(按钮的源代码中的id是“s1”)。

无论如何要做到这一点? 我没有使用WebBrowser的原因是因为我需要HTMLAgilityPack来从页面中检索没有ID的数据。

 var doc = new HtmlWeb().Load("http://MYURL.com"); doc.DocumentNode.SelectSingleNode("name").SetAttributeValue("value", "MyUsername"); doc.DocumentNode.SelectSingleNode("password").SetAttributeValue("value", "MyPassword"); 

无论如何要做到这一点?

不是HTML Agility Pack(HAP)库提供的 – 而不是直接。

HAP非常适合获取单个页面并对其进行解析,但它不是为继续交互而设计的。 缺少的是cookie管理,JavaScript交互等等。

为了登录,您可能需要向服务器发送HTTP POST,包括您想要的数据 – HAP无法帮助您。

您将需要使用类似WebRequest的类来发布post – 我建议查看fiddler并使用它来查看请求应该是什么样子并相应地构建它,尽管这可能只是第一步。

您可能想要研究使用网络自动化工具,例如selenium或WatiN 。

您需要通过fiddler观察POST请求并查看其结构。 例如 :

  {"userName":"you","password":"pwd"} 

通常,站点会通过在您的请求中接收cookie来识别您已登录。

默认情况下, HttpClient会将从每个顺序请求从特定域收到的cookie发送到该域(直到您处置该HttpClient实例)

1)创建一个cookie容器并将其分配给您的HttpClient实例。

2)使用HttpClient进行登录POST请求。

3)使用HttpClient进行数据GET请求。

4)从响应中读取html字符串。

5)使用HtmlAgilityPack HtmlDocument从html字符串加载文档而不是从Web加载文档(如大多数示例所示)。

  string baseUrl = "https://www.yourwebsite.com"; string loginUrl = "/Account/LogOn"; string sessionUrl = "/Data"; var uri = new Uri(baseUrl); CookieContainer cookies = new CookieContainer(); HttpClientHandler handler = new HttpClientHandler(); handler.CookieContainer = cookies; using (var client = new HttpClient(handler)) { client.BaseAddress = uri; var request = new { userName = "you", password = "pwd" }; var resLogin = client.PostAsJsonAsync(loginUrl,request).Result; if (resLogin.StatusCode != HttpStatusCode.OK) Console.WriteLine("Could not login -> StatusCode = " + resLogin.StatusCode); // see what cookies are returned IEnumerable responseCookies = cookies.GetCookies(uri).Cast(); foreach (Cookie cookie in responseCookies) Console.WriteLine(cookie.Name + ": " + cookie.Value); var resData = client.GetAsync(dataUrl).Result; if(resSession.StatusCode != HttpStatusCode.OK) Console.WriteLine("Could not get data html -> StatusCode = " + resSession.StatusCode); var html = resSession.Content.ReadAsStringAsync().Result; var doc = new HtmlDocument(); doc.LoadHtml(html); } 

我不知道你是否使用WPF WebBrowser控件,但如果你是,你可以使用的东西是

 doc.GetElementById("submit_signin").Click(); 

这对我有用。