君子博学而日参省乎己 则知明而行无过矣

博客园 首页 新随笔 联系 订阅 管理

2013年7月25日 #

摘要: JSON解析和系列化功能,JSON官方网站是提供了官方的Java实现的(org.json)。但是,官方的实现并不理想。不仅接口复杂的要命。而且效率也不理想,基本可以判定是一个不合格产品。另外一个我比较喜欢的解析器,叫做StringTree。这个解析器最大的特点就是简单,JSONReader负责解析,JSONWriter负责序列化,成员方法也简单明了。他的输出格式除原始类型外,返回的Map,和List,充分利用了Java 集合框架。比起官方实现来,干净了很多。StringTree不仅简单易用,而且性能也非常不错。根据我的测试结果,StringTree最好。大概是JSEL的两倍。而官方版本最差,大 阅读全文
posted @ 2013-07-25 21:41 刺猬的温驯 阅读(352) 评论(0) 推荐(0)

摘要: 表达式引擎的定义这里我就不说了,先假设大家都知道^_^在JSEL之前也出现过不少其他类似产品,包括老牌的Ognl(老到网站都找不到了),新来的MVEL,还有我们国产的Aviator,IKExpression居然有了这么多可用的实现,那么JSEL的亮点又在那里呢?基于ECMA262标准的子集JSEL是一个兼容 JavaScript 运算规则的简单的表达式解释引擎。支持ECMA标准的运算符、函数库并内置了JSON支持。基本语法是JavaScript的一个子集,基本语法有良好群众基础。一个可以完全自定义的表达式系统全新运算符支持,运算符别名,优先级控制,内置对象设置,等等,一切皆有可能。你完全可以在 阅读全文
posted @ 2013-07-25 21:39 刺猬的温驯 阅读(1186) 评论(0) 推荐(0)

摘要: Part IComparable与Comparator接口不仅在串法上相似,而且他们的作用都十分的相似,他们可以让对象实现可排序。首先让我们看看官方文档(JDK6.0 API)中对他们的描述:public interface ComparableThis interface imposes a total ordering on the objects of each class that implements it. This ordering is referred to as the class'scompareTomethod is referred to as itsnatu 阅读全文
posted @ 2013-07-25 19:28 刺猬的温驯 阅读(307) 评论(0) 推荐(0)

摘要: Part I没啥好说的,直接开始Part II吧。Part II谈到了对象的克隆,就不得不说为什么要对对象进行克隆。Java中所有的对象都是保存在堆中,而堆是供全局共享的。也就是说,如果同一个Java程序的不同方法,只要能拿到某个对象的引用,引用者就可以随意的修改对象的内部数据(前提是这个对象的内部数据通过get/set方法曝露出来)。有的时候,我们编写的代码想让调用者只获得该对象的一个拷贝(也就是一个内容完全相同的对象,但是在内存中存在两个这样的对象),有什么办法可以做到呢?当然是克隆咯。Part III首先,我们是程序员,当然是用我们程序员的语言来交流。import java.util.D 阅读全文
posted @ 2013-07-25 19:27 刺猬的温驯 阅读(212) 评论(0) 推荐(0)

