【问题标题】:How to use webclient in a secure site?如何在安全站点中使用 webclient?
【发布时间】:2008-09-07 07:40:20
【问题描述】:

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

我知道如何截取普通页面,但不知道如何截取安全网站背后的页面。

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

【问题讨论】:

    标签: .net screen-scraping


    【解决方案1】:

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

    两个要点:

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

    这是我要遵循的步骤:

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

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

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

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

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

    【讨论】:

      【解决方案2】:

      您可以轻松模拟用户输入。您可以通过向网站发送 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 脚本或某种 CAPTCHA,您可能会遇到一些问题。

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          【解决方案4】:

          从您的问题中不清楚您指的是哪个 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 )
          

          【讨论】:

            猜你喜欢
            • 2023-03-16
            • 2016-03-08
            • 1970-01-01
            • 2021-11-27
            • 1970-01-01
            • 1970-01-01
            • 2023-03-31
            • 1970-01-01
            • 2018-11-23
            相关资源
            最近更新 更多