论坛首页 Java企业应用论坛

抓取google的相关搜索词

浏览 9628 次
精华帖 (0) :: 良好帖 (2) :: 新手帖 (1) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-03-16   最后修改:2011-03-18

        最好配合上一篇的代理ip程序一起运行,否则根据我的经验抓不了几词就被google屏蔽了。废话不说代码如下:

package com.emar.spider;

import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

import org.dozer.DozerBeanMapper;
import org.dozer.Mapper;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import com.emar.core.httpClient.HttpclientUtil;

public class Spider {
	private static Set<String> keywords = new HashSet<String>();
	private String url = "http://www.google.com.hk/search";
	private int count = 0;

	/**
	 * @param args
	 * @throws InterruptedException
	 */
	public static void main(String[] args) throws InterruptedException {
		Spider s = new Spider();
		keywords.add("美女");
		Set<String> seeds = new HashSet<String>();
		for (String word : keywords) {
			seeds.add(word);
		}
		Set<String> result = s.getKRByseedWord(seeds, new HashSet<String>(),
				1000 * 60 * 1);
		System.out.println("本次抓却完毕---------------------------------");
		for (String word : result) {
			System.out.println(word);
		}
	}

	private Set<String> getKRByseedWord(Set<String> seeds, Set<String> result,
			int time) throws InterruptedException {
		if (keywords.size() >= 1000 || seeds.size() == 0) {
			return keywords;
		} else {
			for (String seed : seeds) {
				Map<String, String> params = new HashMap<String, String>();
				params.put("aq", "f");
				params.put("aqi", "");
				params.put("aql", "");
				params.put("btnG", "Google 搜索");
				params.put("client", "firefox-a");
				params.put("hl", "zh-CN");
				params.put("hs", "QDL");
				params.put("oq", "");
				params.put("q", seed);
				params.put("rls", "org.mozilla:zh-CN:official");
				params.put("safe", "strict");
				System.out.println("");
				System.out.println("++++++++++++++++++++++++++");
				System.out.println("第" + (++count) + "次抓取");
				String html = "";
				boolean flag = true;
				while (flag) {
					try {
						System.out.println("等待时长:" + time / 1000 + "秒");
						Thread.sleep(time);
						html = HttpclientUtil.getByProxy(url, params, "UTF-8");
						flag = false;
					} catch (Exception e) {
						// time = time + 10 * 1000;
						e.printStackTrace();
					}
				}
				System.out.println("");
				Document doc = Jsoup.parse(html);
				Elements links = doc.select(".brs_col a[href]");
				for (Element e : links) {
					keywords.add(e.text());
					result.add(e.text());
				}
				System.out.println("词库数量已经到达:" + keywords.size() + "个!");
				for (String k : keywords) {
					System.out.println(k);
				}
			}
			return getKRByseedWord(result, new HashSet<String>(), time);
		}

	}
}

 以下是部分抓取结果:

		帮巫婆变美女
		世界美女.秀
		泡美女
		真人美女类小游戏
		美女模特谭静
		小美女照片
		我的美女大小姐起点
		美女大学
		双人电眼美女小游戏
		美女模特大赛
		脱衣小游
		古典美女
		nba明星照片
		美女类小游戏大全
		非主流美女壁纸
		非主流美女头像图片
		美女游戏网
		非主流美女闪图图片
		中国真人美女小游戏
		非主流美女闪动照片
		90后非主流美女
		明星照片
		非主流美女闪动大图片
		美女小游戏4399
		秀舞吧
		秀舞
		网络美女小鱼
		真人美女小游戏
		古典美女flash
		泡泡美女176220
		美女猜拳脱衣小游戏
		世界十大美女照片
		模特写真
		非主流空间留言代码
		折磨美女类小游戏
		电眼美女游戏
		政要美女保镖
		世界美女城市
		美女小游戏试玩
		美女导师爱上我找小说
		非主流美女163相册
		非主流美女发型
		电眼美女2小游戏
		非主流美女qq头像闪图
		巫婆变美女
		在线真人美女小游戏
		泡美女小游戏
		非主流美女相册
		电眼美女小游戏大全
		非主流空间闪图
		明星大美女
		搜索巫婆变美女
		美女博客
		网络美女排行
		qq空间非主流美女头像
		脱衣类小游戏
		玩美女类小游戏
		网络美女照
		小说我的同居女神
		电眼美女3小游戏
		极品家丁
		小说老婆爱上我
		非主流美女
		非主流帅哥照片
		非主流闪动图片
		美女明星大图
		十大美女明星
		最新非主流美女图片
		泡泡美女小游戏
		美女脱衣类小游戏
		我的美女大小姐全集
		美女游戏
		中国第一美女
		整美女类小游戏
		流氓老师
		搜索真人美女小游戏
		非主流美女生活照片
		中国女明星照片
		美女导师爱上我下载
		美女
		美女脱衣小游戏
		电眼美女小游戏
		美女小游戏
		韩国可爱美女
		小说我的美女大小姐下载
		非主流美女闪图照片
		打扮美女小游戏
		最新非主流美女闪图
		电眼美女小游戏下载
		我的美女大小姐全下载
		非主流图片大图
		秀舞访
		世界美女排行榜
		qq秀舞
		韩国网络美女
		小说我的美女大小姐
		非主流美女闪动头像
		美女导师爱上我小说
		08美女车展
		魔兽世界美女
		怎么泡美女
		韩国美女明星大图
		最美女明星
		非主流闪图
		古装美女照片
		4399美女类小游戏
		可爱美女qq表情
		非主流美女闪图模块
		我的美女大小姐chm
		美女脱衣麻将2
		美女导师爱上我找
		真人秀舞
		我的美女大小姐全文
		男明星照片
		美女导师爱上我手机
		网络美女排行榜
		老婆爱上我sodu
		我的美女老总
		非主流美女闪图
		古典美女圖
		我的同居女神下载
		美女明星的相册
		无财无貌怎么泡美女
		我的美女大小姐txt
		我的美女大小姐电子书
		无才无貌如何泡美女
		巫婆变美女中文版
		非主流美女大图
		美女秀舞
		美女小游戏网站
		帅哥明星照片
		我的美女大小姐全集txt下载
		古典美女相片
		网上泡美女
		非主流头像
		我的美女大小姐全文txt
		时尚非主流美女图片
		古典美女图
		非主流美女闪头像
		老婆爱上我最新更新
		世界美女排名
		非主流空间模块
		可爱美女头像
		美女小游戏网
		美女游戏下载
		美女导师爱上我
		网络美女照片
		秀舞网
		非主流美女闪动头象
		我的同居女神全本下载
		韩国女明星照片
		重庆美女模特
		我的老婆爱上我
		非主流美女闪动图片
		美女导师爱上你
		我的美女大小姐全集下载
		古代电眼美女小游戏
		美女脱衣游戏
		世界美女是谁
		美女导师爱上我最新
		非主流美女闪动qq头像
		巫婆变美女攻略
		美女导师爱上我最新章节
		美女小游戏试
		非主流美女闪动模块
		美女导师爱上我小说网
		美女照片
		我的美女大小姐全集txt
		老婆爱上我最新
		我的美女大小姐下载
		美女游戏大全
		古装美女小游戏
		北京车展第一美女模特
		电眼小美女小游戏
		美女车展
		我的美女大小姐txt下载
		巫婆变美女小游戏
		真人版美女游戏
		qq非主流美女闪图
		老婆爱上我
		我的美女大小姐作者
		美女明星大曝光
		qq空间非主流图片
		qq非主流美女闪头像
		折磨美女游戏
		美女导师爱上我吧
		搜索非主流美女图片
		人造美女游戏
		巫婆造美女小游戏
		美女照片欣赏
		我的同居女神最新
		秀舞网站
		非主流美女头像
		真人美女小游戏下载
		美女模特
		我的美女大小姐全文下载
		我的美女大小姐最新章节
		非主流美女相册地址
		非主流帅哥图片
		搜索电眼美女小游戏
		真人美女小游戏在线玩
		美女模特网
		所有美女类小游戏
		如何泡美女
		美女交友
		世界美女照片
		更多美女脱衣
		重庆美女模特回归自然
		美女导师爱上我79
		韩国男明星照片
		电眼美女1小游戏
		可爱美女照片
		世界美女榜
		pcpop泡泡美女
		美女模特秀
		美女大图
		非主流空间
		非主流美女闪动
		真人美女游戏
		qq空间非主流美女图片
		网络美女壁纸
		老巫婆变美女
		韩国明星照片
		美女导师爱上
		我的同居女神-txt下载
		电眼少美女小游戏
		老婆爱上我下载
		中国美女照片
		非主流美女闪图代码
		老婆爱上我最新章节
		非主流美女闪图头像
		明星八卦
		人造美女小游戏
		非主流空间日志
		我的同居女神最新章节
		可爱美女
		在线美女游戏
		巫婆变美女游戏
		4399小游戏
		非主流qq头像
		非主流图片集闪图
		我的美女大小姐最新
		邻家有女初长成
		美女时尚
		美女小游戏免费试玩
		非主流空间留言
		网络美女
		我的同居女神txt
		美女照片集
		古典美女头像
		找个美女做老婆最新
		非主流空间皮肤
		ps古典美女
		怎样泡美女
		最新非主流美女照片
		非主流可爱美女照片
		非主流美女图片集闪图
		我的美女大小姐最新下载
		3d真人美女小游戏
		世界美女排行
		非主流美女照片集
		泡泡美女
		我的超级情人
		qq非主流美女图片
		我的美女大小姐最新章
		非主流美女闪动大图
		单机美女脱衣麻将
		非主流空间代码
		非主流美女图片代码
		美女类小游戏
		非主流美女照片制作
		非主流图片闪图
		非主流图片
		非主流美女照片
		qq非主流图片
		世界美女大赛
		搜索美女小游戏
		qq空间非主流美女闪图
		重庆美女照片
		我的同居女神
		在线美女小游戏试玩
		2008网络美女
		我的美女导师爱上我
		qq非主流美女照片
		非主流可爱美女qq头像
		折麽美女小游戏
		秀舞娱乐会所
		古典美女照片
		非主流空间图片
		新疆美女模特
		混血美女
		明星照片集
		非主流图片库
		非主流美女闪动横幅
		非主流美女图片
		老婆爱上我520
		非主流图片制作
		非主流美女qq头像
		在线美女脱衣麻将
		真人美女小游戏网
		古典美女模块
		我的美女大小姐
		非主流空间皮肤代码
 

 

   发表时间:2011-03-16  
