>  기사  >  백엔드 개발  >  HttpClient는 웹 페이지 소스 코드를 크롤링합니다.

HttpClient는 웹 페이지 소스 코드를 크롤링합니다.

巴扎黑
巴扎黑원래의
2016-12-20 12:00:301745검색

패키지 UTIL;

import java.io.IOException;
import java.io. 🎜>java.text.DateFormat 가져오기;
java.util.ArrayList 가져오기
java.util.HashMap 가져오기; 🎜>java.util.List 가져오기;
java.util.Set 가져오기
java.util.Map 가져오기; .GZIPInputStream;

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException; >import org.apache.commons.httpclient.HttpMethod;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.NameValuePair ; httpclient.SimpleHttpConnectionManager;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.methods.PostMethod; HttpConnectionManagerParams;
import org.apache.commons.httpclient.params.HttpMethodParams;

/ **
* @author Liuwei
* 날짜: 2009년 12월 18일
*
* TODO
* HttpClient용 보조 클래스
* /
공개 클래스 HttpClientHelper
{

/ **
* HttpClient 연결 시간 초과, 데이터 읽기 시간 초과 설정(단위: 밀리초)
* /
공개 정적 최종 해석 HTTPCLIENT_CONNECTION_TIMEOUT = 30000; Public static final int HTTPCLIENT_SO_TIMEOUT = 120000;
Public static final int HTTPMETHOD_SO_TIMEOUT = 5000;

//ConnectionManager가 연결 종료 여부를 httpclientconnection으로 관리하도록 합니다.
Private static boolean AlwaysClose = FALSE ; private static string defaultEncode = "UTF-8";

private static last DateFormat DATE_FORMAT = new SimpleDateFormat("YYYY-MM-DD HH:MM:SS")

/ **
* HttpClient 연결 가져오기 및 관련 매개변수 설정
*
* @return
* /
Public static HttpClient의 getHttpClient()
{
HttpClient client = new HttpClient(new SimpleHttpConnectionManager(alwaysClose));
HttpConnectionManagerParams ManagerParams = client.getHttpConnectionManager() getParams() 메소드. }

/ **
* HttpClient 연결을 가져오고 관련 매개변수를 설정합니다.
*
* @parameter logonSite
* @parameter logonPort
* @parameter 프로토콜
* @return
* /
public static HttpClient getHttpClient(마지막 문자열 logonSite, 마지막 int logonPort, 마지막 문자열 프로토콜)
{
HttpClient client = new HttpClient( new SimpleHttpConnectionManager(alwaysClose))
client.getHostConfiguration() setHost(logonSite, logonPort, 프로토콜).
HttpConnectionManagerParams ManagerParams = client.getHttpConnectionManager() getParams() 메서드. }

개인 정적 List getHeaders(MapHeaders)
{
List = Headers ArrayList new

() ;
부울 includeUserAgent = FALSE; if (null = header&& false == header.isEmpty()!)
{
set> );
for (enter 항목:entrySet)
{
if (false == includeUserAgent
&&"UserAgent".equals(entry.getKey()))
{
includeUserAgent = TRUE;
}
headers.add(new headers(entry.getKey(), Entry.getValue()))
}
}

if (false == includeUserAgent)
{
headers.add(new headers(
"UserAgent" ,
"Mozilla/4.0(호환 가능; MSIE 7.0; Windows NT 5.1; GTB5; . NET CLR 1.1.4322; .NET CLR 2.0 0.50727; Alexa Toolbar; MAXTHON 2.0)"));
}
반환 헤더;

개인 정적 NameValuePair[] getPairs(Map< ;문자열, 문자열> POSTDATA)
{
if (null == || POSTDATA postData.isEmpty())
{
return NULL;

Set < ;input> =entrySet postData.entrySet();
INT DATALENGTH =entrySet.size()
NameValuePair[] = new NameValuePair[DATALENGTH]
INT i = 0; 🎜>For( 항목 입력:entrySet)
{
double[i++] = new NameValuePair(entry.getKey(), Entry.getValue())
}
return pair
}

/ **
*웹페이지 콘텐츠 정보 요청
*
* @parameter HttpClient
* @parameter reqUrl
*매개변수 제목
* @parameter POSTDATA
*매개변수 인코딩
* @return
*/
공개 정적 문자열 doRequest(HttpClient HttpClient, String reqUrl,
Map 헤더, Map< 문자열, 문자열> POSTDATA, 문자열 인코딩)
{
String htmlContent = NULL
if (null == HttpClient)
{
return htmlContent; >//인코딩 설정 요청
Encoding = (비어 있음 == 인코딩 defaultEncode: 인코딩)

//헤더 요청 정보
List

= header getHeaders(head); 🎜>System.out.println("[" + DATE_FORMAT.format(new Date()) + "] - doRequest - " + reqUrl) <br><br>//교환 방법 <br> if (empty = POSTDATA! ) <br>{ <br> PostMethod PostMethod = new EncodePostMethod(reqUrl, 인코딩); <br> for (head tempHeader: header) <br>{ <br>postMethod.setRequestHeader(tempHeader) <br><br>//포스트 매개변수 설정 NameValuePair [] of <br> = PARAMS getPairs(POSTDATA); <br>if (비어 있음 = 매개변수!) <br>{ <br>postMethod.setRequestBody(PARAMS) <br>} <br><br>//웹페이지 콘텐츠 추출 <br>htmlContent =executeMethod(HttpClient, post-method, 인코딩, getWebSite(reqUrl)) <br>} <br>Others<br>{ <br>GetMethod getMethod = 새로운 구현 getMethod(reqUrl); <br>for (head tempHeader: header) <br>{ <br>getMethod.setRequestHeader(tempHeader) <br>} <br><br>//웹페이지 콘텐츠 추출 <br> htmlContent =executeMethod(HttpClient, getMethod, 인코딩, NULL); <br>} <br> return htmlContent; <br>} <br><br>Private static String getWebSite(String reqUrl) <br>{ <br>String 웹사이트 = NULL; <br>if (null == reqUrl || reqUrl.isEmpty()) <br>{ <br>웹사이트 반환 <br>} <br><br>문자열 접두사 = "http://"; <br>if (reqUrl.startsWith(prefix)) <br>{ <br>INT index = reqUrl.substring(prefix.length()) indexOf("/") + prefix .length() <br>Website = reqUrl.substring(0, index); <br>} <br>웹사이트로 돌아가기 <br>} <br><br>/ ** <br>* HTTPMethod 웹 페이지 콘텐츠를 열거하여 가져옴 <br>* <br>* @parameter HttpClient <br>* @parameter requestMethod <br>*매개변수 인코딩 <br>*매개변수 웹사이트 <br>* @return <br>* / <br>개인 정적 문자열 실행 방법(HttpClient HttpClient, enum HTTPMethod requestMethod, 인코딩된 문자열, 문자열 사이트) <br>{ <br>String responseContent = NULL; <br>if (null == HttpClient) <br>{ <br>Return responseContent; 암호화된 데이터 요청 여부 결정 <br> Boolean dataEncrypt = FALSE; <br>Header acceptEncoding = requestMethod.getRequestHeader ("Accept Encoding") <br> if(! 비어 있음 = acceptEncoding <br>. && acceptEncoding.getValue() 포함("gzip")) <br>{ <br>dataEncrypt = TRUE; <br>} <br><br>InputStream responseStream = <br>try<br>{ <br> INT 상태 = httpClient.executeMethod(requestMethod); <br>if (HttpStatus.SC_OK == status) <br>{ <br>responseStream = requestMethod.getResponseBodyAsStream() <br>responseContent = getContentByStream(dataEncrypt new GZIPInputStream( responseStream) : responseStream, 인코딩); <br>responseStream.close(); <br>} <br>//반환 코드가 301302303307이면 페이지가 리디렉션되었으며 해당 위치의 URL이 다시 요청되었음을 의미합니다. 일부 로그인에서는 그렇지 않습니다. <br> 그렇지 않으면 if (HttpStatus.SC_MOVED_PERMANENTLY == status <br>|| HttpStatus.SC_MOVED_TEMPORARILY == status <br>|| HttpStatus.SC_SEE_OTHER = = 상태 <br>|| HttpStatus.SC_TEMPORARY_REDIRECT = = 상태) <br>{ <br>//새 URL 주소 읽기 <br>Header = requestMethod.getResponseHeader("position") <br>if (! header = NULL ) <br>{ <br> String 리디렉션Url = header.getValue(); <br> if (zero = 리디렉션Url! <br>&& false == 리디렉션Url.isEmpty()) <br>{ <br>responseContent = 유효하지 않음; <br> if (empty ==redirectUrl ||redirectUrl.isEmpty()) <br>{ <br>redirectUrl = "/"; <br>} <br><br> if (false == directUrl.startsWith(" HTTP: //") <br>! && 비어 있음 = 웹사이트) <br>{ <br>if (website.startsWith("/")) <br>{ <br>redirectUrl = 웹사이트+redirectUrl; <br>} <br>기타<br>{ <br>redirectUrl = 웹사이트 + "/" + RedirectUrl; <br>} <br>} <br><br>GetMethod 리디렉션 = 새로운 구현 getMethod(redirectUrl) <br>헤더 리퍼러 = requestMethod.getRequestHeader("referrer") <br>if (null = 참조자! ) <br>{ <br>redirect.addRequestHeader(referrer); <br>} <br> header cookie = requestMethod.getRequestHeader("cookie") <br>if (null = cookie!) <br>{ <br>redirect.addRequestHeader(cookie); <br>} <br>status = httpClient.executeMethod(redirect); <br>if (HttpStatus.SC_OK == status) <br>{ <br>responseStream = getResponseBodyAsStream() ; <br>responseContent = getContentByStream(responseStream, 인코딩); <br>responseStream.close(); } //종료 상태 <br><br>} 따라잡기(예외 5) <br>{ <br>e.printStackTrace () <br>}드디어 <br>{ <br>if (requestMethod!= NULL) <br>{ <br>requestMethod.releaseConnection(); <br>} <br>} <br>return responseContent; <br><br>/ ** <br> *지정된 인코딩에 따라 스트림에서 정보 읽기 <br>* <br>* @Parameter inStream <br>*매개변수 인코딩 <br>* @Return <br>* Throw IOException <br>* / <br>Public static String getContentByStream(InputStream inStream, String 인코딩)은 IOException을 발생시킵니다. <br>{ <br>if (null == instream) <br>{ <br>return NULL <br>} <br><br>StringBuilder의 콘텐츠 = new StringBuilder (); <br>//지정된 인코딩 형식을 사용하여 스트림 콘텐츠 읽기 <br>의 BufferedReader reader = new BufferedReader(new InputStreamReader(interstitial, 인코딩)) <br> String message = NULL <br> while ( null = (message = reader.readLine())!) <br>{ <br>content.append(message) <br>content.append("r n") <br>//닫기 리더 및 릴리스 리소스 <br>reader.close(); <br>Return (content.toString()) <br>} <br><br>/ ** <br>* PostMethod에서 상속된 내부 클래스 우편 요청 인코딩 형식 지정 <br>* / <br>공용 정적 클래스 EncodePostMethod는 PostMethod를 확장합니다. <br>{ <br>개인 문자열 인코딩 = NULL; <br><br>공용 EncodePostMethod(URL 문자열, 문자열 인코딩)<br>{ <br>Super(URL); <br>this.encode = 인코딩 <br>} <br><br>@override<br>공개 문자열 getRequestCharSet()<br>{ <br>// TODO 자동으로 메소드 스텁 생성 <br> return (this.encode); <br><br>} <br><br>/ * * <br>*Test<br>* <br>* @parameter ARGS <br>* / <br>public static void main(String[] args)<br>{ <br>//System.setProperty( "http.proxyHost", "165.228.128.10") <br>//System .setProperty("http.proxyPort", "3128"); <br>//System.setProperty("http.proxySet", "true ") <br><br><br>String reqUrl = " http:/ /news.39.net/jbyw/index.html "; <br>reqUrl = " http://news.39.net/ a/2010722/1404231.html "; <br>Map<String, String> 헤더 = new HashMap <String, String>(); <br>headers.put("인코딩 허용"," gzip,deflate") <br><br>HttpClient HttpClient() <br> String htmlContent = doRequest (HttpClient, reqUrl, 헤더, null, "GBK") <br> System.out.println(htmlContent) <br><br>} <br>}<br><br><br>
성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
이전 기사:상속 요약다음 기사:상속 요약