HttpClient的爬取网页源代码
包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;
/ **
* @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();
对于(进入
{
如果(假== 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.isEmpty())
{
返回NULL;
}
设置<输入<字符串,字符串>> =的entrySet postData.entrySet();
INT DATALENGTH = entrySet.size();
的NameValuePair [] =对新的NameValuePair [DATALENGTH]
INT I = 0;
对于(进入
{
双[我++] =新的NameValuePair(entry.getKey(),entry.getValue());
}
返回对;
}
/ **
*请求网页内容信息
*
* @参数的HttpClient
* @参数reqUrl
*参数标题
* @参数POSTDATA
*参数编码
* @return
* /
公共静态字符串doRequest(HttpClient的HttpClient的,字符串reqUrl,
地图<字符串, String>的头,地图
{
字符串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 ”;
地图
headers.put(“接受编码”,“gzip的,放气”);
HttpClient的HttpClient的= getHttpClient();
字符串htmlContent = doRequest(HttpClient的,reqUrl,头,空,“GBK”);
的System.out.println(htmlContent);
}
}

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

运行 H5 项目需要以下步骤:安装 Web 服务器、Node.js、开发工具等必要工具。搭建开发环境,创建项目文件夹、初始化项目、编写代码。启动开发服务器,使用命令行运行命令。在浏览器中预览项目,输入开发服务器 URL。发布项目,优化代码、部署项目、设置 Web 服务器配置。

要在服务器端设置字符编码以解决 Bootstrap Table 乱码,需要按以下步骤进行:检查服务器字符编码;编辑服务器配置文件;设置字符编码为 UTF-8;保存并重启服务器;验证编码。

要在 Apache 中设置 CGI 目录,需要执行以下步骤:创建 CGI 目录,如 "cgi-bin",并授予 Apache 写入权限。在 Apache 配置文件中添加 "ScriptAlias" 指令块,将 CGI 目录映射到 "/cgi-bin" URL。重启 Apache。

启动 Apache 的步骤如下:安装 Apache(命令:sudo apt-get install apache2 或从官网下载)启动 Apache(Linux:sudo systemctl start apache2;Windows:右键“Apache2.4”服务并选择“启动”)检查是否已启动(Linux:sudo systemctl status apache2;Windows:查看服务管理器中“Apache2.4”服务的状态)启用开机自动启动(可选,Linux:sudo systemctl

本文介绍几种检查Debian系统OpenSSL配置的方法,助您快速掌握系统安全状态。一、确认OpenSSL版本首先,验证OpenSSL是否已安装及版本信息。在终端输入以下命令:opensslversion若未安装,系统将提示错误。二、查看配置文件OpenSSL主配置文件通常位于/etc/ssl/openssl.cnf。您可以使用文本编辑器(例如nano)查看:sudonano/etc/ssl/openssl.cnf此文件包含密钥、证书路径及加密算法等重要配置信息。三、利用ope

本文将阐述如何通过分析Debian系统下的Apache日志来提升网站性能。一、日志分析基础Apache日志记录了所有HTTP请求的详细信息,包括IP地址、时间戳、请求URL、HTTP方法和响应代码等。在Debian系统中,这些日志通常位于/var/log/apache2/access.log和/var/log/apache2/error.log目录下。理解日志结构是有效分析的第一步。二、日志分析工具您可以使用多种工具分析Apache日志:命令行工具:grep、awk、sed等命令行工具可

要从 Apache 中删除多余的 ServerName 指令,可以采取以下步骤:识别并删除多余的 ServerName 指令。重新启动 Apache 使更改生效。检查配置文件验证更改。测试服务器确保问题已解决。

有 3 种方法可在 Apache 服务器上查看版本:通过命令行(apachectl -v 或 apache2ctl -v)、检查服务器状态页(http://<服务器IP或域名>/server-status)或查看 Apache 配置文件(ServerVersion: Apache/<版本号>)。