有相应的jar包吗?自己玩玩
0 请登录后投票
   发表时间:2011-03-17  
带上jar包啊!!
0 请登录后投票
   发表时间:2011-03-17  
很暴力,必须顶
0 请登录后投票
   发表时间:2011-03-17  
Google 做了很多抓取的屏蔽操作,试了下JE的,虽然JE也做了抓取屏蔽,不过很容易跳过JE的过滤,只要设置User-Agent属性就行了。
0 请登录后投票
   发表时间:2011-03-17  
有意思,回去试试~
0 请登录后投票
   发表时间:2011-03-17  
lym6520 写道
Google 做了很多抓取的屏蔽操作,试了下JE的,虽然JE也做了抓取屏蔽,不过很容易跳过JE的过滤,只要设置User-Agent属性就行了。

没有用,已经设置过了。在
HttpclientUtil.getByProxy(url, params, "UTF-8");  
里的实现方法里设置过。
0 请登录后投票
   发表时间:2011-03-17  
lz把HttpClient那个类也贴出来啊
0 请登录后投票
   发表时间:2011-03-18  
mazhiyuan 写道
lz把HttpClient那个类也贴出来啊

应要求把工具类也发上了,至于jar包,就不发了。
package com.emar.core.httpClient;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.security.KeyManagementException;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.UnrecoverableKeyException;
import java.security.cert.CertificateException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.Set;

