【问题标题】:Getting data from a webpage (screenscraping)从网页获取数据(截屏)
【发布时间】:2012-11-13 11:31:35
【问题描述】:

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

【问题讨论】:

  • 通过编程你的意思是根本不使用浏览器?如果是这种情况,为什么需要“屏幕抓取”?只在java中可以吗?
  • 在页面中找到一个form,用于提交登录请求,获取url,并以编程方式请求该url并获取cookie,您可以使用它请求登录后的后续页面状态。
  • 和 aaronps 一样的问题,为什么需要刮?您是否需要自动化用户并验证您作为用户操作的结果获得的数据?
  • 是的,如果可能的话,我只想使用 java,任何方法。我不需要它,但我想以编程方式查找我的课堂下载(项目和讲座)的任何更新,并能够立即下载它们,而不是拖网网页并输入我的 id 并一遍又一遍地传递。还要回答 Neevek 它似乎没有表格请求,也许我只是愚蠢。它的链接是:qub.ac.uk/qol

标签: java authentication web screen-scraping


【解决方案1】:

这听起来好像登录对话框不是原始页面的一部分,而是由一些 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());
        }

    }

}

【讨论】:

  • 你能解释一下我如何使用这个登录吗?我已经添加了外部 jar 并且可以使用 htmlunit,但我不确定如何实现我想要的。该网站是qub.ac.uk/qol
  • 我在回答中添加了一个示例和一些提示。我希望你能接受这个答案。有关 HtmlUnit 的更多问题,请参阅文档并在此处提出新问题,如果您在其他地方找不到答案。
猜你喜欢
  • 2012-06-16
  • 2019-03-30
  • 2010-10-12
  • 2010-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多