开发爬虫一般有两种常用的方案,一种是使用HTTP直接访问网站获取页面信息,另一种是使用模拟浏览器获取页面信息。两种方案各有利弊。例如:直接使用HTTP访问速度快,不会下载无用的JS数据和CSS数据,或者图片数据,内存使用量小,服务器的要求非常低;后者通常会加载完整的页面,虽然可以设置不加载图片,但是现在大型网站的一个页面的JS和CSS资源轻轻松松就超过10个文件以上。因此在速度和资源消耗上完全无法和前者相比。然而,前者也有非常明显的短板,对于反爬取非常复杂的网站,基本上都是通过JS实现的,例如动态令牌等。并且生成动态令牌的算法也是JS混淆加密,并且创建动态令牌的过程中也涉及到对称加密或者非对称加密等。这种情况下,想要模拟创建动态令牌并使用HTTP直接访问页面耗时耗力,花了很长时间破解了加密算法以后,页面端随便改个算法,这个破解过程要重来一遍,耗时耗力。这种情况下,使用模拟浏览器创建爬虫的方式相对就高效很多。
3种浏览器爬虫方案对比
一般来说,创建浏览器爬虫一般使用Selenium,配合WebDriver和浏览器Firefox或者Chrome。除此之外,还有两种不太常用的方式。下面我们分别看看3种浏览器爬虫的优点和缺点。
Selenium爬虫
Selenium爬虫是最常用的类浏览器爬虫,历史悠久且网上有非常多的文档。Selenium本身不是爬虫,它需要搭配Webdriver和对应的浏览器才能工作。Webdriver和浏览器类型和版本号是一一对应的。当前Selenium支持多种浏览器,配置方便且实现灵活。由于支持浏览器的无头模式,因此可以在命令行执行,不需要图形化界面。但是该类型的反爬措施也非常多。通常情况下Selenium搭配webdriver时会在页面中增加自定义变量,因此通常会在页面中内置一些JS探测算法针对Selenium进行防护。
浏览器插件爬虫
浏览器插件爬虫就是通过使用浏览器插件,爬取在浏览器中显示的内容,通过这种方式可以规避Selenium的反爬取问题。但是不能避免的就是会消耗大量带宽资源下载JS,CSS和图片等。另外,浏览器插件由于安全问题,对于本地操作的权限有很多限制。虽然这个问题不算很大,如果要做大量的数据爬取,大部分情况是使用分布式集群,爬取指令和爬取结果通常通过网络保存。浏览器插件爬虫最大的问题可能就是需要开着浏览器爬取。因此,在Linux这类云服务器上,相对比较难批量应用。
另外一个问题就是使用浏览器插件比较难实现混合型分布式爬虫系统。例如,一个大型爬虫系统包括Kafka,Redis,MySQL,MongoDB等。浏览器爬虫一般只支持浏览器JS库。如果想要直接连接Kafka,Redis或者MySQL等,都需要通过API调用的形式,因此在实现方式到工作量上都会复杂很多。
Electron爬虫
Electron爬虫实现爬取数据的机理和浏览器爬虫类似。相比浏览器插件爬虫,优势在于它是原生应用,拥有的权限会比浏览器插件爬虫多很多。并且可以借助Node.js的强大JS库支持,可以无缝对接Kafka,Redis,MySQL,和MongoDB等第三方系统。但是由于它是原生应用,所以缺点也是显而易见的,就是尺寸特别大,启动需要的系统资源也比浏览器插件多很多。
爬虫方案优缺点总结
下面我们简单列一下各种爬虫方案的优缺点:
HTTP/HTTPS爬虫
使用URLLIB或者Requests实现。
- 优点:Python开发简单
- 优点:工作高效
- 优点:容易部署
- 缺点:不支持动态JS页面
- 缺点:容易防御
Selenium爬虫
使用Selenium,Webdriver,Chrome/Firefox等浏览器配合实现。
- 优点:Python开发简单
- 优点:容易部署
- 优点:支持动态JS页面
- 缺点:工作低效,耗带宽,内存等资源
- 缺点:容易防御
浏览器爬虫
使用Chrome/Firefox等浏览器配合实现。
- 优点:JS开发简单
- 优点:不易防御
- 优点:支持动态JS页面
- 缺点:不易部署,需要用户界面安装,无法支持Kafka,Redis等
- 缺点:工作低效,耗带宽,内存等资源
Electron爬虫
使用Node.js开发。
- 优点:JS开发简单
- 优点:不易防御
- 优点:支持动态JS页面
- 缺点:不易部署,需要用户界面安装
- 缺点:工作低效,耗带宽,内存等资源
最终选择哪一种方案还是要看具体需求的,大家可以结合各方案的优劣和特点,基于当前的条件选择最适合自己的选项。

扫码联系船长