我正在为英文网站编写一个小型爬虫程序,并通过打开 URL
连接来实现。我在请求和 InputStreamReader
上都将编码设置为 utf-8
但我继续为某些请求获取 gobbledigook,而其他请求工作正常。
以下代码代表了我所做的所有研究和建议。我也尝试过将 URLConnection
更改为 HttpURLConnection
但没有成功。一些返回的字符串仍然看起来像这样:
??}?r?H????P?n?c??]?d?G?o??Xj{?x?"P$a?Qt?#&??e?a#? ????lfVx)?='b?"Y(defUeefee=??????.??a8??{O??????zY?2?M???3c??@
我错过了什么?
我的代码:
public static String getDocumentFromUrl(String urlString) throws Exception {
String wholeDocument = null;
URL url = new URL(urlString);
URLConnection conn = url.openConnection();
conn.setRequestProperty("Content-Type", "text/plain; charset=utf-8");
conn.setRequestProperty("Accept-Charset", "utf-8");
conn.setConnectTimeout(60*1000); // wait only 60 seconds for a response
conn.setReadTimeout(60*1000);
InputStreamReader isr = new InputStreamReader(conn.getInputStream(), "utf-8");
BufferedReader in = new BufferedReader(isr);
String inputLine;
while ((inputLine = in.readLine()) != null) {
wholeDocument += inputLine;
}
isr.close();
in.close();
return wholeDocument;
}
最佳答案
服务器正在发送 GZIP 压缩文件。您可以设置 Accept-Encoding
HTTP header ,使其以纯文本格式发送文档。
conn.setRequestProperty("Accept-Encoding", "identity");
即便如此,HTTP 客户端类会为您处理 GZIP 压缩,因此您不必担心此类细节。这里似乎发生的事情是服务器有问题:它不会发送 Content-Encoding
header 来告诉您内容已压缩。此行为似乎取决于 User-Agent
,因此该站点可以在常规网络浏览器中运行,但在从 Java 使用时会中断。因此,设置用户代理也可以解决问题:
conn.setRequestProperty("User-Agent", "Mozilla/5.0"); // for example
关于Java URLConnection utf-8 编码不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21572485/