2012-02-23 22 views
0

我想過實現一個Android應用程序,它將從第三方網站下載數據。該網站包含多個頁面,每個頁面只包含大約200字節的有用數據和大約20千字節的數據,我不想使用它們。有什麼辦法只下載文檔的那一部分?或者以某種方式過濾數據以最小化下載的信息量?提前致謝。只下載HTML文檔的一小部分

+2

看到這個SO-post:http://stackoverflow.com/questions/3414438/java-resume-download-in-urlconnection – dacwe 2012-02-23 10:24:59

+0

@dacwe,我不是在談論恢復下載,我只想下載一部分的HTML文件。 – Egor 2012-02-23 10:28:23

+1

另一個問題的接受答案告訴你如何下載指定範圍的文檔,這是你所要求的。 – 2012-02-23 10:31:33

回答

2

您需要Range HTTP請求標頭,您可以使用該標頭指定資源中的開始和結束包含字節的地址地址。

Range: bytes=0-99 

將檢索第一100字節,作爲標題從第一字節指定的區域(偏移量爲零)直到幷包括第100字節(偏移量99)。同樣

Range: bytes=0-0 

將檢索第一個字節。


讓它首先與BBC網站合作,我知道它的標題是Range

use strict; 
use warnings; 

use LWP; 

my $ua = LWP::UserAgent->new; 
my $req = HTTP::Request->new('GET', 'http://www.bbc.co.uk/'); 
$req->header('Range', 'bytes=0-13'); 
my $resp = $ua->request($req); 

print $resp->decoded_content; 

這將返回頁面的前14個字節<!DOCTYPE html

然後插入我們自己的網站。如果它仍然給你整個網站,那麼你已經離開了lukc,並且你不能夠回覆我害怕的東西。


如果你只留下一個Perl版本就不公平了。下面是在Java

DefaultHttpClient client = new DefaultHttpClient(); 

HttpGet req = new HttpGet("http://www.bbc.co.uk/"); 
req.setHeader("Range", "bytes=0-13"); 
HttpResponse resp = client.execute(req); 
HttpEntity ent = resp.getEntity(); 
String content = EntityUtils.toString(ent); 

System.out.println(resp.getStatusLine()); 
System.out.println(ent.getContentLength()); 
System.out.println(content);  

其輸出

HTTP/1.1 206 Partial Content 
14 
<!DOCTYPE html 

顯示,只有14字節被讀取。將您的網址插入此網址並查看它是否有效。

+1

+1,請注意,服務器並不總是遵守範圍請求。 – dacwe 2012-02-23 10:44:05

+0

是的dacwe,但是除了整個資源之外,沒有辦法檢索任何東西。 – Borodin 2012-02-23 10:46:03

+0

正確的,只是一個說明OP! – dacwe 2012-02-23 10:49:59

0

如果網站總是非常相似,您可以使用skip(n) - 方法InputStream跳過n個字節。

+1

你仍然「下載」數據 - 然後你跳過它。 – dacwe 2012-02-23 10:38:42