基于Scrapy和casperjs的电子商务网站信息采集系统研究*

中图分类号:TN915 文献标识码:A 文章编号:1007-9416(2015)03-0000-00

随着“互联网+”时代的到来,电子商务也进入了一个新的发展时期,2014年电子商务的交易额超过了12万亿元,电子商务的飞速发展产生了大量的交易数据,这些数据可以在许多领域产生惊人的价值。相关数据已经成为一种重要的生产资料,越来越多的人认识到电子商务产生的数据的价值,并且在许多领域进行了应用。目前比较成功的应用已经有许多,例如推荐系统[1,2]利用采集到的用户历史访问行为预测和推荐其可能感兴趣的其他商品;浙江利用中关村电子产品的成交价格制作电子指数来监测政府采购中协议供货产品的价格[3];利用阿里巴巴网站原材料的成交情况数据可以对区域经济做出预警;抓取淘宝的商品的价格信息,根据同类产品成交的平均价格可以帮助用户判断假货等。目前国内已经有大量的公司和个人从事互联网数据的采集和处理。通过从电子商务网站采集到的数据,用户可以进行数据分析,对于互联网公司来说,这是非常重要的。例如:利用采集到的数据作分析,可以对消费者进行细分以便进行精准化营销;利用CRM来管理消费者的整个生命周期,以此提高消费者的忠诚度,避免消费者的流失;利用电商数据的分析来发现现有经营模式的不足,以作改进,从而让顾客有更好的购物体验;利用消费者的购买数据,挖掘消费者的潜在需求,提供销售,扩大影响力等等。总之,采集到的电商数据可以帮助用户实现数据化运营。虽然,已经进入了大数据时代,但是目前数据的流通是比较困难的,数据大多掌握在一些大的互联网公司手中。因为数据已经变成一种生产资料,已经进入了数据为王的时代,大量的中小用户无法拿到自己需求的数据,这也影响到了互联网技术的进一步发展,因此开发一种中小用户能够方便使用、易于扩展、性能优异的电子商务网站信息采集系统就显得非常重要了。

1 Web信息采集技术的现状

Web信息采集一般使用爬虫技术来实现,目前常用的爬虫有三类:分布式爬虫Apache Nutch和Heritrix;使用Java语言开发的爬虫Crawler4j、WebCollector、WebMagic等;非Java语言爬虫Scrapy[4]、curl、火车头、MetaSeeker等。Nutch和Heritrix虽然功能强大,但是由于这两种爬虫主要是针对搜索引擎的功能而设计的,很多功能普通用户用不上,而且想要针对电商网站交易数据进行精细化信息采集比较困难,使用复杂,应用难度大。Crawler4j等爬虫框架功能比较简单,用户需要自行添加许多代码才能完成实际的采集。而火车头和MetaSeeker等软件使用正则表达式进行信息抽取,可维护性差,灵活性与可扩展性也不好,并且支持集群的商业版价格比较高,普通用户无法承受。

如果爬虫是用于大规模的网站信息抽取,那么爬虫的效率、可扩展性和可维护性等是必须考虑的核心因素。大规模爬虫涉及到很多问题:多线程的并发调度问题、异步I/O机制、集群爬取、爬虫之间的消息通讯、判断重复的机制、核心任务调度等,此时爬虫开发使用的语言和所选用的框架就具有重大的意义了。由于pHp语言对多线程和异步I/O的支持不好,所以不建议使用这种语言进行开发。当对一些垂直网站进行爬取的时候可以使用Nodejs,但由于Nodejs在分布式爬取、底层的消息通讯等方面的支持较弱,不太适合做大规模爬虫的框架。

另一方面,大量电商网站为了保证企业内数据闭环,往往采用了反爬取技术,例如使用图片代替文本来显示价格信息等,同时多采用Ajax技术来异步传输数据,这就大大增加了电商网站交易信息采集的困难。此外,还有对爬虫爬取的速率的限制等问题,如果爬取速度过高,就有可能被禁止访问。为了解决这些问题,必须采用多种技术手段突破电商网站的种种限制,实现精细化信息采集的目的。而随着电子商务的迅速发展,每天海量交易产生的数据量也非常惊人,因此,还要求爬虫使用的框架必须易于扩展,信息采集的复杂度要低。

2 基于Scrapy和casperjs的框架设计

系统使用的整体框架如图1所示。

本文使用基于Scrapy和casperjs的框架设计了一个采集效率高,可扩展性强,基于云计算平台,能够完全适应国内电子商务网站信息采集任务的爬虫系统,并且已经成功用于阿里巴巴、淘宝、京东等国内电商网站以及越南、马来西亚、菲律宾等东南亚国家的电商网站数据抓取。

Scrapy是使用python开发的一个速度快、效率高的web和屏幕数据抓取的框架,多用于抓取web站点并从结构复杂的Web页面中提取出结构化的数据。Scrapy的用途非常广泛,可以用于自动化测试、监测、数据挖掘等任务。Scrapy 的底层是基于Twisted网络引擎,用户只需要开发其中的几个模块就可以实现一个功能相当复杂的web爬虫,可以用来进行网页信息抽取和抓取网站上的图片等。使用Scrapy的优势是开发相对简单,信息抽取以后还可以利用python丰富的第三方库进行后续数据处理和展示。