import javax.net.ssl.SSLHandshakeException;

import org.apache.commons.lang.StringUtils;
import org.apache.http.HttpEntity;
import org.apache.http.HttpEntityEnclosingRequest;
import org.apache.http.HttpHost;
import org.apache.http.HttpRequest;
import org.apache.http.HttpResponse;
import org.apache.http.HttpVersion;
import org.apache.http.NameValuePair;
import org.apache.http.NoHttpResponseException;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.HttpRequestRetryHandler;
import org.apache.http.client.ResponseHandler;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpRequestBase;
import org.apache.http.client.utils.URLEncodedUtils;
import org.apache.http.conn.params.ConnRoutePNames;
import org.apache.http.conn.scheme.Scheme;
import org.apache.http.conn.ssl.SSLSocketFactory;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.params.CoreProtocolPNames;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.params.HttpParams;
import org.apache.http.protocol.ExecutionContext;
import org.apache.http.protocol.HttpContext;
import org.apache.http.util.EntityUtils;

import com.emar.core.util.PropertiesUtil;

/**
 * 默认编码UTF-8
 * 
 * @author BigWolf
 * 
 */
public class HttpclientUtil {
	private static final String CHARSET_UTF8 = "UTF-8";
	private static final String CHARSET_GBK = "GBK";
	private static final String SSL_DEFAULT_SCHEME = "https";
	private static final int SSL_DEFAULT_PORT = 443;
	private static final int connectionTimeoutMillis = 30000;
	private static final int socketTimeoutMillis = 30000;
	// 异常自动恢复处理, 使用HttpRequestRetryHandler接口实现请求的异常恢复
	private static HttpRequestRetryHandler requestRetryHandler = new HttpRequestRetryHandler() {
		// 自定义的恢复策略
		public boolean retryRequest(IOException exception, int executionCount,
				HttpContext context) {
			// 设置恢复策略,在发生异常时候将自动重试3次
			if (executionCount >= 3) {
				// Do not retry if over max retry count
				return false;
			}
			if (exception instanceof NoHttpResponseException) {
				// Retry if the server dropped connection on us
				return true;
			}
			if (exception instanceof SSLHandshakeException) {
				// Do not retry on SSL handshake exception
				return false;
			}
			HttpRequest request = (HttpRequest) context
					.getAttribute(ExecutionContext.HTTP_REQUEST);
			boolean idempotent = (request instanceof HttpEntityEnclosingRequest);
			if (!idempotent) {
				// Retry if the request is considered idempotent
				return true;
			}
			return false;
		}
	};
	// 使用ResponseHandler接口处理响应,HttpClient使用ResponseHandler会自动管理连接的释放,解决了对连接的释放管理
	private static ResponseHandler<String> responseHandler = new ResponseHandler<String>() {
		// 自定义响应处理
		public String handleResponse(HttpResponse response)
				throws ClientProtocolException, IOException {
			HttpEntity entity = response.getEntity();
			if (entity != null) {
				String charset = EntityUtils.getContentCharSet(entity) == null ? CHARSET_UTF8
						: EntityUtils.getContentCharSet(entity);
				return new String(EntityUtils.toByteArray(entity), charset);
			} else {
				return null;
			}
		}
	};

