7

我需要自动化一个涉及使用登录表单的网站的过程。我需要在登录页面之后的页面中捕获一些数据。

我知道如何筛选普通页面,但不知道如何筛选安全站点后面的页面。

  1. 这可以通过 .NET WebClient 类来完成吗?
    • 我将如何自动登录?
    • 我将如何保持登录其他页面?
4

4 回答 4

9

一种方法是使浏览器自动化——您提到了 WebClient,所以我猜您可能指的是 .NET 中的 WebClient。

两个要点:

  • 与 WebClient 相关的 https 并没有什么特别之处——它可以正常工作
  • Cookies 通常用于进行身份验证——您需要捕获并重放它们

这是我要遵循的步骤:

  1. 获取登录表单,捕获响应中的 cookie。
  2. 使用 Xpath 和 HtmlAgilityPack,找到“input type=hidden”字段名称和值。
  3. POST 到登录表单的操作,其中包含用户名、密码和请求正文中的隐藏字段值。在请求标头中包含 cookie。同样,在响应中捕获 cookie。
  4. 再次使用请求标头中的 cookie 获取您想要的页面。

在第 2 步中,我提到了一种用于自动登录的有点复杂的方法。通常,您可以使用用户名和密码直接发布到已知的登录表单操作,而无需获取初始表单或中继隐藏字段。一些站点在其表单上具有表单验证(不同于字段验证),这使得该方法不起作用。

HtmlAgilityPack是一个 .NET 库,它允许您将格式不正确的 html 转换为 XmlDocument,以便您可以对其进行 XPath。很有用。

最后,您可能会遇到表单依赖客户端脚本在提交之前更改表单值的情况。您可能需要模拟这种行为。

使用工具查看此类工作的 http 流量非常有帮助 - 我推荐ieHttpHeadersFiddlerFireBug(网络选项卡)。

于 2008-09-07T08:02:03.853 回答
1

您可以轻松模拟用户输入。您可以通过向网站发送 post\get 请求从您的程序提交网页上的表单。
典型的登录表单如下所示:

<form name="loginForm" method="post" Action="target_page.html">
   <input type="Text" name="Username">
   <input type="Password" name="Password">
</form>

您可以向提供用户名和密码字段值的网站发送发布请求。发送请求后会发生什么很大程度上取决于网站,通常您会被重定向到某个页面。您的授权信息将存储在 session\cookie 中。因此,如果您抓取客户端可以维护网络会话\理解 cookie,您将能够访问受保护的页面。

从您的问题中不清楚您将使用哪种语言\框架。例如,有一个用 perl 编写的屏幕抓取框架(包括登录功能) - WWW::Mechanize

请注意,如果您尝试登录的站点使用 java 脚本或某种验证码,您可能会遇到一些问题。

于 2008-09-07T07:51:24.223 回答
0

你能澄清一下吗?您所说的 WebClient 类是 HTTPUnit/Java 中的类吗?

如果是这样,您的会话应自动保存。

于 2008-09-07T07:55:54.493 回答
0

从您的问题中不清楚您指的是哪个 WebClient 类(或语言)。

如果有 Java 运行时,您可以使用 Apache HttpClient 类;这是我使用 Groovy 编写的一个示例,它通过 SSL 访问美味的 API:

   def client = new HttpClient()

   def credentials = new UsernamePasswordCredentials( "username", "password" )
   def authScope = new AuthScope("api.del.icio.us", 443, AuthScope.ANY_REALM)
   client.getState().setCredentials( authScope, credentials )

   def url = "https://api.del.icio.us/v1/posts/get"

   def method = new PostMethod( url )
   method.addParameter( "tag", tag )
   client.executeMethod( method )
于 2008-09-07T08:13:20.567 回答