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

我知道如何从屏幕上抓取普通页面,但不知道如何抓取安全网站后面的页面。

  1. 这可以通过 .NET WebClient 类来完成吗?
    • 我如何自动登录?
    • 我如何在其他页面保持登录状态?
有帮助吗?

解决方案

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

两个要点:

  • 与 WebClient 相关的 https 没有什么特别之处 - 它只是有效
  • Cookie 通常用于进行身份验证 - 您需要捕获并重放它们

这是我要遵循的步骤:

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

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

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

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

使用工具查看此类工作的 http 流量非常有帮助 - 我推荐 即HttpHeaders, 提琴手, , 或者 火虫 (网络选项卡)。

其他提示

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

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

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

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

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

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

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

从您的问题中不清楚您所指的是哪种 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 )
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top