0

0

HttpClient的爬取网页源代码

巴扎黑

巴扎黑

发布时间:2016-12-20 12:00:30

|

1929人浏览过

|

来源于php中文网

原创

包util;

进口java.io.BufferedReader中; 
进口java.io.IOException异常; 
进口的java.io.InputStream; 
进口java.io.InputStreamReader中; 
进口java.text.DateFormat中; 
进口java.text.SimpleDateFormat的; 
进口的java.util.ArrayList; 
进口java.util.Date; 
进口的java.util.HashMap; 
进口的java.util.List; 
进口的java.util.Map; 
进口java.util.Set中; 
进口java.util.Map.Entry; 
进口java.util.zip.GZIPInputStream;

进口org.apache.commons.httpclient.Header; 
进口org.apache.commons.httpclient.HttpClient; 
进口org.apache.commons.httpclient.HttpException; 
进口org.apache.commons.httpclient.HttpMethod; 
进口org.apache.commons.httpclient.HttpStatus; 
进口org.apache.commons.httpclient.NameValuePair; 
进口org.apache.commons.httpclient.SimpleHttpConnectionManager; 
进口org.apache.commons.httpclient.methods.GetMethod; 
进口org.apache.commons.httpclient.methods.PostMethod; 
进口org.apache.commons.httpclient.params.HttpConnectionManagerParams; 
进口org.apache.commons.httpclient.params.HttpMethodParams;

MvMmall 网店系统
MvMmall 网店系统

免费的开源程序长期以来,为中国的网上交易提供免费开源的网上商店系统一直是我们的初衷和努力奋斗的目标,希望大家一起把MvMmall网上商店系统的免费开源进行到底。2高效的执行效率由资深的开发团队设计,从系统架构,数据库优化,配以通过W3C验证的面页模板,全面提升页面显示速度和提高程序负载能力。3灵活的模板系统MvMmall网店系统程序代码与网页界面分离,灵活的模板方案,完全自定义模板,官方提供免费模

下载

/ ** 
* @author六味
*日期:2009年12月18日

* TODO 
* HttpClient的辅助类
* / 
public类HttpClientHelper 


/ ** 
* HttpClient的连接超时,读取数据超时时间设置(单位:毫秒)
* / 
公共静态最终诠释HTTPCLIENT_CONNECTION_TIMEOUT = 30000; 
公共静态最终诠释HTTPCLIENT_SO_TIMEOUT = 120000; 
公共静态最终诠释HTTPMETHOD_SO_TIMEOUT = 5000; 

//让的ConnectionManager管理httpclientconnection时是否关闭连接
私有静态布尔alwaysClose = FALSE; 
私人静态字符串defaultEncode =“UTF-8”; 

私有静态最后的DateFormat DATE_FORMAT =新的SimpleDateFormat(“YYYY-MM-DD HH:MM:SS”); 

/ ** 
*获取HttpClient的连接,并设置相关参数

* @return 
* / 
公共静态HttpClient的getHttpClient()

HttpClient的客户端=新的HttpClient(新SimpleHttpConnectionManager(alwaysClose)); 
HttpConnectionManagerParams managerParams = client.getHttpConnectionManager()getParams()方法。
//设置连接超时时间(单位毫秒)
managerParams.setConnectionTimeout(HTTPCLIENT_CONNECTION_TIMEOUT); 
//设置读数据超时时间(单位毫秒)
managerParams.setSoTimeout(HTTPCLIENT_SO_TIMEOUT); 
返回客户端; 


/ ** 
*获取HttpClient的连接,并设置相关参数

* @参数logonSite 
* @参数logonPort 
* @参数协议
* @return 
* / 
公共静态HttpClient的getHttpClient(最后弦乐logonSite,最终诠释logonPort,最后弦乐协议)

HttpClient的客户端=新的HttpClient(新SimpleHttpConnectionManager(alwaysClose)); 
client.getHostConfiguration()setHost(logonSite,logonPort,协议)。
HttpConnectionManagerParams managerParams = client.getHttpConnectionManager()getParams()方法。
//设置连接超时时间(单位毫秒)
managerParams.setConnectionTimeout(HTTPCLIENT_CONNECTION_TIMEOUT); 
//设置读数据超时时间(单位毫秒)
managerParams.setSoTimeout(HTTPCLIENT_SO_TIMEOUT); 
返回客户端; 


私有静态列表 getHeaders(地图头)

名单 =报头的ArrayList新(); 
布尔includeUserAgent = FALSE; 
如果(空=头&&假== header.isEmpty()!)

集> =的entrySet header.entrySet(); 
对于(进入项:的entrySet)

如果(假== includeUserAgent 
&&“用户代理”.equals(entry.getKey()))

includeUserAgent = TRUE; 

headers.add(新报头(entry.getKey(),entry.getValue())); 



如果(假== includeUserAgent)