摘要: 今天有兴趣重新看了一下heritrix3.1.0系统里面的线程池源码,heritrix系统没有采用java的cocurrency包里面的并发框架,而是采用了线程组ThreadGroup类来实现线程池的(线程组类似于树结构,一个线程组包含多个子线程组或多个子线程,数据结构类似于composite模式,... 阅读全文
posted @ 2013-07-25 05:50 刺猬的温驯 阅读(1226) 评论(0) 推荐(0)

摘要: 转载自http://www.yshjava.cn/post/483.html今天在谷歌站长工具上看到谷歌爬虫在笔者的个人博客网站上找到了3个无效的404链接,稍微有一点SEO常识的人都知道,404是搜索引擎爬虫非常讨厌的页面,会直接降低网站在搜索引擎中的权重和排名,这是广大站长都不愿意看到的事情。如果自己手动的去寻找这些404页面,或许很难:404存在于哪些页面中?出现一次还是多次?偶然还是必然?所以,为了让它这件事变得高效和容易,我们得使用工具!网络上死链检测的工具多如牛毛,其中不乏非常经典、好用的,但是这些工具多大有一个特点,就是都是web(网页)版的,而且只支持单页面死链检测,不支持全站 阅读全文
posted @ 2013-07-25 04:19 刺猬的温驯 阅读(1305) 评论(0) 推荐(0)

摘要: 今天在网上看到一个问题,问HtmlUnit在多线程环境下怎么使用才能避免网页抓取失败的问题。下面结合自己的使用经验,浅谈该问题的解决办法。导致这个问题的原因其实蛮简单,举个例子来说,A线程正在使用一个WebClient对象抓取网页,在整个抓取流程结束之前,当前线程被CPU挂起,因此线程B被激活,然后B使用正在被A使用的WebClient对象进行其他网页的抓取工作,那么这时,WebCLient对象将清除刚刚未完成的工作遗留的数据,以此类推,越多线程共享一个WebClient,问题出现的就越频繁,网页丢失地概率也就越高。但其实这个问题是不难解决的,而且其解决办法也具有很广泛的适用性:无论是任何对象 阅读全文
posted @ 2013-07-25 04:17 刺猬的温驯 阅读(3363) 评论(0) 推荐(0)

摘要: HttpClient4.x支持自定义SSL上下文,这个功能非常实用,我们可以利用这一点非常轻松地实现获取某些需要证书后才能正常浏览的网页的需要。下面请看范例代码:package cn.ysh.studio.crawler.httpclient;import java.io.File;import java.io.FileInputStream;import java.security.KeyStore;import org.apache.http.HttpEntity;import org.apache.http.HttpResponse;import org.apache.http.clie 阅读全文
posted @ 2013-07-25 04:15 刺猬的温驯 阅读(601) 评论(0) 推荐(0)

摘要: 在实际应用中,网络爬虫(网络蜘蛛)往往需要每分钟爬取上百个网页甚至更多,这样的要求,单线程的爬虫(蜘蛛/spider)实在难以完成,势必要引入多线程技术。而在多线程环境下,为了避免浪费资源,需要重用HttpClient实例,由此带来了资源争抢和同步的问题。在HttpClient3的时候,我们可以使用池化技术来自行实现一个HttpClient池,满足这样的需要,但是在HttpClient4中,相关的解决方案已经内置其中,于是我们不必大费周章地实现一个对象池,来手动管理HttpClient实例,这样我们有更多的时间和精力来专注页面内容的处理。接下来,我们将演示如何使用ThreadSafeClien 阅读全文
posted @ 2013-07-25 04:14 刺猬的温驯 阅读(4648) 评论(0) 推荐(0)

摘要: 无论是做网络爬虫(网络蜘蛛)还是做页面测试,登录表单总是很常见的需求。表单的登录核心是将参数包装起来以POST方式提交给目标页面,但是不同于此的是表单登录往往还涉及到Cookies信息的处理,稍显繁琐。下面我们将演示如何使用HttpClient4.x执行基于表单的登录,并处理Cookies信息。具体代码如下:package cn.ysh.studio.crawler.httpclient;import java.util.ArrayList;import java.util.List;import org.apache.http.HttpEntity;import org.apache.htt 阅读全文
posted @ 2013-07-25 04:12 刺猬的温驯 阅读(205) 评论(0) 推荐(0)

摘要: 在使用HttpClient进行网页抓取的时候,难免会遇到目标页面使用Cookies的情况,还好这样的情形HttpClient能够轻松应对。在HttpClient中,无论是在请求中带入Cookies还是请求完成后获取Cookies,都可以通过CookieStore对象来完成。具体的做法是,将CookieStore实例加入一个HttpContext实例中,然后将该上下文实例带入HTTP请求过程中,如此HttpClient便能使用其中的Cookies信息,并将服务器返回的Cookies存入其中。具体的范例代码如下所示:package cn.ysh.studio.crawler.httpclient; 阅读全文
posted @ 2013-07-25 04:11 刺猬的温驯 阅读(710) 评论(0) 推荐(0)

摘要: 前两篇文章我们以实际代码讲解了如何使用使用代理服务器抓取网页(《HttpClient4.x通过代理服务器抓取网页》)和如何建立HTTPS安全连接(《HttpClient4.x客户端身份验证(HTTPS安全连接)》),本文将二者结合起来,以实际代码演示如何通过身份验证代理,在安全的连接通道中执行HTTP请求,即如何通过代理服务器进行身份认证并以HTTPS安全连接方式连接到目标服务器。代码如下:package cn.ysh.studio.crawler.httpclient;import org.apache.http.HttpEntity;import org.apache.http.HttpH 阅读全文
posted @ 2013-07-25 04:09 刺猬的温驯 阅读(456) 评论(0) 推荐(0)

摘要: 在如今的互联网时代,代理服务器已屡见不鲜,遍地可寻,其对互联网用户的重要性自然不言而喻。同样的,代理服务器对于爬虫来说一样重要,不仅可以通过代理进入某些比较封闭的局域网内抓取数据,更可以通过切换代理服务器来达到隐藏自身避免被封杀的目的。如果您打算或正在基于HttpClient4.x开发网络爬虫,且需要通过代理服务器来进行网页抓取,那么本文或许能够帮助您快速将HttpClient4.x的使用代理功能加入到您的爬虫中。如下代码演示了如何使用HttpClient通过代理服务器发送请求package cn.ysh.studio.crawler.httpclient;import org.apache. 阅读全文
posted @ 2013-07-25 04:08 刺猬的温驯 阅读(1695) 评论(0) 推荐(0)

摘要: 某些情况下,比如连接目标网页超时时,我们需要及时中断此次HTTP请求并释放相关资源,以节省时间和资源进行其他的请求。如下的例子演示了如何在正常结束前中止一个HTTP请求。package cn.ysh.studio.crawler.httpclient;import org.apache.http.HttpEntity;import org.apache.http.HttpResponse;import org.apache.http.client.HttpClient;import org.apache.http.client.methods.HttpGet;import org.apache 阅读全文
posted @ 2013-07-25 04:07 刺猬的温驯 阅读(752) 评论(0) 推荐(0)

摘要: 最近Apache HttpClient发布了最新的4.3版本,据说有很多的改进,加入了新的设计思想和理念,使API更加简洁有力,闲来无事,做个Demo尝尝鲜。在以前的3.x版本中,HttpClient就已经支持HTTPS连接了,但是代码写的比较多,而且用起来感觉挺别扭的,同样的功能,到了4这里,明显得简单清爽多了。如下是来自官方的一个例子,稍加改造,并翻译了注释:package cn.ysh.studio.crawler.httpclient;import org.apache.http.HttpEntity;import org.apache.http.HttpResponse;import 阅读全文
posted @ 2013-07-25 04:07 刺猬的温驯 阅读(848) 评论(0) 推荐(0)

摘要: 对于HttpClient4.x来说,使用完后的HttpClient对象,需要显式地释放其使用的底层HTTP连接,否则将造成过高的资源占用。前一篇文章《HttpClient4.x进行Get/Post请求并使用ResponseHandler处理响应》演示了如何使用ResponseHandler处理GET/POST请求的响应结果并自动释放底层HTTP连接,如下这个例子演示了如何确保在手动处理HTTP响应的情况下释放底层的HTTP连接回连接管理器。package cn.ysh.studio.crawler.httpclient;import java.io.IOException;import jav 阅读全文
posted @ 2013-07-25 04:05 刺猬的温驯 阅读(1301) 评论(0) 推荐(0)

摘要: HTTPClient4之后,基本重写了3的所有代码,使得API用起来更显简单有力,最简单的例子体现在get/post请求以及请求响应结果的处理上。3的时候,需要自己处理响应流,无论是网页编码识别还是代码处理等各方面,非常不便,4之后使用ResponseHandler可以非常方便和简洁地处理上述问题。如下代码演示了如何使用响应处理器(ResponseHandler)来处理HTTP响应。这是执行HTTP请求和处理HTTP响应的推荐方式。这种做法使调用者将注意力集中在处理HTTP响应内容的过程中,并委派任务释放HttpClient所占用的系统资源。ResponseHandler能够保证在任何情况下都 阅读全文
posted @ 2013-07-25 04:03 刺猬的温驯 阅读(2006) 评论(0) 推荐(0)

摘要: 现在有越来越多的人热衷于做网络爬虫(网络蜘蛛),也有越来越多的地方需要网络爬虫,比如搜索引擎、资讯采集、舆情监测等等,诸如此类。网络爬虫涉及到的技术(算法/策略)广而复杂,如网页获取、网页跟踪、网页分析、网页搜索、网页评级和结构/非结构化数据抽取以及后期更细粒度的数据挖掘等方方面面,对于新手来说,不是一朝一夕便能完全掌握且熟练应用的,对于作者来说,更无法在一篇文章内就将其说清楚。因此在本篇文章中,我们仅将视线聚焦在网络爬虫的最基础技术——网页抓取方面。说到网页抓取,往往有两个点是不得不说的,首先是网页编码的识别,另外一个是对网页脚本运行的支持,除此之外,是否支持以POST方式提交请求和支持自动 阅读全文
posted @ 2013-07-25 04:02 刺猬的温驯 阅读(11923) 评论(2) 推荐(1)

摘要: 简单的说, 就是客户端根据WSDL 生成 SOAP 的请求消息, 通过 HTTP 传输方式(也可以是其它传输方式, 如 FTP 或STMP 等,目前 HTTP 传输方式已经成为 J2EE Web Service 的标准)传给对方, 服务方实现服务请求,Web Service(Web服务)将结果以 SOAP 的消息格式返回给客户端。如果人工去创建和解析基于 XML 格式的 SOAP 消息还是一个非常复杂的过程, 这样 JAX-RPC 应时而生, 他实现了J2EE Web Sercive 的远程分布式调用。JAX - RPC :Java APIs for XML-Based Remote Proc 阅读全文
posted @ 2013-07-25 01:43 刺猬的温驯 阅读(1434) 评论(0) 推荐(0)