HttpURLConnection抓取页面出错

magutou007 2016-07-19 04:39:36
我使用HttpURLConnection抓取自己电脑上的项目网页,可以获取,但抓取百度等网页就无法获取了,求大家解答
代码:
package testRedBag;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;

public class HttpURLConnectionTest {
public static final String GET_URL = "http://www.baidu.com";
public static final String POST_URL = "http://www.baidu.com";

/**
* 接口调用 GET
*/
public static void httpURLConectionGET() {
try {
URL url = new URL(GET_URL); // 把字符串转换为URL请求地址
HttpURLConnection connection = (HttpURLConnection) url.openConnection();// 打开连接
connection.connect();// 连接会话
connection.setRequestProperty("Content-Type", "text/html; charset=UTF-8");

// 获取输入流
BufferedReader br = new BufferedReader(new InputStreamReader(connection
.getInputStream(),"UTF-8"));
String line;
StringBuilder sb = new StringBuilder();
while ((line = br.readLine()) != null) {// 循环读取流
sb.append(line);
}
br.close();// 关闭流
connection.disconnect();// 断开连接
System.out.println(sb.toString());
} catch (Exception e) {
e.printStackTrace();
System.out.println("失败!");
}
}

/**
* 接口调用 POST
*/
public static void httpURLConnectionPOST () {
try {
URL url = new URL(POST_URL);

// 将url 以 open方法返回的urlConnection 连接强转为HttpURLConnection连接 (标识一个url所引用的远程对象连接)
HttpURLConnection connection = (HttpURLConnection) url.openConnection();// 此时cnnection只是为一个连接对象,待连接中

// 设置连接输出流为true,默认false (post 请求是以流的方式隐式的传递参数)
connection.setDoOutput(true);

// 设置连接输入流为true
connection.setDoInput(true);

// 设置请求方式为post
connection.setRequestMethod("POST");

// post请求缓存设为false
connection.setUseCaches(false);

// 设置该HttpURLConnection实例是否自动执行重定向
connection.setInstanceFollowRedirects(true);

// 设置请求头里面的各个属性 (以下为设置内容的类型,设置为经过urlEncoded编码过的from参数)
// application/x-javascript text/xml->xml数据 application/x-javascript->json对象 application/x-www-form-urlencoded->表单数据
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");

// 建立连接 (请求未开始,直到connection.getInputStream()方法调用时才发起,以上各个参数设置需在此方法之前进行)
connection.connect();

// 创建输入输出流,用于往连接里面输出携带的参数,(输出内容为?后面的内容)
DataOutputStream dataout = new DataOutputStream(connection.getOutputStream());
String parm ="voucherID=" + URLEncoder.encode("8805016354421898", "utf-8"); //URLEncoder.encode()方法 为字符串进行编码

// 将参数输出到连接
dataout.writeBytes(parm);

// 输出完成后刷新并关闭流
dataout.flush();
dataout.close(); // 重要且易忽略步骤 (关闭流,切记!)

System.out.println(connection.getResponseCode());

// 连接发起请求,处理服务器响应 (从连接获取到输入流并包装为bufferedReader)
BufferedReader bf = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String line;
StringBuilder sb = new StringBuilder(); // 用来存储响应数据

// 循环读取流,若不到结尾处
while ((line = bf.readLine()) != null) {
sb.append(bf.readLine());
}
bf.close(); // 重要且易忽略步骤 (关闭流,切记!)
connection.disconnect(); // 销毁连接
System.out.println(sb.toString());

} catch (Exception e) {
e.printStackTrace();
}
}

public static void main(String[] args) {
httpURLConectionGET();
// httpURLConnectionPOST();
}
}


报错信息如下:

java.net.ConnectException: Connection timed out: connect
at java.net.DualStackPlainSocketImpl.connect0(Native Method)
at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:79)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.net.Socket.connect(Socket.java:579)
at java.net.Socket.connect(Socket.java:528)
at sun.net.NetworkClient.doConnect(NetworkClient.java:180)
at sun.net.www.http.HttpClient.openServer(HttpClient.java:432)
at sun.net.www.http.HttpClient.openServer(HttpClient.java:527)
at sun.net.www.http.HttpClient.<init>(HttpClient.java:211)
at sun.net.www.http.HttpClient.New(HttpClient.java:308)
at sun.net.www.http.HttpClient.New(HttpClient.java:326)
at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:997)
at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:933)
at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:851)
at testRedBag.HttpURLConnectionTest.httpURLConectionGET(HttpURLConnectionTest.java:20)
at testRedBag.HttpURLConnectionTest.main(HttpURLConnectionTest.java:104)
失败!
...全文
313 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
Intboy 2016-07-26
  • 打赏
  • 举报
回复
引用 12 楼 magutou007 的回复:
[quote=引用 11 楼 fengspg 的回复:] [quote=引用 3 楼 magutou007 的回复:] [quote=引用 2 楼 fengspg 的回复:] 确定你程序可以访问百度么? 比如我们公司就限制程序访问某些网站,防火墙限制了
我们公司使用代理上网,限制了很多网站,但百度可以上。同样的程序在家可以抓取百度网页,在公司就不可以了。是不是因为使用代理上网的原因,所有myeclipse中的程序无法访问百度[/quote] 应该可以确定公司网络限制原因 话说我们不会一个公司吧。。。[/quote] 我在上海张江,你呢[/quote] 我不在上海,但是公司上海有办公场所,并且也是张江。。。
magutou007 2016-07-26
  • 打赏
  • 举报
