Maison développement back-end Tutoriel C#.Net HttpClient的爬取网页源代码

HttpClient的爬取网页源代码

Dec 20, 2016 pm 12:00 PM
apache

包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(); 
对于(进入项:的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,
地图<字符串, String>的头,地图 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); 


}


Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Comment déverrouiller tout dans Myrise
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

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

Comparaison des performances du framework PHP : la confrontation ultime entre vitesse et efficacité. Comparaison des performances du framework PHP : la confrontation ultime entre vitesse et efficacité. Apr 30, 2024 pm 12:27 PM

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.

Application d'algorithmes dans la construction de 58 plateformes de portraits Application d'algorithmes dans la construction de 58 plateformes de portraits May 09, 2024 am 09:01 AM

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

Comment effectuer des tests de concurrence et le débogage dans la programmation simultanée Java ? Comment effectuer des tests de concurrence et le débogage dans la programmation simultanée Java ? May 09, 2024 am 09:33 AM

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.

Comment ajouter un serveur dans Eclipse Comment ajouter un serveur dans Eclipse May 05, 2024 pm 07:27 PM

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

Le module évasif protège votre site Web des attaques DOS de la couche application Le module évasif protège votre site Web des attaques DOS de la couche application Apr 30, 2024 pm 05:34 PM

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

Comment déployer et maintenir un site Web en utilisant PHP Comment déployer et maintenir un site Web en utilisant PHP May 03, 2024 am 08:54 AM

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.

Comment tirer parti de Kubernetes Operator pour simplifier le déploiement cloud PHP ? Comment tirer parti de Kubernetes Operator pour simplifier le déploiement cloud PHP ? May 06, 2024 pm 04:51 PM

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 implémenter les meilleures pratiques de sécurité PHP Comment implémenter les meilleures pratiques de sécurité PHP May 05, 2024 am 10:51 AM

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

See all articles