	/**
	 * Get方式提交,URL中包含查询参数, 格式:http://www.g.cn?search=p&name=s.....
	 * 
	 * @param url
	 *            提交地址
	 * @return 响应消息
	 */
	public static String get(String url) {
		return get(url, null, null);
	}

	/**
	 * Get方式提交,URL中不包含查询参数, 格式:http://www.g.cn
	 * 
	 * @param url
	 *            提交地址
	 * @param params
	 *            查询参数集, 键/值对
	 * @return 响应消息
	 */
	public static String get(String url, Map<String, String> params) {
		return get(url, params, null);
	}

	/**
	 * Get方式提交,URL中不包含查询参数, 格式:http://www.g.cn
	 * 
	 * @param url
	 *            提交地址
	 * @param params
	 *            查询参数集, 键/值对
	 * @param charset
	 *            参数提交编码集
	 * @return 响应消息
	 */
	public static String get(String url, Map<String, String> params,
			String charset) {
		if (url == null || StringUtils.isEmpty(url)) {
			return null;
		}
		List<NameValuePair> qparams = getParamsList(params);
		if (qparams != null && qparams.size() > 0) {
			charset = (charset == null ? CHARSET_UTF8 : charset);
			String formatParams = URLEncodedUtils.format(qparams, charset);
			url = (url.indexOf("?")) < 0 ? (url + "?" + formatParams) : (url
					.substring(0, url.indexOf("?") + 1) + formatParams);
		}
		DefaultHttpClient httpclient = getDefaultHttpClient(charset);
		HttpGet hg = new HttpGet(url);
		// 发送请求,得到响应
		String responseStr = null;
		try {
			responseStr = httpclient.execute(hg, responseHandler);
		} catch (ClientProtocolException e) {
			throw new NetServiceException("客户端连接协议错误", e);
		} catch (IOException e) {
			throw new NetServiceException("IO操作异常", e);
		} finally {
			abortConnection(hg, httpclient);
		}
		return responseStr;
	}

