我正在为仅使用英语的网站编写一个小型抓取工具,并通过打开URL
连接来执行此操作。我在请求和utf-8
上都将编码设置为InputStreamReader
,但我继续对某些请求进行gobbledigook,而其他请求正常。
以下代码代表我所做的所有研究和建议。我也尝试过将URLConnection
更改为HttpURLConnection
而没有运气。一些返回的字符串仍然如下所示:
...} R H ???? P N C 16] d克邻?? XJ {x“的P $一个Qt#&安培;??????????????E中的# ????? lfVx)?='b'“Y(defUeefee = ??????。?? A8 ?? {ö?????? ZY?2?m ??? 3C ?? @ < / p>
我错过了什么?
我的代码:
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;
}
答案 0 :(得分:3)
服务器正在发送压缩文档GZIP。您可以设置Accept-Encoding
HTTP标头,使其以纯文本格式发送文档。
conn.setRequestProperty("Accept-Encoding", "identity");
即便如此,HTTP客户端类也会为您处理GZIP压缩,因此您不必担心这样的细节。这里似乎发生的事情是服务器有问题:它没有发送Content-Encoding
标头来告诉你内容被压缩了。此行为似乎取决于User-Agent
,因此该站点在常规Web浏览器中工作,但在使用Java时会中断。因此,设置用户代理也可以解决问题:
conn.setRequestProperty("User-Agent", "Mozilla/5.0"); // for example