1. 问题描述
今天想看看能不能把优快云的博客内容导出到本地,就写Java试了下,中间遇到个问题:
java.io.IOException: Server returned HTTP response code: 403 for URL: http://blog.youkuaiyun.com/yuguiyang1990/article/details/40452823
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1241)
at org.ygy.blog.URLDemo.main(URLDemo.java:27)
我们的访问的禁止了,这里地址就是我写的一篇博客而已,用浏览器也可以访问的,难道优快云的后台阻止了我的访问?
2. 实际代码
代码如下:
package org.ygy.blog;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
public class URLDemo {
public static void main(String[] args) {
HttpURLConnection con = null;
BufferedReader br = null;
try {
URL url = new URL("http://blog.youkuaiyun.com/yuguiyang1990/article/details/40452823");
//打开连接
con = (HttpURLConnection) url.openConnection();
br = new BufferedReader(new InputStreamReader(con.getInputStream(), "UTF-8"));
String str = null;
while ((str = br.readLine()) != null) {
//按行读取然后输出
System.out.println(str);
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
//关闭连接
if (br != null) {
try {
br.close();
br = null;
} catch (IOException e) {
e.printStackTrace();
}
}
con.disconnect();
}
}
}
(这里可以通过代码来判断连接状态,而避免报错)
3. 解决方案
在网上找了下:
http://blog.youkuaiyun.com/omsvip/article/details/39160809
感谢作者的分享啊。
这里需要设置一个属性 User-Agent
User-Agent是什么呢?
User-Agent是Http协议中的一部分,属于头域的组成部分,User Agent也简称UA。用较为普通的一点来说,
是一种向访问网站提供你所使用的浏览器类型、操作系统、浏览器内核等信息的标识。通过这个标识,用户所访问的网站可以显示不同的排版从而为用户提供更好的体验或者进行信息统计。
-----维基百科:http://zh.wikipedia.org/zh/%E7%94%A8%E6%88%B7%E4%BB%A3%E7%90%86
我们可以用FireBug看一个请求:
这里就有一个User-Agent
大概就是这样,我们设置下看看
修改后的代码:
package org.ygy.blog;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
public class URLDemo {
public static void main(String[] args) {
HttpURLConnection con = null;
BufferedReader br = null;
try {
URL url = new URL("http://blog.youkuaiyun.com/yuguiyang1990/article/details/40452823");
//打开连接
con = (HttpURLConnection) url.openConnection();
//设置用户代理
con.setRequestProperty("User-agent", " Mozilla/5.0 (Windows NT 6.1; WOW64; rv:33.0) Gecko/20100101 Firefox/33.0");
br = new BufferedReader(new InputStreamReader(con.getInputStream(), "UTF-8"));
String str = null;
while ((str = br.readLine()) != null) {
//按行读取然后输出
System.out.println(str);
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
//关闭连接
if (br != null) {
try {
br.close();
br = null;
} catch (IOException e) {
e.printStackTrace();
}
}
con.disconnect();
}
}
}
我们也只是增加了1行设置用户代理的代码,运行后就成功输出了:
4. 代码优化
HttpURLConnection 有一个方法,可以获取连接的状态getResponseCode() ,这样,我们就可以在连接正常的时候再做输出操作
int responseCode = con.getResponseCode();
if (responseCode == HttpURLConnection.HTTP_OK) {
br = new BufferedReader(new InputStreamReader(con.getInputStream(), "UTF-8"));