2011-04-25 53 views
0

我正在嘗試獲取以下頁面的源代碼:http://www.amazon.com/gp/offer-listing/082470732X/ref=dp_olp_0?ie=UTF8&redirect=true&condition=all (請注意,如果您點擊鏈接,亞馬遜會將您帶到另一頁面。我有興趣在閱讀請複製鏈接並將其粘貼到瀏覽器的空白標籤。謝謝!)使用Java獲取以下頁面的源代碼使用Java

通常使用java.net API,我可以獲得大多數URL的源代碼,幾乎沒有問題但是,對於上述鏈接,我什麼也得不到。原來,由連接所產生的輸入流由gzip的編碼,所以我嘗試了以下內容:

URL url = new URL(urlString); 
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); 
InputStream is = urlConnection.getInputStream(); 
HttpURLConnection.setFollowRedirects(true); 
urlConnection.setRequestProperty("Accept-Encoding", "gzip, deflate"); 
String encoding = urlConnection.getContentEncoding(); 
if (encoding != null && encoding.equalsIgnoreCase("gzip")) { 
    is = new GZIPInputStream(is); 
} else if (encoding != null && encoding.equalsIgnoreCase("deflate")) { 
    is = new InflaterInputStream((is), new Inflater(true)); 
} 

然而,這一次,我碰到下面的錯誤確定性:

java.io.EOFException 
at java.util.zip.GZIPInputStream.readUByte(GZIPInputStream.java:249) 
at java.util.zip.GZIPInputStream.readUShort(GZIPInputStream.java:239) 
at java.util.zip.GZIPInputStream.readHeader(GZIPInputStream.java:142) 
at java.util.zip.GZIPInputStream.<init>(GZIPInputStream.java:58) 
at java.util.zip.GZIPInputStream.<init>(GZIPInputStream.java:67) 
at domain.logic.ItemScraper.loadURL(ItemScraper.java:405) 
at domain.logic.ItemScraper.main(ItemScraper.java:510) 

任何人能看到我的錯誤?是否有另一種方式來閱讀這個特定的頁面?有人可以解釋爲什麼我的瀏覽器(Firefox)可以讀取它,但是我無法使用Java讀取源代碼?

在此先感謝,最好的問候,

+1

我可以使用WebDeveloper插件在Firefox中使用VIEW GENERATED SOURCE查看它。似乎很難用Java來做到這一點誠實 – MJB 2011-04-25 00:59:47

+0

「is」的設置在哪裏? ..傳入GZIPInputStream的人 – MeBigFatGuy 2011-04-25 01:02:24

+0

請在你創建'is'的地方發帖。 – 2011-04-25 01:07:41

回答

0

而不是

is = new GZIPInputStream(is); 

嘗試

is = new GZIPInputStream(urlConnection.getInputStream()); 

至於EOFException,如果添加

urlConnection.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.50 Safari/534.24"); 

它會消失。

+0

優秀的答案。有效!你能解釋一下,這是什麼?我的意思是改變了?它是否欺騙了亞馬遜像一個真正的網絡瀏覽器或類似的東西? – 2011-04-25 04:08:16

+0

是的,類似的東西。 – 2011-04-25 04:22:45

0

您可以使用標準的BufferedReader閱讀給定的URL的Web服務器的響應。

URLIn = new BufferedReader(new InputStreamReader(new URL(URLOrFilename).openStream())); 

然後用...

while ((incomingLine = URLIn.readLine()) != null) { 
... 
} 

...獲得響應。

+0

啊,你是對的 - 這是一個錯字(我糾正了代碼)。我在多年前在Java 1.4.2中寫過的一個網絡蜘蛛中使用了上面的代碼 - 所以它應該在比這更新的任何版本中工作。 – jefflunt 2011-04-25 01:28:49

相關問題