- 浏览: 210061 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
HeSanJava:
谢谢,文章很有用
spring定时任务执行两次 -
JobinBai:
xiaoqiang2008 写道执行两次的原因是什么,好像楼主 ...
spring定时任务执行两次 -
zhangguicheng12:
果然是tomcat配置的问题
多谢了!
spring定时任务执行两次 -
xiaoqiang2008:
执行两次的原因是什么,好像楼主没弄清楚啊!是不是在web.xm ...
spring定时任务执行两次 -
zx527291227:
你好!按照你的说我尝试了下但是还是会访问两次,能帮忙看下是什么 ...
spring定时任务执行两次
最好配合上一篇的代理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头像 在线美女脱衣麻将 真人美女小游戏网 古典美女模块 我的美女大小姐 非主流空间皮肤代码
评论
10 楼
hwx521
2011-03-19
请问下 lz,
import com.emar.core.util.PropertiesUtil;
NetServiceException
这个是在那个jar里面! 还有上面那个类也提供下啊
import com.emar.core.util.PropertiesUtil;
NetServiceException
这个是在那个jar里面! 还有上面那个类也提供下啊
9 楼
glamey
2011-03-18
nkliuliu 写道
lym6520 写道
Google 做了很多抓取的屏蔽操作,试了下JE的,虽然JE也做了抓取屏蔽,不过很容易跳过JE的过滤,只要设置User-Agent属性就行了。
没有用,已经设置过了。在
HttpclientUtil.getByProxy(url, params, "UTF-8");里的实现方法里设置过。
其实是可以设置的,httpclient默认的UserAgent是JAVA.所以大家可以设置成浏览器客户端就没问题了。
8 楼
nkliuliu
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; } }
7 楼
mazhiyuan
2011-03-17
lz把HttpClient那个类也贴出来啊
6 楼
nkliuliu
2011-03-17
lym6520 写道
Google 做了很多抓取的屏蔽操作,试了下JE的,虽然JE也做了抓取屏蔽,不过很容易跳过JE的过滤,只要设置User-Agent属性就行了。
没有用,已经设置过了。在
HttpclientUtil.getByProxy(url, params, "UTF-8");里的实现方法里设置过。
5 楼
hui_windows
2011-03-17
有意思,回去试试~
4 楼
lym6520
2011-03-17
Google 做了很多抓取的屏蔽操作,试了下JE的,虽然JE也做了抓取屏蔽,不过很容易跳过JE的过滤,只要设置User-Agent属性就行了。
3 楼
zk1878
2011-03-17
很暴力,必须顶
2 楼
hwx521
2011-03-17
带上jar包啊!!
1 楼
wangkaiyong
2011-03-16
有相应的jar包吗?自己玩玩
相关推荐
标题中的“相关词抓取软件”指的是用于搜索引擎优化(SEO)的一种工具,它能帮助用户自动获取与目标关键词相关的搜索词汇。在竞价排名或者搜索引擎营销(SEM)中,了解并使用相关词是至关重要的,因为它们能提高广告...
WordBuilder是一款针对百度和Google搜索引擎的热门搜索词分析程序,虽然描述中提到它是一个较旧的程序,可能无法直接编译运行,但它仍然可以作为理解搜索引擎优化(SEO)策略和关键词研究的重要参考资料。...
它能够自动从多个主流平台,包括Google、百度、淘宝、亚马逊和速卖通,抓取搜索建议的关键词,帮助用户洞察用户在这些平台上的搜索习惯和热门趋势。 在SEO领域,了解并利用有效的关键词至关重要。搜索建议关键词是...
通过抓取Google为之提供的相关搜索来收集给定搜索词的长尾关键词。 用法 克隆仓库: git clone https://github.com/datagrab/keyword-scraper.git 安装依赖项: npm install 运行它: node scraper.js --keyword=...
2. **构建搜索请求:** 根据用户提供的关键词和其他搜索参数,构建相应的搜索请求URL,包括搜索词、页面数量、排序方式等。 3. **发送HTTP请求:** 使用Python中的HTTP库(例如Requests)发送搜索请求,并获取搜索...
抓取关键词就是通过各种方法获取这些搜索词的过程。百度作为中国最大的搜索引擎,其关键词的抓取策略与谷歌等其他搜索引擎可能有所不同,因此,针对百度的关键词抓取需要专门的工具和策略。 多层抓取意味着不仅仅...
一个简单的Crawler,用于获取Google搜索结果。 该组件可用于检索搜索词的100个第一结果。 由于Google会检测到搜寻器并在发出多个请求时阻止IP,因此该组件准备使用某些在线代理服务,例如hide.me。 安装 使用安装...
谷歌搜索googlesearch是一个Python库,可轻松搜索Google。 googlesearch使用请求和BeautifulSoup4抓取Google。安装要安装,请运行以下命令:python3 -m pip install googlesearch-python用法要获取搜索字词的结果,...
在谷歌搜索引擎中,关键词是用户输入搜索框内以获取相关信息的词或短语。正确地选择和使用关键词是进行有效搜索的关键。在谷歌邮箱搜索器中,用户可以输入特定的关键词,比如公司名、行业术语或者特定项目名称,来...
标题中的“google搜索算法重要核心”指的主要是Google在搜索引擎技术方面所采用的关键算法,这些算法使得Google能够高效、准确地处理海量数据,为用户提供快速且相关的搜索结果。描述中提到的“并行计算”,是Google...
在本项目中,"模拟Google搜索 JSP java" 的目标是利用这些技术创建一个类似于Google搜索引擎的功能,允许用户输入关键词并返回相关结果。这个过程涉及了多个知识点,包括但不限于以下几个方面: 1. **JSP基础**:...
这段Python代码会抓取Google搜索结果,然后进行情感分析(同时使用TextBlob和VADER),为每个分类生成文本摘要(4种不同的方法),并为每个分类对停用词清除后的关键字进行排名。 结果显示在屏幕上,并另存为文本...
【标题】"模拟Google搜索"涉及的是通过编程技术来实现类似Google搜索引擎的功能,这通常涉及到网络爬虫、数据抓取、关键词匹配以及信息检索等多个IT领域的知识点。 在互联网上,Google搜索是全球最广泛使用的搜索...
**标题:“复杂的1秒图解Google搜索技术”** 在当今信息爆炸的时代,搜索引擎扮演着至关重要的角色,而Google作为全球最知名的搜索引擎,其搜索技术无疑是业界的翘楚。本篇文章将深入探讨Google如何在短短1秒钟内...
《Learn Google》这本书不仅为我们提供了谷歌搜索引擎的全面解读,还介绍了谷歌的多项业务,展示了这家科技巨头如何利用先进的IT技术为全球用户提供便捷、高效的信息服务。对于IT专业人士和普通用户而言,深入理解...
5. **查询处理**:用户输入查询后,搜索引擎需要解析查询语句,处理同义词、拼写纠错,并根据索引找到相关文档。 6. **排序算法**:对搜索结果进行排序,通常基于PageRank、TF-IDF、BM25等算法,结合点击率、用户...
在IT行业中,实现类似Google搜索功能是一项复杂而高级的任务,涉及到搜索引擎优化(SEO)、信息检索、数据处理和算法等多个领域的知识。以下将详细介绍这个过程的关键技术点。 首先,我们需要理解Google搜索的核心...
谷歌灰色词排名推广是指针对谷歌搜索引擎优化的一种策略,特别是针对那些在法律边缘或不被官方推荐的关键词(灰色词)进行的排名提升。这种推广方式通常涉及到技术手段,旨在让含有灰色关键词的网页在谷歌搜索结果中...
【标题】:为网站添加搜索功能类似于在Google里搜索自己...总的来说,通过这个项目,你将学习到如何利用Java和相关工具构建一个内部搜索引擎,为你的网站提供高效且定制化的搜索体验,类似于用户在Google中搜索的体验。