【问题标题】:Getting the source code for the following page using Java使用 Java 获取以下页面的源代码
【发布时间】:2011-04-25 00:46:04
【问题描述】:

我正在尝试获取以下页面的源代码:http://www.amazon.com/gp/offer-listing/082470732X/ref=dp_olp_0?ie=UTF8&redirect=true&condition=all (请注意,如果您单击链接,亚马逊会将您带到另一个页面。要访问我有兴趣阅读的页面,请复制链接并将其粘贴到浏览器的空白选项卡中。谢谢!)

通常使用 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 读取源代码吗?

提前致谢,致以最诚挚的问候,

【问题讨论】:

  • 我可以使用 Firefox 中的 VIEW GENERATED SOURCE 和 WebDeveloper 插件来查看它。老实说,用 Java 做这件事似乎很愚蠢
  • is 设置在哪里? .. 传入 GZIPInputStream 的那个
  • 请在您创建is的位置发布。
  • 对不起,已经是这样了:is = urlConnection.getInputStream();

标签: java url gzip


【解决方案1】:

代替

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");

它会消失。

【讨论】:

  • 优秀的答案。有效!你能解释一下,这是做什么的?我的意思是什么改变了?它是否欺骗了亚马逊成为真正的网络浏览器或类似的东西?
【解决方案2】:

您可以使用标准的 BufferedReader 读取给定 URL 的网络服务器的响应。

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

然后使用 ...

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

...获取响应。

【讨论】:

  • 啊,你是对的 - 那是一个错字(我已经更正了代码)。我在几年前用 Java 1.4.2 编写的网络蜘蛛中使用了上面的代码 - 所以它应该可以在比它更新的任何版本中工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多