headers.add(新标题(
“用户代理”,
“Mozilla的/ 4.0(兼容; MSIE 7.0; Windows NT的5.1; GTB5; .NET CLR 1.1.4322; .NET CLR 2.0 0.50727; Alexa工具条; MAXTHON 2.0)“)); 

返回头; 


私有静态的NameValuePair [] getPairs(地图 POSTDATA)

如果(空== || POSTDATA postData.isEmpty())

返回NULL; 


设置> =的entrySet postData.entrySet(); 
INT DATALENGTH = entrySet.size(); 
的NameValuePair [] =对新的NameValuePair [DATALENGTH] 
INT I = 0; 
对于(进入项:的entrySet)

双[我++] =新的NameValuePair(entry.getKey(),entry.getValue()); 

返回对; 


/ ** 
*请求网页内容信息

* @参数的HttpClient 
* @参数reqUrl 
*参数标题
* @参数POSTDATA 
*参数编码
* @return 
* / 
公共静态字符串doRequest(HttpClient的HttpClient的,字符串reqUrl,
地图的头,地图 POSTDATA,字符串编码)

字符串htmlContent = NULL; 
如果(空== HttpClient的)

返回htmlContent; 


//请求编码设置
编码=(空==编码defaultEncode:编码); 

//头部请求信息
列表 =头getHeaders(头); 

的System.out.println(“[”+ DATE_FORMAT.format(新的Date())+“] - doRequest - ”+ reqUrl); 

//交方式
,如果(空= POSTDATA!)

的PostMethod的PostMethod =新EncodePostMethod(reqUrl,编码); 
对于(头tempHeader:头)

postMethod.setRequestHeader(tempHeader); 


//后参数设置
的NameValuePair [] = PARAMS getPairs(POSTDATA); 
如果(空=参数!)

postMethod.setRequestBody(PARAMS); 


//提取网页内容
htmlContent = executeMethod(HttpClient的,后方法,编码,getWebSite(reqUrl)); 

其他

GetMethod getMethod =新的实现getMethod(reqUrl); 
对于(头tempHeader:头)

getMethod.setRequestHeader(tempHeader); 


//提取网页内容
htmlContent = executeMethod(HttpClient的,getMethod,编码,NULL); 

返回htmlContent; 


私有静态字符串getWebSite(字符串reqUrl)

字符串网站= NULL; 
如果(空== reqUrl || reqUrl.isEmpty())

返回网站; 


字符串前缀=“HTTP://”; 
如果(reqUrl.startsWith(前缀))

INT指数= reqUrl.substring(prefix.length())的indexOf(“/”)+ prefix.length(); 
网站= reqUrl.substring(0,索引); 

返回网站; 


/ ** 
*通过列举HTTPMethod获取网页内容

* @参数的HttpClient 
* @参数requestMethod 
*参数编码
*参数的网站
* @return 
* / 
私有静态字符串executeMethod(HttpClient的HttpClient的,列举HTTPMethod requestMethod,编码字符串,字符串网站)

字符串responseContent = NULL; 
如果(空== HttpClient的)

返回responseContent; 


//判断是否请求加密数据
的布尔dataEncrypt = FALSE; 
头acceptEncoding = requestMethod.getRequestHeader(“接受编码”); 
如果(!空= acceptEncoding 
。&& acceptEncoding.getValue()包含(“gzip的”))

dataEncrypt = TRUE; 


的InputStream responseStream = NULL; 
尝试

INT状态= httpClient.executeMethod(requestMethod); 
如果(HttpStatus.SC_OK ==状态)

responseStream = requestMethod.getResponseBodyAsStream(); 
responseContent = getContentByStream(dataEncrypt新GZIPInputStream(responseStream):responseStream,编码); 
responseStream.close(); 

//返回代码为301302303307时,表示页面己经重定向,则重新请求位置的URL,这在一些登录授权取饼干时很重要
否则,如果(HttpStatus.SC_MOVED_PERMANENTLY ==状态
|| HttpStatus.SC_MOVED_TEMPORARILY ==状态
|| HttpStatus.SC_SEE_OTHER ==状态
|| HttpStatus.SC_TEMPORARY_REDIRECT ==状态)

//读取新的URL地址
头球冲顶= requestMethod.getResponseHeader(“位置”); 
如果(!头= NULL)

字符串的redirectUrl = header.getValue(); 
如果(零=的redirectUrl!
&&假== redirectUrl.isEmpty())

responseContent =无效; 
如果(空==的redirectUrl || redirectUrl.isEmpty())

的redirectUrl =“/”; 


