- 浏览: 224239 次
- 性别:
- 来自: 西安
文章分类
- 全部博客 (143)
- java (13)
- mongodb (15)
- linux (31)
- mysql (2)
- cache (1)
- Android (3)
- lucene (2)
- javascript (9)
- php (13)
- 人生 (2)
- solr (7)
- 跨域iframe (1)
- 统计学 (1)
- redis (0)
- amazon aws (2)
- 国内比较便宜的vps (1)
- nginx (5)
- sns api应用 (1)
- api (1)
- postfix (1)
- nodejs (1)
- gitlab (1)
- myeclipse (1)
- matlab (3)
- ubuntu (2)
- stardict (1)
- cdn (1)
- lajp (1)
- workerman (1)
- tensorflow (1)
- 协同推荐算法 (3)
- html5 (1)
- extensions (3)
- Rome (1)
- 正则 (1)
- EBS (1)
- python (5)
- https (1)
- iptables (1)
- facebook (0)
- ImageMagick (0)
- elasticsearch (1)
- Flask (1)
- wordpress (0)
- kubernetes (0)
最新评论
-
三尺寒冰:
怎么实现排序的?分析一下
php mongodb 实现group 并按照某字段排序
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 & 用法
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 & 用法
发表评论
-
HttpClients4.*版本超时设置
2016-04-21 17:58 684http://www.open-open.com/lib/vi ... -
JAVA线程安全之synchronized关键字的正确用法
2016-04-10 13:20 660http://blog.csdn.net/yaerfeng/a ... -
lajp 实现php高效调用java
2015-12-16 17:34 2520http://blog.chinaunix.net/uid-2 ... -
java调用支付宝支付接口
2016-05-21 20:02 819支付宝接口: 申请支付宝接口服务: 1.https://f ... -
linux 下多个java jdk 切换
2015-07-19 12:19 12091.先将可用的 JDK 添加到alternatives中 al ... -
linux 下安装JAVA JDK
2014-02-21 16:46 896一、下载安装JDK1.6 1、下载jdk1.6的官方地址: ... -
java 构造json对象
2011-09-19 18:11 5548import java.util.ArrayList; imp ... -
I/O字符流
2011-08-31 09:28 8901.输出流 BufferedWriter fos = new ... -
sax解析文件
2011-08-30 14:12 937package sax; import java.util. ... -
java 解压缩文件
2011-08-30 14:06 1112/** * http远程请求,获取csv数据 * ht ... -
工作队列池,线程池
2011-08-30 14:00 1714import java.util.LinkedList; ... -
socket服务器推送技术
2011-08-30 13:58 4292package duisong; import java.i ...
相关推荐
随着技术的发展,从早期的HttpClient 3.x版本迁移到更新的HttpComponents HttpClient 4.x版本是一个常见的需求。这不仅仅是一个简单的升级过程,而是涉及到对API的变化、编程模型的更新以及对网络编程的更深层次理解...
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-...
含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
此外,HTTPClient 4.x提供了更灵活的配置选项,比如连接管理器,允许自定义连接池大小、超时设置等。 1. **连接管理**:在HTTPClient 4.x中,`PoolingHttpClientConnectionManager`是默认的连接管理器,负责创建、...
描述中提到的链接指向了一个ITEYE博客,虽然内容未给出,但可以推测博主可能分享了关于使用HTTPClient 4.3.X的一些经验,可能包括配置,最佳实践,或者是遇到的问题及解决方案。 标签 "源码" 暗示我们可能会讨论到...
《HttpClient 4.3.x详解及其依赖分析》 HttpClient是一个由Apache基金会开发的Java库,主要用于执行HTTP请求。HttpClient 4.3.x是该库的一个重要版本,它提供了丰富的功能和改进,使得开发者能够更方便地与Web...
import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.HttpException; import org.apache.commons.httpclient.HttpStatus; import org.apache.commons.httpclient.methods....
这个"HttpclientDemo(4.x与4以下的版本)"示例显然涵盖了HttpClient在不同版本间的使用方法,特别是4.x版本和4.x之前的版本之间的差异。在本文中,我们将深入探讨HttpClient的基本概念、主要功能以及在不同版本中的...
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是Apache HttpClient库的一个版本,它在Java编程环境中用于实现HTTP客户端通信。...以下是对HttpClient3.1...在新的项目中,开发者通常会考虑使用更新的版本(如HttpClient 4.x)或替代品,如OkHttp。
HttpClient4.x手动释放底层HTTP连接 HttpClient4.x是Apache提供的一款高效的HTTP客户端库,它提供了许多强大的功能,例如支持GET、POST、PUT、DELETE等请求方法、支持HTTPS、支持Cookie、支持缓存等等。但是,使用...
7. `httpmime-4.x.x.jar`: 这个库扩展了HttpClient,支持MIME类型的HTTP请求,如上传文件、处理多部分表单数据等。 8. `log4j-1.2.x.jar`: 这是一个日志记录框架,通常与Apache Commons Logging一起使用,提供更...
httpclient常用封装工具 doGet(String url, Map, String> param) doPost(String url, Map, String> param) doPostJson(String url, String json)
《android原生POST、httpClient4.X实现向PHP服务器上传文件》对应源码,博客地址:http://blog.csdn.net/harvic880925/article/details/17565481,奶奶个熊,今天CSDN写个博客都写不成,格式啥啥的完全跟写的时候不...
在标题和描述中提到的"Java中Httpclient需要的jar包(httpclient.jar,httpcore.jar及commons-logging.jar)",是使用HttpClient库时必须包含的三个关键依赖文件。 首先,`httpclient.jar`是Apache HttpClient的核心库...
此外,Apache HttpClient库已经被弃用,现在推荐使用Java 7及更高版本内置的`java.net.HttpURLConnection`或更现代的库如Apache HttpClient 4.x或OkHttp。不过,对于理解HTTP客户端编程的基本原理,HttpClient仍然是...
- **创建HttpClient实例**:使用`HttpClientBuilder`构建器创建HttpClient对象,可以配置连接池大小、超时等参数。 - **构建HttpGet/HttpPost请求**:通过`HttpGet`或`HttpPost`构造HTTP请求,设置URL、方法和请求...
虽然`commons-httpclient-3.0.jar`是一个经典版本,但随着Java的发展,Apache社区已经推出了更现代的HttpClient 4.x系列,提供了更多改进和优化,如更好的线程安全、更丰富的API以及对HTTP/2的支持。因此,建议在新...