主函数调用crawl子函数,调用第一次正常执行,调用第二次就卡住了,停滞不动,不报错但一直在运行没有结果
经过print差错发现,在crawl子函数内部的重定向后,第二次执行httpclient.execute()方法时程序卡住了,一直在运行但也不报错
crawl.java子函数代码如下:
public String crawl(String url) {
String result="";
crawlRedirect = false;
System.out.println("inside crawl");
//禁用get重定向后自动跳转
client.getParams().setParameter(ClientPNames.HANDLE_REDIRECTS, false);
HttpGet httpget = new HttpGet(url);
HttpResponse response;
try {
response = client.execute(httpget);
System.out.println("execute over");
if(response.getStatusLine().getStatusCode()==302){
System.out.println("302重定向了 需要登录↓↓↓↓");
crawlRedirect = true;
}
//打开get重定向自动跳转后,再get访问一次原url
DefaultHttpClient client2 = new DefaultHttpClient(new ThreadSafeClientConnManager()); //加入新client后程序正常
client2.getParams().setParameter(ClientPNames.HANDLE_REDIRECTS, true);
System.out.println("setParameter over");
HttpGet httpget2 = new HttpGet(url);
System.out.println("new http over");
HttpResponse response2 = client2.execute(httpget2); //原本的程序在这里会卡住,原本的clien用的是class的全局实例变量,改为新声明的client2后没有问题了
System.out.println("execute again over");
//System.out.println(response2.getStatusLine().toString()); // HTTP/1.1 302 Found
// 获取Entity
HttpEntity entity = response2.getEntity();
// 解析html
result = EntityUtils.toString(entity);
//打印爬取结果
//System.out.print(result);
} catch (IOException e) {
// TODO Auto-generated catch block
System.out.print("IOException");
e.printStackTrace();
}
return result;
}
参考文章: httpclient.execute()不执行也不报错解决办法
这段代码其实是没有任何问题的,所有的变量我都调试过,都有值,
但是就是执行到httpclient.execute()的时候就是不执行,我猜想是不是因为httpclient实例已经没有了,是不是已经被java的回收器回收了。
于是我就从新new 了一个,放了进去,将原来的cookie也放进去,就可以做到同一个cookie访问了
修改后添加代码为
按照博主的方法重新new声明了一个新的client之后就好了!!
所以到底为什么呢??之前的httpclient为什么会被收回呢?