提到爬虫大家可能都不陌生,简单来说,爬虫就是用代码来请求互联网资源,至于怎么处理获取到的互联网资源,其实已经不在爬虫的知识范围之内了。我是一个做java开发的,所以自然也有用java来做爬虫的场景。Java爬虫,在开发人员的眼中,确实没有python爬虫那么耀眼,我们知道,python有专门的书籍讲爬虫,而java,想都不要想。不是说java爬虫不好实现,其实java爬虫也有非常强大的框架和社区,搜索引擎里面也可以获取到很多关于java爬虫的知识。Htmlunit是java中一个用来做爬虫的比较不好的选择,因为它对js支持不是很好,解析html页面也不强,同时对于爬虫应该有的一些广度优先爬取的策略都需要开发者自己实现。但是,正是这个没有界面的浏览器框架,我喜欢上了爬虫。
写爬虫应该注意的事情:如果你本身使用了一个比较好的爬虫框架,那么部分事情你不需要自己关心。
1、 爬虫整站爬取的策略。在爬取了一些资源网站后发现,网站的结构其实一张图,每个页面可以看做是一个节点,但是这个图不一定是一个全联通的图,也就是说我从某个节点出发,按照广度优先的策略进行爬取,不一定能够获取到整个网站的资源。所以广度优先爬取时的深度和爬取页面的个数设定不需要一次设置的很大,反而可以做跳跃,也就是,爬取到一定深度,随机换一个页面作为根节点从头。因为广度优先爬虫的页面个数是呈指数级上升的。在达到一定的深度和广度可以适当的对爬取的页面进行重新定义。
2、 将你的爬虫做成多线程模式后,如何确保爬取过的页面不会被重新爬取,造成爬虫资源的浪费。基于广度优先的爬虫,按照逐层爬取的策略可以有效避免这一点。
3、 对于页面不可达的情况是否需要做超时处理,如果线程池中有多个爬取线程都在超时等待页面响应,但是确实有大量页面不可达的情况,这样爬虫的效率会大打折扣。所以,在调用爬虫爬虫的时候最好设置获取页面的超时时间。
4、 代理ip池
5、 User-agent:这个可以写成一个字符串数组,每次请求随机获取其中一个。
6、 有些爬取界面还需要指定referer,需要自己进行分析。