- 浏览: 917976 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (263)
- J2EE (9)
- Spring (11)
- Hibernate (11)
- Struts (5)
- opensource (19)
- Hadoop (28)
- 架构设计 (8)
- 企业应用 (10)
- SNMP (8)
- SSO (4)
- webservice (11)
- RPC (2)
- 编程语言 (0)
- Java (30)
- Javascript (5)
- NoSQL (11)
- 数据库 (0)
- oracle (8)
- MySQL (3)
- web (1)
- Android (2)
- Linux (15)
- 软件工具 (15)
- 项目构建 (11)
- 测试工具 (2)
- Exception (19)
- 杂谈 (4)
- Groovy (5)
- Nodejs (1)
- MacOSX (4)
最新评论
-
fighhin:
decode(BinaryBitmap,java.util.M ...
条形码/二维码之开源利器ZXing图文介绍 -
u013489005:
追问:楼主,请问有中文文档么?我的邮箱是frankgray@s ...
Java表达式计算引擎:Expr4J -
u013489005:
感谢博主 需要引入的包是import java.io.*;im ...
Java表达式计算引擎:Expr4J -
calosteward:
感谢楼主分享。。 Zxing 我听说过的。__________ ...
条形码/二维码之开源利器ZXing图文介绍 -
u013810758:
judasqiqi 写道感谢楼主!想请问楼主一下这个生成的图片 ...
Java实现二维码QRCode的编码和解码
blog迁移至:http://www.micmiu.com
原先一个对google、百度的搜索页面简单解析处理的小程序,前几天突然发现对google的搜索结果处理不起作用了,百度的一切正常。经测试估计是google做了相应的限制,后来便想到了先用httpclient模拟客户端访问,获取搜索结果的页面,然后再用HTMLParser处理。
HttpClient 是 Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,网站:http://hc.apache.org/
问题解决前后的测试代码如下:
原先的代码TestGoogleSearch.java:
运行结果:
NodeFilter start...
here -- http://www.google.com.hk/url?sa=p&hl=zh-CN&cki=PREF%3DID%3Db49ef17c9c585188:FF%3D1:LD%3Dzh-CN:NW%3D1:TM%3D1288754215:LM%3D1288754215:S%3DDvpSJRMCSGZqN7mE&q=http://www.google.com.hk/search%3Fhl%3Dzh-CN%26source%3Dhp%26q%3Dnero9%25E5%2588%25BB%25E5%25BD%2595ape%26aq%3Df%26aqi%3D%26aql%3D%26oq%3D%26gs_rfai%3D&ust=1288754245627953&usg=AFQjCNFqlSLKTXZTp3Vk7WcVsOHOkhNeMQ
NodeFilter end
从打印结果会发现只能解析出一个google自身的连接
修改后的代码TestParserGoogleSearch.java:
运行结果:
get reoponse body stream:org.apache.commons.httpclient.AutoCloseInputStream@193385d
85
图片 -- http://www.google.com.hk/images?hl=zh-cn&q=nero9%E5%88%BB%E5%BD%95ape&um=1&ie=UTF-8&source=og&sa=N&tab=wi
视频 -- http://www.google.com.hk/search?hl=zh-cn&q=nero9%E5%88%BB%E5%BD%95ape&um=1&ie=UTF-8&tbo=u&tbs=vid:1&source=og&sa=N&tab=wv
。。。。。。 省略一些打印结果
这样可以解析出所有的连接,加上相应的参数也可以翻页。
OK,到此就是基本的解决过程了,希望能给某位需要的仁兄提供帮助。
原先一个对google、百度的搜索页面简单解析处理的小程序,前几天突然发现对google的搜索结果处理不起作用了,百度的一切正常。经测试估计是google做了相应的限制,后来便想到了先用httpclient模拟客户端访问,获取搜索结果的页面,然后再用HTMLParser处理。
HttpClient 是 Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,网站:http://hc.apache.org/
问题解决前后的测试代码如下:
原先的代码TestGoogleSearch.java:
package com.htmlparser; import java.net.HttpURLConnection; import java.net.URL; import org.htmlparser.NodeFilter; import org.htmlparser.Parser; import org.htmlparser.filters.TagNameFilter; import org.htmlparser.tags.LinkTag; import org.htmlparser.util.NodeList; /** * 测试 google 搜索结果页面处理 * @author Michael * */ public class TestGoogleSearch { /** * @param args */ public static void main(String[] args) { TestGoogleSearch test = new TestGoogleSearch(); String url = "http://www.google.com.hk/search?hl=zh-CN&source=hp&q=nero9%E5%88%BB%E5%BD%95ape&aq=f&aqi=&aql=&oq=&gs_rfai="; test.parseLinkFilter(url); } /** * * @param url */ private void parseLinkFilter(String url) { System.out.println("NodeFilter start..."); try { HttpURLConnection.setFollowRedirects(true); URL netUrl = new URL(url); HttpURLConnection con = (HttpURLConnection) netUrl.openConnection(); con.setInstanceFollowRedirects(false); con.connect(); Parser parser = new Parser(con); parser.setEncoding(parser.getEncoding()); NodeFilter filter = new TagNameFilter("A"); NodeList list = parser.extractAllNodesThatMatch(filter); for (int i = 0; i < list.size(); i++) { LinkTag tag = (LinkTag) list.elementAt(i); System.out.println(tag.getLinkText() + " -- " + tag.getLink()); } } catch (Exception e) { e.printStackTrace(); } System.out.println("NodeFilter end"); } }
运行结果:
NodeFilter start...
here -- http://www.google.com.hk/url?sa=p&hl=zh-CN&cki=PREF%3DID%3Db49ef17c9c585188:FF%3D1:LD%3Dzh-CN:NW%3D1:TM%3D1288754215:LM%3D1288754215:S%3DDvpSJRMCSGZqN7mE&q=http://www.google.com.hk/search%3Fhl%3Dzh-CN%26source%3Dhp%26q%3Dnero9%25E5%2588%25BB%25E5%25BD%2595ape%26aq%3Df%26aqi%3D%26aql%3D%26oq%3D%26gs_rfai%3D&ust=1288754245627953&usg=AFQjCNFqlSLKTXZTp3Vk7WcVsOHOkhNeMQ
NodeFilter end
从打印结果会发现只能解析出一个google自身的连接
修改后的代码TestParserGoogleSearch.java:
package com.htmlparser; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import org.apache.commons.httpclient.DefaultHttpMethodRetryHandler; import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.HttpException; import org.apache.commons.httpclient.HttpStatus; import org.apache.commons.httpclient.methods.GetMethod; import org.apache.commons.httpclient.params.HttpMethodParams; import org.htmlparser.Parser; import org.htmlparser.filters.TagNameFilter; import org.htmlparser.tags.LinkTag; import org.htmlparser.util.NodeList; /** * * @author Michael * */ public class TestParserGoogleSearch { /** * @param args */ public static void main(String[] args) { TestParserGoogleSearch parser = new TestParserGoogleSearch(); String url = "http://www.google.com.hk/search?hl=zh-CN&source=hp&q=nero9%E5%88%BB%E5%BD%95ape&aq=f&aqi=&aql=&oq=&gs_rfai="; String html = parser.getUrlHtmlByHttpClient(url); parser.parseHtmlLink(html); } /** * 处理搜索结果字符串 * @param htmlstr */ private void parseHtmlLink(String htmlstr) { try { Parser parser = Parser.createParser(htmlstr, "utf-8"); // 创建TagNameFilter实例 TagNameFilter filter = new TagNameFilter("A"); // 筛选出所有A标签节点 NodeList nodes = parser.extractAllNodesThatMatch(filter); if (nodes != null) { System.out.println(nodes.size()); for (int i = 0; i < nodes.size(); i++) { LinkTag tag = (LinkTag) nodes.elementAt(i); System.out.println(tag.getLinkText() + " -- " + tag.getLink()); } } } catch (Exception e) { e.printStackTrace(); } } /** * 模拟客户端访问获取搜索结果页面 * @param url * @return */ private String getUrlHtmlByHttpClient(String url) { String searchHtml = null; HttpClient httpClient = new HttpClient(); httpClient.getHttpConnectionManager().getParams().setConnectionTimeout( 5000); GetMethod getMethod = new GetMethod(url); getMethod.getParams().setParameter(HttpMethodParams.SO_TIMEOUT, 5000); getMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler()); try { int statusCode = httpClient.executeMethod(getMethod); if (statusCode != HttpStatus.SC_OK) { System.err.println("Method failed: " + getMethod.getStatusLine()); } InputStream bodyIs = getMethod.getResponseBodyAsStream();// System.out.println("get reoponse body stream:" + bodyIs); //如果中文乱码 修改字符集 // BufferedReader br = new BufferedReader( // new InputStreamReader(bodyIs,"GBK")); BufferedReader br = new BufferedReader( new InputStreamReader(bodyIs)); StringBuffer sb = new StringBuffer(); String line = null; while ((line = br.readLine()) != null) { sb.append(line); } searchHtml = sb.toString(); return searchHtml; } catch (HttpException e) { System.out.println("Please check your http address!"); e.printStackTrace(); return null; } catch (IOException e) { e.printStackTrace(); return null; } finally { getMethod.releaseConnection(); } } }
运行结果:
get reoponse body stream:org.apache.commons.httpclient.AutoCloseInputStream@193385d
85
图片 -- http://www.google.com.hk/images?hl=zh-cn&q=nero9%E5%88%BB%E5%BD%95ape&um=1&ie=UTF-8&source=og&sa=N&tab=wi
视频 -- http://www.google.com.hk/search?hl=zh-cn&q=nero9%E5%88%BB%E5%BD%95ape&um=1&ie=UTF-8&tbo=u&tbs=vid:1&source=og&sa=N&tab=wv
。。。。。。 省略一些打印结果
这样可以解析出所有的连接,加上相应的参数也可以翻页。
OK,到此就是基本的解决过程了,希望能给某位需要的仁兄提供帮助。
发表评论
-
github更新自己Fork的代码
2014-03-09 22:52 1190github上有个功能叫fork,可以将别人的工程复制 ... -
Eclipse+OpenORB+ORBStudio配置CORBA开发环境
2013-10-24 09:04 1715目录 准备工作 整合配置 [一]、准备工作 -
openfire数据库配置说明
2013-04-26 11:29 1698数据库配置是在 conf/openfire.xml ... -
Shiro在web应用中实现验证码功能
2013-04-09 11:44 2963目录结构: 概述 扩展shiro认证 验证码工具 ... -
Openfire插件开发坏境配置指南
2013-03-19 14:24 964本文主要是介绍Openfire插件开发的环境配置,该指南是在 ... -
Openfire源码导入Eclipse编译配置指南
2013-03-19 09:26 3552本文将图文介绍如何把openfire(以3.8.1为例)源码 ... -
Openfire服务端安装和配置
2013-03-19 09:24 1087图文详细介绍Openfire服务端安装和配置的过程 ... -
iText实现直接把URL网页内容生成PDF
2012-11-28 10:44 3401目录: 概述 软件要求 实现过程 ... -
iText XML Worker实现HTML转PDF
2012-11-27 09:47 1853目录: 概述 两种应用场景的实现 ... -
iText XML Worker修改源码完美支持HTML中文字符转PDF
2012-11-27 08:59 2396目录: 介绍 中文字符转换 转换 ... -
iText生成PDF的书签
2012-11-26 13:46 2037主要演示iText生成PDF的书签功能,基本介绍详见代码中的注 ... -
iText生成PDF入门
2012-11-26 09:30 1126目录: 介绍 实验环境 入门 ... -
jldap实现Java对LDAP的基本操作
2012-07-03 15:17 2298目录: 概述 基本操作 查询 添加 删除 ... -
dom4j使用小结(基础入门级)
2011-11-08 15:11 2570blog迁移至 :http://www.micmiu. ... -
Simple XML
2011-09-28 23:55 5117blog迁移至 :http://www.micmiu. ... -
Open Flash Chart2实现动态曲线图小结
2011-04-18 10:49 6399blog迁移至:http://www.micmiu.c ... -
HTMLParser初试
2010-11-03 09:22 1941blog迁移至:http://www.micmiu.c ... -
Open Flash Chart2应用(实现flash另存为图片)
2010-04-22 08:43 8660blog迁移至:http://www.micmiu.c ...
相关推荐
AutoTips是为解决应用系统对于【自动提示】的需要(如:Google搜索), 而开发的架构无关的公共控件, 以满足该类需求可以通过快速配置来开发。AutoTips基于搜索引擎Apache Lucene实现。AutoTips提供统一UI。 WAP浏览器...
AutoTips是为解决应用系统对于【自动提示】的需要(如:Google搜索), 而开发的架构无关的公共控件, 以满足该类需求可以通过快速配置来开发。AutoTips基于搜索引擎Apache Lucene实现。AutoTips提供统一UI。 WAP浏览器...
AutoTips是为解决应用系统对于【自动提示】的需要(如:Google搜索), 而开发的架构无关的公共控件, 以满足该类需求可以通过快速配置来开发。AutoTips基于搜索引擎Apache Lucene实现。AutoTips提供统一UI。 WAP浏览器...
AutoTips是为解决应用系统对于【自动提示】的需要(如:Google搜索), 而开发的架构无关的公共控件, 以满足该类需求可以通过快速配置来开发。AutoTips基于搜索引擎Apache Lucene实现。AutoTips提供统一UI。 WAP浏览器...
AutoTips是为解决应用系统对于【自动提示】的需要(如:Google搜索), 而开发的架构无关的公共控件, 以满足该类需求可以通过快速配置来开发。AutoTips基于搜索引擎Apache Lucene实现。AutoTips提供统一UI。 WAP浏览器...
AutoTips是为解决应用系统对于【自动提示】的需要(如:Google搜索), 而开发的架构无关的公共控件, 以满足该类需求可以通过快速配置来开发。AutoTips基于搜索引擎Apache Lucene实现。AutoTips提供统一UI。 WAP浏览器...
AutoTips是为解决应用系统对于【自动提示】的需要(如:Google搜索), 而开发的架构无关的公共控件, 以满足该类需求可以通过快速配置来开发。AutoTips基于搜索引擎Apache Lucene实现。AutoTips提供统一UI。 WAP浏览器...
AutoTips是为解决应用系统对于【自动提示】的需要(如:Google搜索), 而开发的架构无关的公共控件, 以满足该类需求可以通过快速配置来开发。AutoTips基于搜索引擎Apache Lucene实现。AutoTips提供统一UI。 WAP浏览器...
AutoTips是为解决应用系统对于【自动提示】的需要(如:Google搜索), 而开发的架构无关的公共控件, 以满足该类需求可以通过快速配置来开发。AutoTips基于搜索引擎Apache Lucene实现。AutoTips提供统一UI。 WAP浏览器...
AutoTips是为解决应用系统对于【自动提示】的需要(如:Google搜索), 而开发的架构无关的公共控件, 以满足该类需求可以通过快速配置来开发。AutoTips基于搜索引擎Apache Lucene实现。AutoTips提供统一UI。 WAP浏览器...
AutoTips是为解决应用系统对于【自动提示】的需要(如:Google搜索), 而开发的架构无关的公共控件, 以满足该类需求可以通过快速配置来开发。AutoTips基于搜索引擎Apache Lucene实现。AutoTips提供统一UI。 WAP浏览器...
AutoTips是为解决应用系统对于【自动提示】的需要(如:Google搜索), 而开发的架构无关的公共控件, 以满足该类需求可以通过快速配置来开发。AutoTips基于搜索引擎Apache Lucene实现。AutoTips提供统一UI。 WAP浏览器...
AutoTips是为解决应用系统对于【自动提示】的需要(如:Google搜索), 而开发的架构无关的公共控件, 以满足该类需求可以通过快速配置来开发。AutoTips基于搜索引擎Apache Lucene实现。AutoTips提供统一UI。 WAP浏览器...
产生RSA密钥对(myKeyPair),得到RSA密钥对,产生Signature对象,对用私钥对信息(info)签名,用指定算法产生签名对象,用私钥初始化签名对象,将待签名的数据传送给签名对象(须在初始化之后),用公钥验证签名结果,...