用HttpUrlConnection抓取网页内容
2015-09-07 16:29
591 查看
一、HttpUrlConnection连接之模拟浏览器
在诸多的网站中,特别是大型的网站,设置了必须是浏览器的请求才会回应。之所以这样设置,就是为了防止我们这种项目给他产生无意义的请求(往往这种请求都是大批量,对其服务器产生负荷)。那为了解决这个问题,我们需要在http请求中,添加属性。
HttpURLConnection urlConn;
urlConn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)");
这样就设置好了,你可以随意设置你的操作系统值,浏览器值,版本,只要正确就OK了。这样就可以正常有效地访问其网站了。他可不知道你是不是浏览器。你即使是条狗,他也不知道。
二、完整的设置HttpUrlConnection的属性值
HttpURLConnection urlConn;
urlConn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)");
urlConn.setRequestProperty("Accept",
"image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-powerpoint, application/vnd.ms-excel, application/msword, */*");
urlConn.setRequestProperty("Accept-Language", "zh-cn");
urlConn.setRequestProperty("UA-CPU", "x86");
urlConn.setRequestProperty("Accept-Encoding", "gzip");//为什么没有deflate呢
urlConn.setRequestProperty("Content-type", "text/html");
urlConn.setRequestProperty("Connection", "close"); //keep-Alive,有什么用呢,你不是在访问网站,你是在采集。嘿嘿。减轻别人的压力,也是减轻自己。
urlConn.setUseCaches(false);//不要用cache,用了也没有什么用,因为我们不会经常对一个链接频繁访问。(针对程序)
urlConn.setConnectTimeout(6 * 1000);
urlConn.setReadTimeout(6*1000);
urlConn.setDoOutput(true);
urlConn.setDoInput(true);
有什么疑问的话,可以查看JDK的API文档,这个可以实时看。至于为什么要设置 gzip,而又不设置deflate,原因如下,有些网站他不管你能接受什么压缩格式,统统也会压缩网页内容传给你。当然IE,FF能处理好这些内容。所以我们通过浏览器查看的时候完全正常。一般gzip的压缩可以将一个33K的文件压缩成7K,这样会节约不少带宽,但服务器的负荷并没有减轻,因为他要压缩文件呀。至于为什么不用deflate,是由于绝大多数网站的压缩方式是用gzip,而在有些网站中,明明是用的gzip却返回deflate的压缩标识。这有什么意义呢,所以干脆就告诉服务器,我不接受deflate,因为他太丑了,又长,哪像gzip这么潮呀。呵呵,对于浏览量大的静态网页服务器,这样做很是必要。100M的独享服务器,他也只有100M呀。
三、开始采集某个网页的内容
该方法就是传入一个HttpUrlConnection的链接,和该文件的字符集编码,就可以返回其网页内容了。
public static String getContentFromIn(HttpURLConnection urlConn, String charset) {
BufferedReader br = null;
StringBuilder content = new StringBuilder(200);
InputStream in = null;
try {
if(null == urlConn){
return "";
}
if (StringTools.isNotEmpty(urlConn.getContentEncoding())) {
String encode = urlConn.getContentEncoding().toLowerCase();
if (StringTools.isNotEmpty(encode) && encode.indexOf("gzip") >= 0) {
in = new GZIPInputStream(urlConn.getInputStream());
}
}
if (null == in) {
in = urlConn.getInputStream();
}
if (null != in) {
br = new BufferedReader(new InputStreamReader(in, charset));
String line = "";
while ((line = br.readLine()) != null) {
content.append(line);
}
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (null != in) {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
in = null;
}
if (null != br) {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
in = null;
}
}
return content.toString();
}
至此一个简单的采集工具类诞生了,他的优美在于,代码少,不用引入任何包。纯JDK
4000
,一样能干许多事。有时不希望把本来简单的事情搞得复杂化。虽然不要创造重复的轮子,但我们不能纯拿来主义,就像这样一个简单的功能,不需要搞得太复杂。只要不DRY就可以了,这样自己也能一点点地进步。
以上有什么错误,还请包涵。。。。。。该文章来自:乐乐日志(记下每个快乐的日子)。
在诸多的网站中,特别是大型的网站,设置了必须是浏览器的请求才会回应。之所以这样设置,就是为了防止我们这种项目给他产生无意义的请求(往往这种请求都是大批量,对其服务器产生负荷)。那为了解决这个问题,我们需要在http请求中,添加属性。
HttpURLConnection urlConn;
urlConn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)");
这样就设置好了,你可以随意设置你的操作系统值,浏览器值,版本,只要正确就OK了。这样就可以正常有效地访问其网站了。他可不知道你是不是浏览器。你即使是条狗,他也不知道。
二、完整的设置HttpUrlConnection的属性值
HttpURLConnection urlConn;
urlConn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)");
urlConn.setRequestProperty("Accept",
"image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-powerpoint, application/vnd.ms-excel, application/msword, */*");
urlConn.setRequestProperty("Accept-Language", "zh-cn");
urlConn.setRequestProperty("UA-CPU", "x86");
urlConn.setRequestProperty("Accept-Encoding", "gzip");//为什么没有deflate呢
urlConn.setRequestProperty("Content-type", "text/html");
urlConn.setRequestProperty("Connection", "close"); //keep-Alive,有什么用呢,你不是在访问网站,你是在采集。嘿嘿。减轻别人的压力,也是减轻自己。
urlConn.setUseCaches(false);//不要用cache,用了也没有什么用,因为我们不会经常对一个链接频繁访问。(针对程序)
urlConn.setConnectTimeout(6 * 1000);
urlConn.setReadTimeout(6*1000);
urlConn.setDoOutput(true);
urlConn.setDoInput(true);
有什么疑问的话,可以查看JDK的API文档,这个可以实时看。至于为什么要设置 gzip,而又不设置deflate,原因如下,有些网站他不管你能接受什么压缩格式,统统也会压缩网页内容传给你。当然IE,FF能处理好这些内容。所以我们通过浏览器查看的时候完全正常。一般gzip的压缩可以将一个33K的文件压缩成7K,这样会节约不少带宽,但服务器的负荷并没有减轻,因为他要压缩文件呀。至于为什么不用deflate,是由于绝大多数网站的压缩方式是用gzip,而在有些网站中,明明是用的gzip却返回deflate的压缩标识。这有什么意义呢,所以干脆就告诉服务器,我不接受deflate,因为他太丑了,又长,哪像gzip这么潮呀。呵呵,对于浏览量大的静态网页服务器,这样做很是必要。100M的独享服务器,他也只有100M呀。
三、开始采集某个网页的内容
该方法就是传入一个HttpUrlConnection的链接,和该文件的字符集编码,就可以返回其网页内容了。
public static String getContentFromIn(HttpURLConnection urlConn, String charset) {
BufferedReader br = null;
StringBuilder content = new StringBuilder(200);
InputStream in = null;
try {
if(null == urlConn){
return "";
}
if (StringTools.isNotEmpty(urlConn.getContentEncoding())) {
String encode = urlConn.getContentEncoding().toLowerCase();
if (StringTools.isNotEmpty(encode) && encode.indexOf("gzip") >= 0) {
in = new GZIPInputStream(urlConn.getInputStream());
}
}
if (null == in) {
in = urlConn.getInputStream();
}
if (null != in) {
br = new BufferedReader(new InputStreamReader(in, charset));
String line = "";
while ((line = br.readLine()) != null) {
content.append(line);
}
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (null != in) {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
in = null;
}
if (null != br) {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
in = null;
}
}
return content.toString();
}
至此一个简单的采集工具类诞生了,他的优美在于,代码少,不用引入任何包。纯JDK
4000
,一样能干许多事。有时不希望把本来简单的事情搞得复杂化。虽然不要创造重复的轮子,但我们不能纯拿来主义,就像这样一个简单的功能,不需要搞得太复杂。只要不DRY就可以了,这样自己也能一点点地进步。
以上有什么错误,还请包涵。。。。。。该文章来自:乐乐日志(记下每个快乐的日子)。
相关文章推荐
- TCP-IP协议详解(11) 涅槃 (TCP重新发送)
- java httpURL连接远程服务器并返回数据(httpurlconnection)
- TCP/IP详解之IP协议ARP协议和RARP协议
- TCP-IP协议详解(10) 魔鬼细节 (TCP滑窗管理)
- httpclient远程调用,返回xml
- HttpClient使用详解
- nginx 的简单配置(虚拟主机、来源控制、https)
- 分布式网络爬虫架构-技术选型
- 利用Git和TortoiseGit把代码传输到网络服务器
- Http通用短信接口开发经验及具体开发实现
- HTTP参数CONNETCTION_TIMEOUT和SO_TIMEOUT区别
- 功能测试的测试工作流程
- 通过HttpURLConnection上传
- https协议了解,以及相关协议的解析
- 使用Block,线程封装网络请求
- javaweb学习总结(七)——HttpServletResponse对象(一)
- Linux安装配置apache http://www.cnblogs.com/fly1988happy/archive/2011/12/14/2288064.html
- HttpServletResponse对象
- AFNetworking 网络请求默认基础网址设定
- 【转】file_get_contents无法请求https连接的解决方法