回复
引用 14 楼 fengspg 的回复:
[quote=引用 12 楼 magutou007 的回复:] [quote=引用 11 楼 fengspg 的回复:] [quote=引用 3 楼 magutou007 的回复:] [quote=引用 2 楼 fengspg 的回复:] 确定你程序可以访问百度么? 比如我们公司就限制程序访问某些网站,防火墙限制了
我们公司使用代理上网,限制了很多网站,但百度可以上。同样的程序在家可以抓取百度网页,在公司就不可以了。是不是因为使用代理上网的原因,所有myeclipse中的程序无法访问百度[/quote] 应该可以确定公司网络限制原因 话说我们不会一个公司吧。。。[/quote] 我在上海张江,你呢[/quote] 我不在上海,但是公司上海有办公场所,并且也是张江。。。[/quote] 那应该不是一个公司,我在公司总部,各地有分公司。多谢大神帮忙了
bree06 2016-07-25
  • 打赏
  • 举报
回复
如果有代理的话你可以使用
Authenticator.setDefault(new Authenticator() {
    protected PasswordAuthentication getPasswordAuthentication() {
        return new PasswordAuthentication("用户名", "密码".toCharArray());
    }
});
// https
System.setProperty("https.proxySet", "true");
System.getProperties().put("https.proxyHost", "代理地址");
System.getProperties().put("https.proxyPort", "代理端口");
// http
System.setProperty("http.proxySet", "true");
System.getProperties().put("http.proxyHost", "代理地址");
System.getProperties().put("http.proxyPort", "代理端口");
来设置代理, https选用上面https的设置.
magutou007 2016-07-25
  • 打赏
  • 举报
回复
引用 11 楼 fengspg 的回复:
[quote=引用 3 楼 magutou007 的回复:] [quote=引用 2 楼 fengspg 的回复:] 确定你程序可以访问百度么? 比如我们公司就限制程序访问某些网站,防火墙限制了
我们公司使用代理上网,限制了很多网站,但百度可以上。同样的程序在家可以抓取百度网页,在公司就不可以了。是不是因为使用代理上网的原因,所有myeclipse中的程序无法访问百度[/quote] 应该可以确定公司网络限制原因 话说我们不会一个公司吧。。。[/quote] 我在上海张江,你呢
tianfang 2016-07-24
  • 打赏
  • 举报
回复
引用 7 楼 magutou007 的回复:
[quote=引用 6 楼 tianfang 的回复:] baidu跳转到https了 你没有处理503消息
在下新手,请问一下该如何处理503消息。同样的代码我在家里可以抓得到。公司是用代理上网的,但抓不到百度[/quote] 503是跳转消息 http://www.baidu.com 只包含一个503消息,跳转到https://www.baidu.com 。处理503消息就是重新打开指定的网页
Intboy 2016-07-24
  • 打赏
  • 举报
回复
引用 3 楼 magutou007 的回复:
[quote=引用 2 楼 fengspg 的回复:] 确定你程序可以访问百度么? 比如我们公司就限制程序访问某些网站,防火墙限制了
我们公司使用代理上网,限制了很多网站,但百度可以上。同样的程序在家可以抓取百度网页,在公司就不可以了。是不是因为使用代理上网的原因,所有myeclipse中的程序无法访问百度[/quote] 应该可以确定公司网络限制原因 话说我们不会一个公司吧。。。
magutou007 2016-07-22
  • 打赏
  • 举报
回复
引用 6 楼 tianfang 的回复:
baidu跳转到https了 你没有处理503消息
在下新手,请问一下该如何处理503消息。同样的代码我在家里可以抓得到。公司是用代理上网的,但抓不到百度
magutou007 2016-07-22
  • 打赏
  • 举报
回复
引用 8 楼 fhqcelv 的回复:
time out 这不是提示的很清楚嘛,连接超时,看下你能不能访问百度
我们公司使用代理访问的百度。这段代码在家里可以抓取,在公司就连接超时,是不是和使用代理有关
fafa 2016-07-22
  • 打赏
  • 举报
回复
time out 这不是提示的很清楚嘛,连接超时,看下你能不能访问百度
missMeyo 2016-07-21
  • 打赏
  • 举报
回复
引用 4 楼 magutou007 的回复:
[quote=引用 1 楼 missMeyo 的回复:] 请换用httpclient.
在家可以访问,在公司不可以访问。公司封了很多网站,但百度还可以上,这样的话,myeclipse可以访问的到吗[/quote]封网就没啥办法了。
tianfang 2016-07-21
  • 打赏
  • 举报
回复
baidu跳转到https了 你没有处理503消息
Intboy 2016-07-20
  • 打赏
  • 举报
回复
确定你程序可以访问百度么? 比如我们公司就限制程序访问某些网站,防火墙限制了
missMeyo 2016-07-20
  • 打赏
  • 举报
回复
请换用httpclient.
magutou007 2016-07-20
  • 打赏
  • 举报
回复
引用 1 楼 missMeyo 的回复:
请换用httpclient.
在家可以访问,在公司不可以访问。公司封了很多网站,但百度还可以上,这样的话,myeclipse可以访问的到吗
magutou007 2016-07-20
  • 打赏
  • 举报
回复
引用 2 楼 fengspg 的回复:
确定你程序可以访问百度么? 比如我们公司就限制程序访问某些网站,防火墙限制了
我们公司使用代理上网,限制了很多网站,但百度可以上。同样的程序在家可以抓取百度网页,在公司就不可以了。是不是因为使用代理上网的原因,所有myeclipse中的程序无法访问百度

67,515

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