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);
}
}

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Selon les benchmarks, Laravel excelle dans la vitesse de chargement des pages et les requêtes de bases de données, tandis que CodeIgniter excelle dans le traitement des données. Lorsque vous choisissez un framework PHP, vous devez tenir compte de la taille de l'application, des modèles de trafic et des compétences de l'équipe de développement.

1. Contexte de la construction de la plateforme 58 Portraits Tout d'abord, je voudrais partager avec vous le contexte de la construction de la plateforme 58 Portraits. 1. La pensée traditionnelle de la plate-forme de profilage traditionnelle ne suffit plus. La création d'une plate-forme de profilage des utilisateurs s'appuie sur des capacités de modélisation d'entrepôt de données pour intégrer les données de plusieurs secteurs d'activité afin de créer des portraits d'utilisateurs précis. Elle nécessite également l'exploration de données pour comprendre le comportement et les intérêts des utilisateurs. et besoins, et fournir des capacités côté algorithmes ; enfin, il doit également disposer de capacités de plate-forme de données pour stocker, interroger et partager efficacement les données de profil utilisateur et fournir des services de profil. La principale différence entre une plate-forme de profilage d'entreprise auto-construite et une plate-forme de profilage de middle-office est que la plate-forme de profilage auto-construite dessert un seul secteur d'activité et peut être personnalisée à la demande. La plate-forme de mid-office dessert plusieurs secteurs d'activité et est complexe ; modélisation et offre des fonctionnalités plus générales. 2.58 Portraits d'utilisateurs de l'arrière-plan de la construction du portrait sur la plate-forme médiane 58

Tests de concurrence et débogage Les tests de concurrence et le débogage dans la programmation simultanée Java sont cruciaux et les techniques suivantes sont disponibles : Tests de concurrence : tests unitaires : isolez et testez une seule tâche simultanée. Tests d'intégration : tester l'interaction entre plusieurs tâches simultanées. Tests de charge : évaluez les performances et l'évolutivité d'une application sous une charge importante. Débogage simultané : points d'arrêt : suspendez l'exécution du thread et inspectez les variables ou exécutez le code. Journalisation : enregistrez les événements et l'état du fil. Trace de pile : identifiez la source de l’exception. Outils de visualisation : surveillez l'activité des threads et l'utilisation des ressources.

Pour ajouter un serveur à Eclipse, procédez comme suit : Créer un environnement d'exécution du serveur Configurer le serveur Créer une instance de serveur Sélectionner l'environnement d'exécution du serveur Configurer l'instance de serveur Démarrer le projet de déploiement du serveur

Il existe une variété de méthodes d’attaque qui peuvent mettre un site Web hors ligne, et les méthodes les plus complexes impliquent des connaissances techniques en bases de données et en programmation. Une méthode plus simple est appelée attaque « DenialOfService » (DOS). Le nom de cette méthode d'attaque vient de son intention : faire refuser les demandes de service normales des clients ordinaires ou des visiteurs du site Web. De manière générale, il existe deux formes d'attaques DOS : les troisième et quatrième couches du modèle OSI, c'est-à-dire l'attaque de la couche réseau. La septième couche du modèle OSI, c'est-à-dire l'attaque de la couche application. attaque - la couche réseau, se produit lorsqu'un grand nombre de trafic indésirable circule vers le serveur Web. Lorsque le trafic de spam dépasse la capacité du réseau à le gérer, le site Web tombe en panne. Le deuxième type d'attaque DOS concerne la couche application et utilise des

Pour déployer et maintenir avec succès un site Web PHP, vous devez effectuer les étapes suivantes : Sélectionnez un serveur Web (tel qu'Apache ou Nginx) Installez PHP Créez une base de données et connectez PHP Téléchargez le code sur le serveur Configurez le nom de domaine et la maintenance du site Web de surveillance DNS les étapes comprennent la mise à jour de PHP et des serveurs Web, la sauvegarde du site Web, la surveillance des journaux d'erreurs et la mise à jour du contenu.

KubernetesOperator simplifie le déploiement du cloud PHP en suivant ces étapes : Installez PHPOperator pour interagir avec le cluster Kubernetes. Déployez l'application PHP, déclarez l'image et le port. Gérez l'application à l'aide de commandes telles que l'obtention, la description et l'affichage des journaux.

Comment mettre en œuvre les meilleures pratiques de sécurité PHP PHP est l'un des langages de programmation Web backend les plus populaires utilisés pour créer des sites Web dynamiques et interactifs. Cependant, le code PHP peut être vulnérable à diverses failles de sécurité. La mise en œuvre des meilleures pratiques de sécurité est essentielle pour protéger vos applications Web contre ces menaces. Validation des entrées La validation des entrées est une première étape essentielle pour valider les entrées utilisateur et empêcher les entrées malveillantes telles que l'injection SQL. PHP fournit une variété de fonctions de validation d'entrée, telles que filter_var() et preg_match(). Exemple : $username=filter_var($_POST['username'],FILTER_SANIT
