2012-11-13 143 views
0

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

+0

通过编程的方式,你的意思是根本不使用浏览器?如果是这种情况,为什么你需要“屏幕抓取”?它只会在java中执行吗? – aaronps

+0

查找页面中的'form'用来提交登录请求,得到URL,然后请求URL编程,并得到该Cookie,使用它可以请求与登录状态之后的页面。 – neevek

+0

与aaronps相同的问题,为什么你需要刮擦?您是否需要自动化用户并验证用户操作导致的数据? – amjad

回答

1

这听起来像是登录对话框不是原页面的一部分,但通过一些JavaScript的飞行结构,可能通过Ajax调用。

你所需要的是某种形式的无头的浏览器,支持JavaScript和Ajax。

看一看的HtmlUnit(http://htmlunit.sourceforge.net/),从介绍:

是的HtmlUnit一个 “Java程序图形界面的浏览器”。它模拟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的更多详细信息,请参阅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()); 
     } 

    } 

} 
+0

你能解释我怎么可以使用这个登录。我已经添加了外部罐子,并可以使用htmlunit,但我不知道该怎么做才能实现我想要的。该网站是http://qub.ac.uk/qol – bobjamin

+0

我添加了一个例子,一些提示,我的答案。我希望你会接受这个答案。有关HtmlUnit的更多问题,请参阅文档并在此处提出一个新问题,如果在其他地方找不到答案。 –