浏览 9676 次
锁定老帖子 主题:抓取google的相关搜索词
精华帖 (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头像 在线美女脱衣麻将 真人美女小游戏网 古典美女模块 我的美女大小姐 非主流空间皮肤代码
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2011-03-16
有相应的jar包吗?自己玩玩
|
|
返回顶楼 | |
发表时间:2011-03-17
带上jar包啊!!
|
|
返回顶楼 | |
发表时间:2011-03-17
很暴力,必须顶
|
|
返回顶楼 | |
发表时间:2011-03-17
Google 做了很多抓取的屏蔽操作,试了下JE的,虽然JE也做了抓取屏蔽,不过很容易跳过JE的过滤,只要设置User-Agent属性就行了。
|
|
返回顶楼 | |
发表时间:2011-03-17
有意思,回去试试~
|
|
返回顶楼 | |
发表时间:2011-03-17
lym6520 写道 Google 做了很多抓取的屏蔽操作,试了下JE的,虽然JE也做了抓取屏蔽,不过很容易跳过JE的过滤,只要设置User-Agent属性就行了。 没有用,已经设置过了。在 HttpclientUtil.getByProxy(url, params, "UTF-8");里的实现方法里设置过。 |
|
返回顶楼 | |
发表时间:2011-03-17
lz把HttpClient那个类也贴出来啊
|
|
返回顶楼 | |
发表时间: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; } } |
|
返回顶楼 | |
发表时间:2011-03-18
nkliuliu 写道 lym6520 写道 Google 做了很多抓取的屏蔽操作,试了下JE的,虽然JE也做了抓取屏蔽,不过很容易跳过JE的过滤,只要设置User-Agent属性就行了。
没有用,已经设置过了。在 HttpclientUtil.getByProxy(url, params, "UTF-8");里的实现方法里设置过。 其实是可以设置的,httpclient默认的UserAgent是JAVA.所以大家可以设置成浏览器客户端就没问题了。 |
|
返回顶楼 | |