使用HTMLAgilityPack登录网站

时间:2012-11-26 16:26:22

标签: c# login html-agility-pack login-script

在下面的代码中,我可以使用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");

3 个答案:

答案 0 :(得分:6)

  

无论如何要做到这一点?

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

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

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

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

您可能希望调查使用seleniumWatiN等网络自动化工具。

答案 1 :(得分:2)

您需要通过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<Cookie> responseCookies = cookies.GetCookies(uri).Cast<Cookie>();
      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);
 }

答案 2 :(得分:0)

我不知道您是否正在使用WPF WebBrowser控件,但如果您使用,则可以使用

中的内容。
doc.GetElementById("submit_signin").Click();

这对我有用。

相关问题