我正在尝试抓取需要身份验证的网页。我登录时可以在浏览器中访问该页面,使用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
这是获取登录页面的内容而不是我传递的实际网址。我在secinfo.com上注册,在运行此程序时,我从默认浏览器Firefox登录。
答案 0 :(得分:0)
即使您使用默认浏览器登录,这也无济于事。您的java程序是一个单独的进程,它不与您的浏览器共享屏幕。
另一方面,secinfo需要身份验证,JSoup允许您传递身份验证详细信息。
当我传递身份验证详细信息时,它适用于我:
答案 1 :(得分:0)
如果您的目标网站的登录机制与connect()
请求一起使用,Jsoup的post()
也支持使用方法链接POST
:
Document doc = Jsoup.connect("url")
.data("aUserName", "myUserName")
.data("aPassword", "myPassword")
.userAgent("Mozilla")
.timeout(3000)
.post();
但是,如果您尝试获取的页面需要后续cookie
发送每个请求,该怎么办?尝试将HttpURLConnection
与POST
一起使用,并从HTTP连接响应标头中读取cookie
。 HttpClient
会让您更轻松地完成此任务。使用库以字符串形式获取网页,然后将字符串传递给jsoup.parse()
函数以获取文档。
答案 2 :(得分:0)
您必须使用post命令登录并保留您获得的Cookie。这是存储会话信息的地方。我在这里写了一个例子:Jsoup can't Login on Page。 示例中的网站是一个例外,它在登录页面上设置了会话cookie。如果适合你,你可以离开那一步。
确切的post命令可能因网站而异。你必须从html中挖掘它,或者你必须在浏览器中安装一个插件并拦截post命令。