主函數調用crawl子函數,調用第一次正常執行,調用第二次就卡住了,停滯不動,不報錯但一直在運行沒有結果
html
通過print差錯發現,在crawl子函數內部的重定向後,第二次執行httpclient.execute()方法時程序卡住了,一直在運行但也不報錯java
crawl.java子函數代碼以下:cookie
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()不執行也不報錯解決辦法
ide
這段代碼實際上是沒有任何問題的,全部的變量我都調試過,都有值,
可是就是執行到httpclient.execute()的時候就是不執行,我猜測是否是由於httpclient實例已經沒有了,是否是已經被java的回收器回收了。
因而我就重新new 了一個,放了進去,將原來的cookie也放進去,就能夠作到同一個cookie訪問了
修改後添加代碼爲
函數
按照博主的方法從新new聲明瞭一個新的client以後就行了!!
因此到底爲何呢??以前的httpclient爲何會被收回呢?
url