题
我需要自动化涉及使用登录表单的网站的流程。我需要捕获登录页面后面的页面中的一些数据。
我知道如何从屏幕上抓取普通页面,但不知道如何抓取安全网站后面的页面。
- 这可以通过 .NET WebClient 类来完成吗?
- 我如何自动登录?
- 我如何在其他页面保持登录状态?
解决方案
一种方法是通过自动化浏览器——您提到了 WebClient,所以我猜您可能指的是 .NET 中的 WebClient。
两个要点:
- 与 WebClient 相关的 https 没有什么特别之处 - 它只是有效
- Cookie 通常用于进行身份验证 - 您需要捕获并重放它们
这是我要遵循的步骤:
- 获取登录表单,捕获响应中的 cookie。
- 使用 Xpath 和 HtmlAgilityPack,查找“input type=hidden”字段名称和值。
- 使用请求正文中的用户名、密码和隐藏字段值 POST 到登录表单的操作。将 cookie 包含在请求标头中。再次捕获响应中的 cookie。
- 再次使用请求标头中的 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 )