	public static String getByProxy(String url, Map<String, String> params,
			String charset) {
		if (url == null || StringUtils.isEmpty(url)) {
			return null;
		}
		List<NameValuePair> qparams = getParamsList(params);
		if (qparams != null && qparams.size() > 0) {
			charset = (charset == null ? CHARSET_UTF8 : charset);
			String formatParams = URLEncodedUtils.format(qparams, charset);
			url = (url.indexOf("?")) < 0 ? (url + "?" + formatParams) : (url
					.substring(0, url.indexOf("?") + 1) + formatParams);
		}
		DefaultHttpClient httpclient = getDefaultHttpClientByProxy(charset);
		HttpGet hg = new HttpGet(url);
		// 发送请求,得到响应
		String responseStr = null;
		try {
			responseStr = httpclient.execute(hg, responseHandler);
		} catch (ClientProtocolException e) {
			throw new NetServiceException("客户端连接协议错误", e);
		} catch (IOException e) {
			throw new NetServiceException("IO操作异常", e);
		} finally {
			abortConnection(hg, httpclient);
		}
		return responseStr;
	}

	/**
	 * Post方式提交,URL中不包含提交参数, 格式:http://www.g.cn
	 * 
	 * @param url
	 *            提交地址
	 * @param params
	 *            提交参数集, 键/值对
	 * @return 响应消息
	 */
	public static String post(String url, Map<String, String> params) {
		return post(url, params, null);
	}

	/**
	 * Post方式提交,URL中不包含提交参数, 格式:http://www.g.cn
	 * 
	 * @param url
	 *            提交地址
	 * @param params
	 *            提交参数集, 键/值对
	 * @param charset
	 *            参数提交编码集
	 * @return 响应消息
	 */
	public static String post(String url, Map<String, String> params,
			String charset) {
		if (url == null || StringUtils.isEmpty(url)) {
			return null;
		}
		// 创建HttpClient实例
		DefaultHttpClient httpclient = getDefaultHttpClient(charset);
		UrlEncodedFormEntity formEntity = null;
		try {
			if (charset == null || StringUtils.isEmpty(charset)) {
				formEntity = new UrlEncodedFormEntity(getParamsList(params));
			} else {
				formEntity = new UrlEncodedFormEntity(getParamsList(params),
						charset);
			}
		} catch (UnsupportedEncodingException e) {
			throw new NetServiceException("不支持的编码集", e);
		}
		HttpPost hp = new HttpPost(url);
		hp.setEntity(formEntity);
		// 发送请求,得到响应
		String responseStr = null;
		try {
			responseStr = httpclient.execute(hp, responseHandler);
		} catch (ClientProtocolException e) {
			throw new NetServiceException("客户端连接协议错误", e);
		} catch (IOException e) {
			throw new NetServiceException("IO操作异常", e);
		} finally {
			abortConnection(hp, httpclient);
		}
		return responseStr;
	}

