这听起来好像登录对话框不是原始页面的一部分,而是由一些 JavaScript 动态构建的,可能通过 Ajax 调用。
您需要的是某种无头浏览器,它支持 javaScript 和 Ajax。
看看HtmlUnit (http://htmlunit.sourceforge.net/),来自介绍:
HtmlUnit 是“Java 程序的无 GUI 浏览器”。它对 HTML 文档进行建模并提供一个 API,允许您调用页面、填写表单、单击链接等……就像您在“普通”浏览器中所做的那样。
它具有相当好的 JavaScript 支持(不断改进),甚至能够使用相当复杂的 AJAX 库,根据您要使用的配置模拟 Firefox 或 Internet Explorer。
编辑:这是一个例子:
我注意到您要扫描的页面 (http://qub.ac.uk/qol/) 使用基本身份验证,因此弹出的不是某种 HTML 输入表单,而是浏览器对话框。当您按下开始页面上的“登录”按钮时,将加载一个页面https://qub.ac.uk/qol/,以这种方式进行保护。
为了测试,我只向您展示如何使用 HtmlUnit 从不安全的http://qub.ac.uk/qol/ 页面获取标题,因为我当然无法访问机密部分。
我认为,应该清楚它是如何工作的。有关如何使用 HtmlUnit API 的更多详细信息,请参阅网络上的优秀文档和其他资源。
package test;
import java.io.IOException;
import java.net.MalformedURLException;
import javax.xml.bind.DatatypeConverter;
import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.DomElement;
import com.gargoylesoftware.htmlunit.html.DomNodeList;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
public class Scraper {
public static void main(String[] args)
throws FailingHttpStatusCodeException, MalformedURLException,
IOException {
WebClient webClient = new WebClient();
String username = "user";
String password = "pw";
String authString = username + ":" + password;
String authEncoded = DatatypeConverter.printBase64Binary(authString
.getBytes());
webClient.addRequestHeader("Authorization", "Basic " + authEncoded);
HtmlPage page = webClient.getPage("http://qub.ac.uk/qol/");
// System.out.println(page.asXml());
DomNodeList<DomElement> headings = page.getElementsByTagName("h3");
for (DomElement e : headings) {
System.out.println("Got heading: " + e.getTextContent());
}
}
}