阿布云

你所需要的,不仅仅是一个好用的代理。

关于JAVA爬虫的一些问题(一)

阿布云 发表于

7(2).png

把JAVA爬虫单独分为一类来讲,是因为JAVA在网络爬虫这块的生态圈是非常完善的。相关的资料也是最全的。
其实开源网络爬虫(框架)的开发还是非常简单的,困难的问题和复杂的问题都被前人给解决了(比如DOM树解析和定位、字符集检测、海量URL去重等等),包括Nutch也是一样的。其实Nutch的技术难点是开发hadoop,本身代码非常简单。网络爬虫从某种意义来说,就是通过遍历本机的文件,查找文件中用户所需要的信息,构建这个框架还是比较简单的。比如爬虫的URL管理、线程池之类的模块,谁都可以做的,但是要做稳定也是需要一段时间的调试和修改的。
那么用户会比较关注爬虫的哪些相关的问题呢?
1)爬虫支持多线程么?爬虫能用代理么?爬虫会爬取重复数据么?爬虫能爬取JS生成的信息么?回答是:不支持多线程、不支持代理、不能过滤重复URL的,那都不叫开源爬虫,那叫循环执行http请求。
能不能爬js生成的信息和爬虫本身没有太大关系。爬虫主要是负责遍历网站和下载页面。爬js生成的信息和网页信息抽取的模块有关,往往需要通过模拟浏览器(htmlunit,selenium)来完成。这些模拟浏览器,通常需要耗费很多的时间来处理一个页面。因此有一种策略就是,使用这些爬虫来遍历网站,遇到需要解析的页面,就将网页的相关信息提交给模拟浏览器,来完成JS生成信息的抽取。
2)爬虫可以爬取ajax信息么?网页上有一些异步加载的数据,爬取这些数据有两种方法:使用模拟浏览器,或者分析ajax的http请求,自己生成ajax请求的url,获取返回的数据。如果是自己生成ajax请求,使用开源爬虫的意义在哪里?其实是要用开源爬虫的线程池和URL管理功能(比如断点爬取)。
如果我已经可以生成我所需要的ajax请求(列表),如何用这些爬虫来对这些请求进行爬取?爬虫往往都是设计成广度遍历或者深度遍历的模式,去遍历静态或者动态页面。爬取ajax信息属于deep web(深网)的范畴,虽然大多数爬虫都不直接支持。但是也可以通过一些方法来完成。比如WebCollector使用广度遍历来遍历网站。爬虫的第一轮爬取就是爬取种子集合(seeds)中的所有url。简单来说,就是将生成的ajax请求作为种子,放入爬虫。用爬虫对这些种子,进行深度为1的广度遍历(默认就是广度遍历)。
3)爬虫怎么爬取要登陆的网站?这些开源爬虫都支持在爬取时指定cookies,模拟登陆主要是靠cookies。至于cookies怎么获取,不是爬虫管的事情。你可以手动获取、用http请求模拟登陆或者用模拟浏览器自动登陆获取cookie。