2012-11-13 136 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的更多問題,請參閱文檔並在此處提出一個新問題,如果在其他地方找不到答案。 –