	/**
	 * Post方式提交,忽略URL中包含的参数,解决SSL双向数字证书认证
	 * 
	 * @param url
	 *            提交地址
	 * @param params
	 *            提交参数集, 键/值对
	 * @param charset
	 *            参数编码集
	 * @param keystoreUrl
	 *            密钥存储库路径
	 * @param keystorePassword
	 *            密钥存储库访问密码
	 * @param truststoreUrl
	 *            信任存储库绝路径
	 * @param truststorePassword
	 *            信任存储库访问密码, 可为null
	 * @return 响应消息
	 * @throws NetServiceException
	 */
	public static String post(String url, Map<String, String> params,
			String charset, final URL keystoreUrl,
			final String keystorePassword, final URL truststoreUrl,
			final String truststorePassword) {
		if (url == null || StringUtils.isEmpty(url)) {
			return null;
		}
		DefaultHttpClient httpclient = getDefaultHttpClient(charset);
		UrlEncodedFormEntity formEntity = null;
		try {
			if (charset == null || StringUtils.isEmpty(charset)) {
				formEntity = new UrlEncodedFormEntity(getParamsList(params));
			} else {
				formEntity = new UrlEncodedFormEntity(getParamsList(params),
						charset);
			}
		} catch (UnsupportedEncodingException e) {
			throw new NetServiceException("不支持的编码集", e);
		}
		HttpPost hp = null;
		String responseStr = null;
		try {
			KeyStore keyStore = createKeyStore(keystoreUrl, keystorePassword);
			KeyStore trustStore = createKeyStore(truststoreUrl,
					keystorePassword);
			SSLSocketFactory socketFactory = new SSLSocketFactory(keyStore,
					keystorePassword, trustStore);
			Scheme scheme = new Scheme(SSL_DEFAULT_SCHEME, socketFactory,
					SSL_DEFAULT_PORT);
			httpclient.getConnectionManager().getSchemeRegistry()
					.register(scheme);
			hp = new HttpPost(url);
			hp.setEntity(formEntity);
			responseStr = httpclient.execute(hp, responseHandler);
		} catch (NoSuchAlgorithmException e) {
			throw new NetServiceException("指定的加密算法不可用", e);
		} catch (KeyStoreException e) {
			throw new NetServiceException("keytore解析异常", e);
		} catch (CertificateException e) {
			throw new NetServiceException("信任证书过期或解析异常", e);
		} catch (FileNotFoundException e) {
			throw new NetServiceException("keystore文件不存在", e);
		} catch (IOException e) {
			throw new NetServiceException("I/O操作失败或中断 ", e);
		} catch (UnrecoverableKeyException e) {
			throw new NetServiceException("keystore中的密钥无法恢复异常", e);
		} catch (KeyManagementException e) {
			throw new NetServiceException("处理密钥管理的操作异常", e);
		} finally {
			abortConnection(hp, httpclient);
		}
		return responseStr;
	}

	/**
	 * 获取DefaultHttpClient实例
	 * 
	 * @param charset
	 *            参数编码集, 可空
	 * @return DefaultHttpClient 对象
	 */
	private static DefaultHttpClient getDefaultHttpClient(final String charset) {
		DefaultHttpClient httpclient = new DefaultHttpClient();
		httpclient.getParams().setParameter(
				CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);
		// 模拟浏览器,解决一些服务器程序只允许浏览器访问的问题
		httpclient
				.getParams()
				.setParameter(
						CoreProtocolPNames.USER_AGENT,
						"Mozilla/5.0 (Windows; U; Windows NT 6.1; zh-CN; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13");// 我本机实际的User-Agent
		httpclient.getParams().setParameter(
				CoreProtocolPNames.USE_EXPECT_CONTINUE, Boolean.FALSE);
		httpclient.getParams().setParameter(
				CoreProtocolPNames.HTTP_CONTENT_CHARSET,
				charset == null ? CHARSET_UTF8 : charset);
		httpclient.setHttpRequestRetryHandler(requestRetryHandler);
		HttpParams params = httpclient.getParams();
		HttpConnectionParams.setConnectionTimeout(params,
				connectionTimeoutMillis);
		HttpConnectionParams.setSoTimeout(params, socketTimeoutMillis);
		return httpclient;
	}