如果(假== redirectUrl.startsWith(“HTTP://”)
!&&空=网站)

如果(website.startsWith(“/”))

的redirectUrl =网站+的redirectUrl; 

其他

的redirectUrl =网站+“/”+的redirectUrl; 



GetMethod重定向=新的实现getMethod(的redirectUrl); 
头引荐= requestMethod.getRequestHeader(“引荐”); 
如果(空=引用者!)

redirect.addRequestHeader(引荐); 

头的cookie = requestMethod.getRequestHeader(“曲奇”); 
如果(空=饼干!)

redirect.addRequestHeader(饼干); 

状态= httpClient.executeMethod(重定向); 
如果(HttpStatus.SC_OK ==状态)

responseStream = redirect.getResponseBodyAsStream(); 
responseContent = getContentByStream(responseStream,编码); 
responseStream.close(); 



} //端头

} //结束状态

}赶上(例外五)

e.printStackTrace(); 
}最后

如果(requestMethod!= NULL)

requestMethod.releaseConnection(); 


返回responseContent; 


/ ** 
*按照指定编码从流中读取信息

* @参数inStream中
*参数编码
* @返回
*引发IOException 
* / 
公共静态字符串getContentByStream(的InputStream inStream中,字符串编码)抛出IOException异常

如果(空= =插播广告)

返回NULL; 


StringBuilder的内容=新的StringBuilder(); 
//采用指定编码格式读取流内容
的BufferedReader读者=新的BufferedReader(新的InputStreamReader(插播广告,编码)); 
字符串消息= NULL; 
而(空=(消息= reader.readLine())!)

content.append(消息); 
content.append(“\ r \ n”); 

//关闭读取器,释放资源
reader.close(); 
返回(content.toString()); 


/ ** 
*内部类,继承于的PostMethod,用来指定邮政请求编码格式
* / 
公共静态类EncodePostMethod扩展的PostMethod 

私人字符串编码= NULL; 

公共EncodePostMethod(URL字符串,字符串编码)

超(URL); 
this.encode =编码; 


@覆盖
公共字符串getRequestCharSet()

// TODO自动生成方法存根
回报(this.encode); 




/ ** 
*测试

* @参数ARGS 
* / 
公共静态无效的主要(字串[] args)

//System.setProperty("http.proxyHost“,”165.228.128.10“); 
//System.setProperty("http.proxyPort“,”3128“); 
//System.setProperty("http.proxySet“,”真“); 


字符串reqUrl =“ http://news.39.net/jbyw/index.html ”; 
reqUrl =“ http://news.39.net/a/2010722/1404231.html ”; 
地图标题=新的HashMap (); 
headers.put(“接受编码”,“gzip的,放气”); 

HttpClient的HttpClient的= getHttpClient(); 
字符串htmlContent = doRequest(HttpClient的,reqUrl,头,空,“GBK”); 
的System.out.println(htmlContent); 


}

相关专题

更多
云朵浏览器入口合集
云朵浏览器入口合集

本专题整合了云朵浏览器入口合集,阅读专题下面的文章了解更多详细地址。

20

2026.01.20

Java JVM 原理与性能调优实战
Java JVM 原理与性能调优实战

本专题系统讲解 Java 虚拟机(JVM)的核心工作原理与性能调优方法,包括 JVM 内存结构、对象创建与回收流程、垃圾回收器(Serial、CMS、G1、ZGC)对比分析、常见内存泄漏与性能瓶颈排查,以及 JVM 参数调优与监控工具(jstat、jmap、jvisualvm)的实战使用。通过真实案例,帮助学习者掌握 Java 应用在生产环境中的性能分析与优化能力。

29

2026.01.20

PS使用蒙版相关教程
PS使用蒙版相关教程

本专题整合了ps使用蒙版相关教程,阅读专题下面的文章了解更多详细内容。

162

2026.01.19

java用途介绍
java用途介绍

本专题整合了java用途功能相关介绍,阅读专题下面的文章了解更多详细内容。

120

2026.01.19

java输出数组相关教程
java输出数组相关教程

本专题整合了java输出数组相关教程,阅读专题下面的文章了解更多详细内容。

41

2026.01.19

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

10

2026.01.19

xml格式相关教程
xml格式相关教程

本专题整合了xml格式相关教程汇总,阅读专题下面的文章了解更多详细内容。

14

2026.01.19

PHP WebSocket 实时通信开发
PHP WebSocket 实时通信开发

本专题系统讲解 PHP 在实时通信与长连接场景中的应用实践,涵盖 WebSocket 协议原理、服务端连接管理、消息推送机制、心跳检测、断线重连以及与前端的实时交互实现。通过聊天系统、实时通知等案例,帮助开发者掌握 使用 PHP 构建实时通信与推送服务的完整开发流程,适用于即时消息与高互动性应用场景。

23

2026.01.19

微信聊天记录删除恢复导出教程汇总
微信聊天记录删除恢复导出教程汇总

本专题整合了微信聊天记录相关教程大全,阅读专题下面的文章了解更多详细内容。

172

2026.01.18

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
RunnerGo从入门到精通
RunnerGo从入门到精通

共22课时 | 1.7万人学习

尚学堂Mahout视频教程
尚学堂Mahout视频教程

共18课时 | 3.2万人学习

Linux优化视频教程
Linux优化视频教程

共14课时 | 3.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号