`

java httpclient4.X 无法判断文件大小问题

    博客分类:
  • java
 
阅读更多
httpclient4.X 网页抓取代码:


InputStream is = null;
HttpGet httpGet = null;
try {

URL url = new URL(URL);
URI uri = new URI(url.getProtocol(), url.getHost(), url.getPath(), url.getQuery(), url.getRef());
httpGet = new HttpGet(uri);
RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(5000).setConnectTimeout(2000).setRedirectsEnabled(true).build();//设置请求和传输超时时间
httpGet.setConfig(requestConfig);

HttpClientContext context = HttpClientContext.create(); 
           
HttpResponse response = null;
response = httpClient.execute(httpGet,context);

            long len = response.getEntity().getContentLength();
            if (len > 0 && len/(1024*1024) > 1) {//大于1M
            return false;
}
           
            // 获取所有的重定向位置 
            List<URI> redirectLocations = context.getRedirectLocations(); 
int responseCode = response.getStatusLine().getStatusCode();

if (responseCode == 200) {
if (null != redirectLocations && redirectLocations.size()>0) {
URL = redirectLocations.get(redirectLocations.size()-1).toString();
}

//过滤掉非html页面,比如:json、xml
if (!response.getEntity().getContentType().toString().contains("text/html")) {
return false;
}

is = response.getEntity().getContent();
BufferedReader br = new BufferedReader(new InputStreamReader(
is, charset));

String line = null;
String content = "";
while ((line = br.readLine()) != null) {
content += line+"\n";
}

//过滤掉非html页面,比如:json、xml
if (!content.contains("html")) {
return false;
}

......

return true;
}
return false;

} catch (Exception localException) {
localException.printStackTrace();
} finally {
try {
if (httpGet != null) {
httpGet.releaseConnection();
}
if (is != null)
is.close();
} catch (Exception localException1) {
}
}
return null;


----------------------------------------------------------------------------


response header是服务器可以设置的,所以content-length并不能完全解决
大文件拒绝抓取的问题。

需要这样一种思路:
1.header无法读取,能不能下载页面,边下载边判断,读取超时,默认文件太大,停止下载。

于是乎:

想到,java调用wget或者curl命令的方式:


String cmd = "wget -v --output-document="+CrawlerConstants.Tmp_Dir+"/wget.txt --no-check-certificate --tries=3 "
+ url;*
//cmd = "Wget_SingleDown_run.sh"
// 执行命令
p = Runtime.getRuntime().exec(cmd);

InputStream stderr = p.getErrorStream();
InputStreamReader isr = new InputStreamReader(stderr);
BufferedReader br1 = new BufferedReader(isr);
String line = null;
String link = url;
boolean is_text_html = false;
//此处必须读取流,不然会阻塞
while ( (line = br1.readLine()) != null){
                                        //这里会输出wget下载进度、Location跳转等header信息
System.out.println(line);

}

p.waitFor();
p.destroy();


---------------------------------------------------------------------

继续看代码:

把wget命令封装在一个shell脚本中,在脚本中做超时判断;
具体有2个脚本文件:

Wget_SingleDown_run.sh:


#!/bin/bash

##usage: ./singleDown killapp dirfile url
if [ $# -lt 3 ]
then
echo 'usage: ./singleDown killapp dirfile url'
exit 1
fi
##重试次数
retryTime=2
##等待超时(s)
idleTimeOut=3
##下载限时
downTimeOut=5
##下载限速
##limitRate=128k
##每次重试的间隔时间(s)
##waitRetry=1

url=`echo "$3" | sed "s/ /%20/g"`

wget --no-check-certificate -t $retryTime -T $idleTimeOut -O $2 $url

downPid=$!
echo $downPid
$1 $downTimeOut $downPid $2 >>/dev/null  2>&1 &

clockPid=$!

wait $downPid

ps $clockPid
if [ $? -eq 0 ]
then
kill -9 $clockPid
fi
exit 1


Wget_SleepAndKill_run.sh:

#!/bin/bash

##usage: timeOut(s) pidToKill

if [ $# -lt 3 ]
then
        echo 'usage: timeOut(s) pidToKill fileDir'
        exit 1
fi

sleep $1
ps $2
if [ $? -eq 0 ]
then
kill -9 $2
cat /dev/null > $3
fi


----------------------------------------------------------------------------

如果没有Wget_SleepAndKill_run,程序不会正常结束,一直等待超时后退出。

注意:>>/dev/null  2>&1 & 用法


分享到:
评论

相关推荐

    HttpClient 3.x to HttpComponents HttpClient 4.x

    随着技术的发展,从早期的HttpClient 3.x版本迁移到更新的HttpComponents HttpClient 4.x版本是一个常见的需求。这不仅仅是一个简单的升级过程,而是涉及到对API的变化、编程模型的更新以及对网络编程的更深层次理解...

    httpclient 4.X版本下载有的带源码包

    2013-11-21 15:31 292,890 httpclient-4.0.2.jar 2017-12-20 12:08 351,132 httpclient-4.1.1.jar 2012-08-03 01:45 451,595 httpclient-4.1.2-sources.jar 2012-08-03 01:44 352,254 httpclient-4.1.2.jar 2012-08-...

    Java HttpClient 4.x Jar包

    含tutorial,commons-logging-1.1.1, commons-codec-1.4-bin.zip, httpcomponents-client-4.0.3-bin.zip, httpcomponents-core-4.1-bin.zip

    httpclient4.x官方范例

    此外,HTTPClient 4.x提供了更灵活的配置选项,比如连接管理器,允许自定义连接池大小、超时设置等。 1. **连接管理**:在HTTPClient 4.x中,`PoolingHttpClientConnectionManager`是默认的连接管理器,负责创建、...

    HTTPClient 4.3.X

    描述中提到的链接指向了一个ITEYE博客,虽然内容未给出,但可以推测博主可能分享了关于使用HTTPClient 4.3.X的一些经验,可能包括配置,最佳实践,或者是遇到的问题及解决方案。 标签 "源码" 暗示我们可能会讨论到...

    httpclient4.3.x及其依赖jar包

    《HttpClient 4.3.x详解及其依赖分析》 HttpClient是一个由Apache基金会开发的Java库,主要用于执行HTTP请求。HttpClient 4.3.x是该库的一个重要版本,它提供了丰富的功能和改进,使得开发者能够更方便地与Web...

    可用org.apache.commons.httpclient-3.1.0.jar.zip

    import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.HttpException; import org.apache.commons.httpclient.HttpStatus; import org.apache.commons.httpclient.methods....

    httpclient.jar包下载

    4. **重试和恢复策略**:HttpClient内置了重试和恢复策略,当网络出现问题时,可以自动进行重试,保证请求的可靠性。 5. **异步和同步模式**:HttpClient提供同步和异步两种操作模式,适应不同场景的需求。 提到...

    httpclientDemo(4.x与4以下的版本)例子

    这个"HttpclientDemo(4.x与4以下的版本)"示例显然涵盖了HttpClient在不同版本间的使用方法,特别是4.x版本和4.x之前的版本之间的差异。在本文中,我们将深入探讨HttpClient的基本概念、主要功能以及在不同版本中的...

    HttpClient所需jar包(全) httpClient.4.13jar

    3. `httpmime-4.x.x.jar`: 这个库扩展了HttpClient,支持在HTTP请求中处理MIME类型的数据,比如文件上传。 4. `httpclient-cache-4.x.x.jar`: 提供了HTTP缓存功能,可以提高重复请求的效率。 5. `json-lib-2.x.x.jar...

    HttpClient3.1.jar

    HttpClient3.1.jar是Apache HttpClient库的一个版本,它在Java编程环境中用于实现HTTP客户端通信。...以下是对HttpClient3.1...在新的项目中,开发者通常会考虑使用更新的版本(如HttpClient 4.x)或替代品,如OkHttp。

    HttpClient4.x手动释放底层HTTP连接[借鉴].pdf

    HttpClient4.x手动释放底层HTTP连接 HttpClient4.x是Apache提供的一款高效的HTTP客户端库,它提供了许多强大的功能,例如支持GET、POST、PUT、DELETE等请求方法、支持HTTPS、支持Cookie、支持缓存等等。但是,使用...

    Java HttpClient 全部的jar包

    7. `httpmime-4.x.x.jar`: 这个库扩展了HttpClient,支持MIME类型的HTTP请求,如上传文件、处理多部分表单数据等。 8. `log4j-1.2.x.jar`: 这是一个日志记录框架,通常与Apache Commons Logging一起使用,提供更...

    JAVA httpclient jar下载

    httpclient常用封装工具 doGet(String url, Map, String&gt; param) doPost(String url, Map, String&gt; param) doPostJson(String url, String json)

    android原生POST、httpClient4.X实现向PHP服务器上传文件 源码

    《android原生POST、httpClient4.X实现向PHP服务器上传文件》对应源码,博客地址:http://blog.csdn.net/harvic880925/article/details/17565481,奶奶个熊,今天CSDN写个博客都写不成,格式啥啥的完全跟写的时候不...

    Java中Httpclient需要的jar包(httpclient.jar,httpcore.jar及commons-logging.jar)

    在标题和描述中提到的"Java中Httpclient需要的jar包(httpclient.jar,httpcore.jar及commons-logging.jar)",是使用HttpClient库时必须包含的三个关键依赖文件。 首先,`httpclient.jar`是Apache HttpClient的核心库...

    httpclient-4.5.jar

    2. `httpmime-4.x.jar`:这个库扩展了HttpClient,使其能够处理MIME类型的请求和响应,比如上传文件或处理multipart/form-data请求。 3. `httpclient-cache-4.x.jar`:这个模块提供了HTTP缓存功能,可以根据HTTP...

    org.apache.commons.httpclient 远程下载文件

    此外,Apache HttpClient库已经被弃用,现在推荐使用Java 7及更高版本内置的`java.net.HttpURLConnection`或更现代的库如Apache HttpClient 4.x或OkHttp。不过,对于理解HTTP客户端编程的基本原理,HttpClient仍然是...

    commons-httpclient-3.0.jar JAVA中使用HttpClient可以用到

    虽然`commons-httpclient-3.0.jar`是一个经典版本,但随着Java的发展,Apache社区已经推出了更现代的HttpClient 4.x系列,提供了更多改进和优化,如更好的线程安全、更丰富的API以及对HTTP/2的支持。因此,建议在新...

Global site tag (gtag.js) - Google Analytics