Scrapy是使用python语言开发的,python是一种动态语言,为了提高Scrapy 爬虫的执行效率,可以使用pypy库进行速度优化,优化以后程序的执行时间缩短为原先的25%-30%,这样就大大提高了基于Scrapy的网络爬虫的执行效率。如果电商网站需要登录以后才能访问,可以使用FormRequest实现用户登录或者调用casperjs实现后台自动登录和交互的功能。对于许多需要输入验证码才能采集的数据,可以使用Scrapy丰富的第三方验证码自动识别模块,可以实现大多数电商网站的自动登录。 如果电商网站的页面内容是由JavaScript或者Ajax动态生成的(例如淘宝、天猫),用普通的先请求页面再进行解析的方法就失效了,往往只能解析出当前页面获取的数据,后续数据由于Ajax异步加载的原因,会出现大量的空数据。此外,天猫和淘宝的许多商品在同一页面因为不同的款式提供了多种选择,详情页面的价格显示是利用JavaScript动态执行来显示的,这些价格需要通过点击才能采集到正确的价格信息,无法通过普通的获取页面信息然后通过正则表达式、CSS选择器或者利用Xpath的方式获取到所需要的信息。为了解决这类问题需要借助一个类似Firefox和谷歌Chrome浏览器的JavaScript解析引擎来动态解析页面上的JavaScript代码。在这种情况下,我们使用casperjs和phantomjs组合来解决异步数据加载和抓取的问题。phantomjs是一个服务器端基于 WebKit的JavaScript ApI。它不需要普通浏览器就可以全面支持HTML协议,而且速度快,原生支持各种标准,例如:DOM处理、JSON、CSS选择器、SVG以及Canvas。在信息采集的时候可以通过phantomjs来进行JavaScript的渲染,这样就可以采集到淘宝、天猫等采用异步数据加载的电商网站的数据,同时根据情况还可以修改配置,使得phantomjs不采集图片。为了提高采集效率和采集系统安全性,casperjs不能访问本地存储和数据库,而是采用http服务负责数据中转。phantomjs自带的web服务器性能非常有限,1.x版本只支持10个连接,远远满足不了数据采集的需求,因此必须自行实现一个http服务。本文系统所用的http服务,是利用基于python语言的django MVC框架实现的,开发简单,框架复杂度适中,正好适合作为数据中转使用。整个url的分发流程如图2所示。

为了解决这类问题需要借助一个类似Firefox和谷歌Chrome浏览器的JavaScript解析引擎来动态解析页面上的JavaScript代码。在这种情况下,我们使用casperjs和phantomjs组合来解决异步数据加载和抓取的问题。

由于电商网站数据量巨大,为了有效采集信息,我们用redis实现集群采集,redis中存储了爬虫的请求、状态和统计等信息,能够对分布在云平台各个节点上的爬虫实现集中式的管理,而且结合使用pypy优化python的执行效率,解决了爬虫的性能瓶颈问题,再加上redis的高效率和易于扩展的特点来实现高效下载。如果redis存储或者访问速度过慢的时候,我们可以增大redis集群的数量和爬虫节点的数量进行改善。对于底层用于存储的数据库系统,我们使用了mongodb集群。

为了解决爬虫可能被电商网站封禁的问题,我们在系统中设计了账号代理模块。爬虫在进行分布式抓取的时候,可以自动验证并使用互联网上的免费代理,避免了单一Ip请求量过大带来的被封的风险。系统还实现了一个基于Scrapy的下载中间件,通过不停的变换user-agent来规避风险。用户可以有针对性的设计和使用反监控策略,针对不同的电商网站使用不同规则。此外还引入了随机抓取时间间隔,模拟用户浏览等仿生策略,最大程度上接近真实用户的页面访问方式,一方面降低了对目标电商网站的服务器负载的影响,另一方面也降低了爬虫被禁用的风险。系统使用了智能访问速度动态控制技术,跟据网络探针返回的网络延迟,分析出Scrapy节点和被访问网站的响应速度,根据这个时间差来动态改变发起请求的时间间隔,以防速度不匹配带来的数据丢失的可能。系统还可配置最大并行请求的个数,每个域名的最大并行请求个数和系统进行并行处理的items的个数。系统实现了一个针对爬虫集群的状态收集器,并将各个节点的实时信息,用graphite以动态图表的形式进行实时显示,一旦某个节点出现异常可以在图上显示出来。

3 结语

本文设计并实现了一个基于Scrapy和casperjs的面向电子商务网站的Web信息采集系统,该系统具有可扩展性好、易于使用、适用范围广等特点,通过使用pypy库大大增强了python程序的执行效率,同时redis和mongodb的引入使得爬虫可以比较容易的部署在云平台上。本系统在实际中运行表现良好,已实现了阿里巴巴价格数据、淘宝、京东等国内电商网站和东南亚国家电商网站交易数据的采集,并且利用这些数据建设了广西财经数据中心的网络电商数据库。