	private static DefaultHttpClient getDefaultHttpClientByProxy(
			final String charset) {
		DefaultHttpClient httpclient = new DefaultHttpClient();
		String filePath = "D:/sts/workspace-sts-2.5.1_t1/sf3a/src/main/resources/proxy.properties";
		HttpHost proxy = null;
		Map<String, String> map = PropertiesUtil.readProperties(filePath);
		if (map.size() == 0) {
			throw new RuntimeException("无可用代理");
		} else {
			Set<String> set = map.keySet();
			String[] array = (String[]) set.toArray(new String[set.size()]);
			Random r = new Random();
			int rnum = r.nextInt(array.length);
			String ip = array[rnum];
			String port = map.get(ip);
			proxy = new HttpHost(ip, Integer.parseInt(port));
		}
		httpclient.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY,
				proxy);
		httpclient.getParams().setParameter(
				CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);
		// 模拟浏览器,解决一些服务器程序只允许浏览器访问的问题
		httpclient
				.getParams()
				.setParameter(
						CoreProtocolPNames.USER_AGENT,
						"Mozilla/5.0 (Windows; U; Windows NT 6.1; zh-CN; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13");// 我本机实际的User-Agent
		httpclient.getParams().setParameter(
				CoreProtocolPNames.USE_EXPECT_CONTINUE, Boolean.FALSE);
		httpclient.getParams().setParameter(
				CoreProtocolPNames.HTTP_CONTENT_CHARSET,
				charset == null ? CHARSET_UTF8 : charset);
		httpclient.setHttpRequestRetryHandler(requestRetryHandler);
		HttpParams params = httpclient.getParams();
		HttpConnectionParams.setConnectionTimeout(params,
				connectionTimeoutMillis);
		HttpConnectionParams.setSoTimeout(params, socketTimeoutMillis);
		return httpclient;
	}

	/**
	 * 释放HttpClient连接
	 * 
	 * @param hrb
	 *            请求对象
	 * @param httpclient
	 *            client对象
	 */
	private static void abortConnection(final HttpRequestBase hrb,
			final HttpClient httpclient) {
		if (hrb != null) {
			hrb.abort();
		}
		if (httpclient != null) {
			httpclient.getConnectionManager().shutdown();
		}
	}

	/**
	 * 从给定的路径中加载此 KeyStore
	 * 
	 * @param url
	 *            keystore URL路径
	 * @param password
	 *            keystore访问密钥
	 * @return keystore 对象
	 */
	private static KeyStore createKeyStore(final URL url, final String password)
			throws KeyStoreException, NoSuchAlgorithmException,
			CertificateException, IOException {
		if (url == null) {
			throw new IllegalArgumentException("Keystore url may not be null");
		}
		KeyStore keystore = KeyStore.getInstance(KeyStore.getDefaultType());
		InputStream is = null;
		try {
			is = url.openStream();
			keystore.load(is, password != null ? password.toCharArray() : null);
		} finally {
			if (is != null) {
				is.close();
				is = null;
			}
		}
		return keystore;
	}

	/**
	 * 将传入的键/值对参数转换为NameValuePair参数集
	 * 
	 * @param paramsMap
	 *            参数集, 键/值对
	 * @return NameValuePair参数集
	 */
	private static List<NameValuePair> getParamsList(
			Map<String, String> paramsMap) {
		if (paramsMap == null || paramsMap.size() == 0) {
			return null;
		}
		List<NameValuePair> params = new ArrayList<NameValuePair>();
		for (Map.Entry<String, String> map : paramsMap.entrySet()) {
			params.add(new BasicNameValuePair(map.getKey(), map.getValue()));
		}
		return params;
	}

	/**
	 * 用于不规范的URI 由于URISyntaxException返回与此 URL 等效的 URI。此方法的作用与 new URI
	 * (this.toString()) 相同。 注意,任何 URL 实例只要遵守 RFC 2396 就可以转化为 URI。但是,有些未严格遵守该规则的
	 * URL 将无法转化为 URI。
	 * 
	 * @param strUrl
	 * @return
	 * @throws IOException
	 */
	public static String getDocument(String strUrl, String charset)
			throws IOException {
		StringBuffer document = new StringBuffer();
		try {
			URL url = new URL(strUrl);
			URLConnection conn = url.openConnection();
			conn.setConnectTimeout(connectionTimeoutMillis);
			conn.setReadTimeout(socketTimeoutMillis);
			BufferedReader reader = new BufferedReader(new InputStreamReader(
					conn.getInputStream(), charset));
			String line = null;
			while ((line = reader.readLine()) != null)
				document.append(line);
			reader.close();
		} catch (MalformedURLException ex) {
			throw ex;
		} catch (IOException ex) {
			throw ex;
		}
		return document.toString();

	}

	public static String getGetUrl(String url, Map<String, String> params) {
		if (url == null || StringUtils.isEmpty(url)) {
			return "";
		}
		List<NameValuePair> qparams = getParamsList(params);
		if (qparams != null && qparams.size() > 0) {
			String formatParams = format(qparams);
			url = (url.indexOf("?")) < 0 ? (url + "?" + formatParams) : (url
					.substring(0, url.indexOf("?") + 1) + formatParams);
		}
		return url;
	}

	private static String format(List<? extends NameValuePair> parameters) {
		StringBuilder result = new StringBuilder();
		for (NameValuePair parameter : parameters) {
			String encodedName = parameter.getName();
			String value = parameter.getValue();
			String encodedValue = (value != null) ? value : "";
			if (result.length() > 0)
				result.append("&");
			result.append(encodedName);
			result.append("=");
			result.append(encodedValue);
		}
		return result.toString();
	}

	public static boolean checkProxy(String ip, String port) {
		boolean flag = false;
		DefaultHttpClient httpclient = new DefaultHttpClient();
		try {
			// 设置代理服务器地址和端口
			HttpHost proxy = new HttpHost(ip, Integer.parseInt(port));
			httpclient.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY,
					proxy);
			httpclient.getParams().setParameter(
					CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);
			// 模拟浏览器,解决一些服务器程序只允许浏览器访问的问题
			httpclient
					.getParams()
					.setParameter(
							CoreProtocolPNames.USER_AGENT,
							"Mozilla/5.0 (Windows; U; Windows NT 6.1; zh-CN; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13");// 我本机实际的User-Agent
			httpclient.getParams().setParameter(
					CoreProtocolPNames.USE_EXPECT_CONTINUE, Boolean.FALSE);
			httpclient.getParams().setParameter(
					CoreProtocolPNames.HTTP_CONTENT_CHARSET, CHARSET_UTF8);
			httpclient.setHttpRequestRetryHandler(requestRetryHandler);
			HttpParams params = httpclient.getParams();
			HttpConnectionParams.setConnectionTimeout(params,
					connectionTimeoutMillis);
			HttpConnectionParams.setSoTimeout(params, socketTimeoutMillis);
			HttpHost targetHost = new HttpHost("http://www.google.com.hk", 80,
					"http");
			HttpGet httpget = new HttpGet("/");
			HttpResponse response = httpclient.execute(targetHost, httpget);
			System.out
					.println(ip + ":" + port + "=" + response.getStatusLine());
			if (response.getStatusLine().getStatusCode() == 200) {
				flag = true;
			}
		} catch (ClientProtocolException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			flag = false;
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			flag = false;
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			flag = false;
		} finally {
			httpclient.getConnectionManager().shutdown();
		}
		return flag;
	}
}

1 请登录后投票
   发表时间:2011-03-18  
nkliuliu 写道
lym6520 写道
Google 做了很多抓取的屏蔽操作,试了下JE的,虽然JE也做了抓取屏蔽,不过很容易跳过JE的过滤,只要设置User-Agent属性就行了。

没有用,已经设置过了。在
HttpclientUtil.getByProxy(url, params, "UTF-8");  
里的实现方法里设置过。


其实是可以设置的,httpclient默认的UserAgent是JAVA.所以大家可以设置成浏览器客户端就没问题了。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics