0

我正在尝试抓取需要身份验证的网页。当我登录时,我可以在浏览器中访问该页面,使用 JSoup http://jsoup.org/库来解析 HTML 页面。

public static void main(String[] args) throws IOException {

    // need http protocol
    Document doc = Jsoup.connect("http://www.secinfo.com/$/SEC/Filing.asp?T=r643.91Dx_2nx").get();

    // get page title

    String title = doc.title();
    System.out.println("title : " + title);

    // get all links
    Elements links = doc.select("a");
    for (Element link : links) {                   
        // get the value from href attribute
        System.out.println("\nlink : " + link.attr("href"));                   
    }
            System.out.println();

  }

输出 :

title : SEC Info - Sign In

这是获取登录页面的内容,而不是我传递的实际 URL。我在 secinfo.com 上注册,在运行这个程序时,我从我的默认浏览器 Firefox 登录。

4

3 回答 3

0

如果您的目标站点的登录机制与请求一起使用, Jsoupconnect()还支持with 方法链接:post()POST

Document doc = Jsoup.connect("url")
  .data("aUserName", "myUserName")
  .data("aPassword", "myPassword")
  .userAgent("Mozilla")
  .timeout(3000)
  .post();

但是,如果您尝试获取的页面需要后续cookie发送每个请求怎么办?尝试使用HttpURLConnection并从 HTTP 连接响应标头中POST读取。将使您更轻松地完成此任务。使用该库以字符串形式获取网页,然后将字符串传递给函数以获取文档。 cookieHttpClientjsoup.parse()

于 2013-10-14T16:05:36.877 回答
0

您必须使用 post 命令登录并保留您返回的 cookie。那是您存储会话信息的地方。我在这里写了一个例子:Jsoup can't Login on Page。示例中的网站是一个例外,它已经在登录页面上设置了会话 cookie。如果它适合您,您可以离开该步骤。

确切的发布命令可能因网站而异。您必须从 html 中挖掘出来,或者您必须在浏览器中安装插件并拦截发布命令。

于 2013-10-15T08:20:22.353 回答
0

即使您使用默认浏览器登录,这也无济于事。您的 java 程序是一个单独的进程,它不会与您的浏览器共享屏幕。

另一方面,secinfo 需要身份验证,而 JSoup 允许您传递身份验证详细信息。

当我通过身份验证详细信息时,它对我有用:

请检查此答案(具有基本访问身份验证的 Jsoup 连接

于 2013-09-21T06:30:13.237 回答