- 浏览: 207209 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
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包吗?自己玩玩
相关推荐
非常实用的一个关键词抓取工具,适用于Google、百度、淘宝、亚马逊、速卖通,
通过抓取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用法要获取搜索字词的结果,...
这段Python代码会抓取Google搜索结果,然后进行情感分析(同时使用TextBlob和VADER),为每个分类生成文本摘要(4种不同的方法),并为每个分类对停用词清除后的关键字进行排名。 结果显示在屏幕上,并另存为文本...
信息SearchScraper是Python抓取工具,可抓取Google搜索的内容。如何使用它该程序需要Python。 您不需要任何其他模块即可运行它。 该程序本身是完全自动化的,根本不需要任何输入。 但是,该程序会读取搜索文件。 您...
电子表格ID 细绳(可选)将从中加载搜索字词的Google表格的ID。 isPublic 布尔值如果选中,则可以导入公共电子表格,而无需授权。 要导入私人表格,请阅读下面的授权书。 默认为false 。 时间范围细绳选择预定义的...
例如,如果在Flickr中的图像描述中提到了搜索词,即使该搜索查询未出现在图像本身中,它也会显示在结果中。 为了清理图像,还包括另一个脚本,该脚本使用Google训练的深度卷积神经网络来应用Google Vision API图像...
ComboGrabber 用于抓取组合的Google&Pastebin HTML抓取工具(带有GUI) 没有版权/开源/公共程序该程序通过发出具有给定搜索词HTML Google搜索请求并捕获页面上所有的Pastebin链接来工作。 然后使用找到的链接,以...
此gem查找所有LinkedIn个人资料,包括您指定的术语并进行抓取。 下载gem'linkedindata'并将其添加到您的gemfile中 新建一个LinkedinData对象:l = ... 符合搜索字词的配置文件列表:l.getByKeywords(“搜索字词”)
5.5 相关搜索 107 5.6 拼写检查 110 5.6.1 英文拼写检查 110 5.6.2 中文拼写检查 112 5.7 自动摘要 116 5.7.1 自动摘要技术 117 5.7.2 自动摘要的设计 117 5.7.3 Lucene中的动态摘要 124 5.8 自动分类 125 5.8.1 ...
该API通过抓取Google来查找相关信息而起作用。 目前所有价格均以加元(CAD)显示。 可以采用以下形式发送请求: ...
在搜索中找到的任何链接,都将添加到“搜索词”的本地数据库 sha1 中。 与“搜索查询”相关以输出链接结果。 然后,您可以“升级”、“降级”、“关注”(抓取工作)或“删除”。 下次您搜索相同的“搜索词”时...
语言:English (UK) 搜索引擎抓取工具。 用于抓取Google搜索页面的结果。...该扩展工具可获取显示在Google搜索结果中的信息,因此只需键入搜索词,然后单击“复制到剪贴板”,然后将其粘贴到工作电子表格中即可。
2、修正历史记录URL错误格式,方便搜索引擎抓取 主要功能: 1、本工具适用于网站SEO时关键词深度挖掘,用一个关键词做相关热词挖掘,辅助筛选组合合适的关键词; 比如输入“电子商务”,工具会反馈百度、Google...
R中的算法可从Google Scholar中进行的搜索中抓取数据。 必须安装Firefox浏览器才能与Selenium软件包一起使用。 功能清单 从存储库上传带有功能的文件 来源(“ ”) 在Google学术搜索中添加搜索链接(此链接是在GS...
使用Python进行网络抓取项目 一个充满Web抓取项目的存储库,以帮助您实践Python对Webscraping的利用 ...为了使幼犬的图像更加随机,搜索词也会随机化! 然后将所有获取的图像保存到图像文件夹。 整个项目已记录。
1、在几木SEO优化工具中添加了实时监控功能,可对...12、模拟蜘蛛抓取:快速模拟搜索引擎蜘蛛访问页面所抓取到的内容信息。 13、关键字密度检测:检测页面关键字出现的数量和密度,以便于调整,使之更受搜索引擎喜爱。
Google等商业搜索 引擎提供商,为此开发了一整套云存储与云计算平台,使用数以万计的普通PCWEBCRAWLER 网络爬虫实训项目 4 搭建了海量信息的可靠存储与计算架构,以此作为搜索引擎及其相关应用的基 础支撑。优秀的...