最近在写一个网络爬虫,参考书籍为《网络机器人java编程指南》,一本7,8年前的老书了,不过对于我这种菜鸟来说其中仍然包含着大量的知识。
我从2011年2月24日开始动手写自己的spider,基本参照书上的程序来写,当然会删除一些太难理解或者很少用到的类,并对部分地方做一些优化。
下面将开始记录我在编写spider过程中遇到的各种难题与困难。
--------------------------------
2月24日
java的IO流问题。
IO流分为inputstream/outputstream与reader/writer。前者是读取字节码,后者是读取字符码。
简单说来,前者能够处理各种类型的数据,而后者在读取文字处理文本尤其是中文等语言方面有良好的性能。
input/output流采用修饰结构。一般读取文件我们用的层次是:bufferedReader(bufferedInputStream(FileInputStream(InputStream)));
IO流问题其实是一个难点,而且往往被忽略,要好好掌握。
2月24日一共完成了3个最最基本的类:Attribute、AttributeList、Log。
Attribute用来记录信息,类成员有name、value、delim。
所有类函数都是Synchronized,这样给方法加锁避免两个线程同时访问产生Bug。
AttributeList当然就是Attribute的队列咯。
Log类用来做记录。这个类不是很重要,不赘述了。
对了,忘记说了,尽管这个Log类不重要,但是它却体现了一种设计模式:单例模式。Log类的所有成员及方法都是静态的,因为Log类是唯一的,不能被实例化。而且Log类的构造函数是private的。这样可以防止其他类创建Log类实例。(这个设计模式还是挺重要的一part,大家有空一定要好好学啊~~~)
-------------------------------
2月25日
动手写基础类。
书中讲到访问https的问题。https可以简单的理解为http的安全版,拥有自己的编码机制对信息加密。这个地方我不太懂,这个涉及到其他两个类:SSL与Base64OutputStream。Base64是一种加密机制,一般的下载工具都会用到(比如迅雷等),SSL就不了解了。(唉,这个地方没学过,有空好好学一下~)
爬虫涉及到的基础类包括了html与URL等的解析类,当然还有专门处理URL与html的类,这些也算是一个难点,先放着吧。。。(唉,技术不过硬造成的直接后果~~~)
-------------------------------
2月27日
本来是想通过自底向上方法开发爬虫的,发现自己对这个爬虫的构造还是不够熟悉,思路不够清晰,今天换着自顶向下方法来搞这个小爬虫……
分析一下整个爬虫的结构(庖丁解虫。。。)
该爬虫的类应该分为几个类组:
1.通用类组:基本用途,一开始可以忽略,包括Base64码的转换以及连接等用途;
2.HTTP类组:主要负责向服务器发送HTTP请求,包括HTTP以及HTTPSocket类;
3.解析类组:用于分析网页的HTML及cookies等;
4.Spider类组:即核心类组,用一个线程池来管理各个线程。
当然咯,做为一只强大的爬虫,必然是多线程的,这样才能够爬遍全球!那就先掌握以下多线程技术。
我的爬虫使用线程池技术解决问题。一篇很好的关于线程池技术的文章:http://www.ibm.com/developerworks/cn/java/l-threadPool/
从这篇文章我们可以了解到,这个爬虫包括几个部分:线程池管理器、工作线程、任务接口、任务队列。
今天的经验:不要一开始就去追求细节,还是从框架入手先写一个最最简单的框架再一步步细化,迭代式开发总是没有错的!!!