Java 从网页获取数据(屏幕抓取)

Java 从网页获取数据(屏幕抓取),java,authentication,web,screen-scraping,Java,Authentication,Web,Screen Scraping,有谁能给我一个关于屏幕抓取的好教程吗。我有一个我的大学用来上传每个班级所有数据的网页。要进入他们网站的主页,有一个带有登录按钮的进入屏幕。按下时,会弹出一个浮动对话框,询问用户名和密码。然后直接进入主页。我不知道它是在哪里申请授权,我希望能够从该网站获得数据编程。我需要的数据是通过更多的屏幕登录,但如果我能通过我的id和密码的第一个屏幕,我会很高兴。最好是用java实现,但任何语言都可以这听起来好像登录对话框不是原始页面的一部分,而是由一些JavaScript动态构建的,可能是通过Ajax调用实

有谁能给我一个关于屏幕抓取的好教程吗。我有一个我的大学用来上传每个班级所有数据的网页。要进入他们网站的主页,有一个带有登录按钮的进入屏幕。按下时,会弹出一个浮动对话框,询问用户名和密码。然后直接进入主页。我不知道它是在哪里申请授权,我希望能够从该网站获得数据编程。我需要的数据是通过更多的屏幕登录,但如果我能通过我的id和密码的第一个屏幕,我会很高兴。最好是用java实现,但任何语言都可以

这听起来好像登录对话框不是原始页面的一部分,而是由一些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/
将被加载,并以这种方式进行保护

对于一个测试,我只向您展示如何从unsecured
http://qub.ac.uk/qol/
page使用HtmlUnit,因为我当然无法访问机密部分

我认为,总体上应该清楚它是如何工作的。有关如何使用HTMLUnitAPI的更多详细信息,请参阅优秀的文档和web上的其他资源

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());
        }

    }

}
封装测试;
导入java.io.IOException;
导入java.net.MalformedURLException;
导入javax.xml.bind.DatatypeConverter;
导入com.gargoylesoftware.htmlunit.failinghttpstatuscodecoexception;
导入com.gargoylesoftware.htmlunit.WebClient;
导入com.gargoylesoftware.htmlunit.html.doElement;
导入com.gargoylesoftware.htmlunit.html.DomNodeList;
导入com.gargoylesoftware.htmlunit.html.HtmlPage;
公共类刮刀{
公共静态void main(字符串[]args)
引发FailingHttpStatusCodeException、MalformedUrlexException、,
IOException{
WebClient WebClient=新的WebClient();
字符串username=“user”;
字符串密码=“pw”;
字符串authString=用户名+“:”+密码;
String authEncoded=DatatypeConverter.printBase64Binary(authString
.getBytes());
webClient.addRequestHeader(“授权”、“基本”+authEncoded);
HtmlPage=webClient.getPage(“http://qub.ac.uk/qol/");
//System.out.println(page.asXml());
DomNodeList headers=page.getElementsByTagName(“h3”);
用于(e部分:标题){
System.out.println(“得到标题:+e.getTextContent());
}
}
}

从程序上讲,你的意思是根本不使用浏览器?如果是这种情况,为什么需要“屏幕刮削”?在页面中找到一个
表单
,该表单用于提交登录请求、获取url、以编程方式请求url并获取cookie,您可以使用cookie请求具有登录状态的后续页面。与aaronps相同的问题是,为什么需要抓取?您是否需要自动化用户并验证用户操作所获得的数据?是的,如果可能,我只想使用java,任何方法。我不需要它,但我想以编程方式查找我的课程下载(项目和讲座)的任何更新,并能够立即下载它们,而不是拖网式浏览网页,输入我的id并一遍又一遍地传递。同样要回答Neevek,它似乎没有一个表单请求,也许我只是在装傻。它的链接是:你能解释一下我如何使用它登录吗。我已经添加了外部jar,可以使用htmlunit,但我不确定该怎么做才能实现我想要的。该网站是我已经添加了一个例子和一些提示我的答案。我希望你会接受这个答案。有关HtmlUnit的更多问题,请参阅文档,如果在其他地方找不到答案,请在此处提出新问题。