【原创】开源爬虫Scrapy的学习及应用



开源爬虫Scrapy的学习及应用


作者:swb (360电商技术组)

 

 

一、 背景


目前我们正在使用的一套爬虫框架是使用java开发的一套复杂的分布式电商垂直爬虫,它主要优点是流程完善、可用性高、易部署。缺点是强定制化、维护成本略高、通用性不是很好。基于这套爬虫的缺点,小组内考虑是否可以开发一套通用性好,而且易扩展、部署和维护成本低的爬虫来提供给其他人员或者部门来使用。就这样当时开始研究Scrapy这套通过python实现的非常成熟的爬虫框架。

 


 

二、 Scrapy的简单介绍

Scrapy是一个使用Python写的Crawler Framework,简单轻巧,并且非常方便。它使用Twisted这个异步网络库来处理网络通讯,结构清晰,并且包含了各种中间件接口,可以灵活的完成各种需求。通过Zope.interface让Python支持了接口的开发方式。使用及开发者可以根据自己的实际需求自由的开发spider模块及各种中间件来完成对某类网站的定制化爬取,Scrapy在数据的序列化方面也提供了多种自己的实现,支持JSON、CSV、XML等。如果想存入数据库或者在做数据过滤后再存入自定义形式,可以通过“itempipeline”来进行定制化。

 


 

三、 Scrapy的大体框架

 

1. Scrapy Eninge

Scrapy引擎是用来控制整个系统的数据处理流程,并进行实物处理的触发。

 

2. Scheduler

调度程序从Scrapy引擎接受请求并排序列入队列,并在Scrapy引擎发出请求后返回给他们。

 

3. Downloader

下载器的主要职责是爬取网页并将网页内容返回给Spiders。

 

4. Spiders

Spiders是开发者自己定义用来解析页面并抓取定制url返回内容的类,每个spider都能处理一个域名或者一组域名。换句话说就是用来定义特定网站的抓取和解析规则。

 

5. ItemPipeline

项目管道的主要责任是负责处理有spider从网页中抽取的项目,它的主要任务是清理、验证和存储数据。当页面被spider解析后,将被送到itemPipeline,并经过几个特定的次序处理数据。每个itemPipeLine都是一个简单的方法组成的python类。他们获取了项目并执行他们的方法,通过他们还需要确定是否需要继续执行下一个itemPipeline或者直接丢弃掉。

 

6. Downloadermiddlewares

下载中间件是位于Scrapy引擎和下载器之间的模块,主要是处理Scrapy引擎与下载器之间的请求及相应。

7. Spidermiddlewares

Spider中间件是介于Scrapy引擎和spiders之间的模块,主要工作是处理spider的响应输入和请求输出。

 

8. Schedulermiddlewares

调度中间件是介于Scrapy引擎和调度之间的中间件,主要工作是从Scrapy发送调度的请求和相应。


 

 

四、 Scrapy的简单实用


上面已经大体介绍了Scrapy的整体结构,下面会简单举例来抓取一个某站页面“http://www.example.com/page.html”。

1. 创建爬虫项目

Scrapy startproject jdcategory

此命令会在你的开发目录下创建一个名为jdcategory的scrapy项目


2. 创建抽取的item类

和settings.py同目录下创建items.py,并写入如下代码


 


此items主要是用来存储解析下来的分类路径

 

3. 创建自定义的spider

在目录spiders下创建spider.py并写入如下代码

 

 

 

此spider一共有2个解析类,第一个解析类的任务为把从开始url对应的页面中符合条件的url重新返回Scrapy engine中,并通过返回值类型告诉engine在下载完后还需要执行spider中的parse2方法。第二个解析类的任务是把新url页面中的分类路径提取出来并保存在item中

 

4. 创建itemPipeline

在settings.py同级目录下创建pipelines.py类,并写入代码

 

 

 

此管道类主要完成对item的持久化操作,写入文件

 

5. 创建下载代理类

在settings.py下创建文件middlewares来保存中间件模块,在此文件夹下创建mymiddlewares.py写入代码

 

 

此模块主要给scrapy提供下载代理。

 

6. 配置settings配置文件

 

 

 

在配置文件里面规定请求的user agent,和下载中间件和item中间件,并配置每个中间件的执行顺序。

 

7. 执行爬虫命令

scrapy crawl dmoz

上面就是一个简单的爬虫用例,此用例已经可以完成对一个或者多个url的爬取工作,由此可见通过scrapy来完成一个定制爬虫是多么的简单。但是上面的例子只是完成了对静态页面的抽取工作,如果要完成多动态页面或者说页面内容是由js异步执行重新组装页面的抽取应该怎么做呢?

Scrapy 自己本身没有没办抽取js页面,他需要通过webkit的支持来做这种页面的抽取工作,下面就是一个通过scrapy配合webkit来完成对京东的活动页面的抽取方法,在此之前需要在机器上安装python-webkit及相关依赖、Xvfb(用户非Xwindow环境下创建window模拟进程)

 

在中间件目录下创建mydownloadermiddleware.py,并写入代码

 

 

 


此类是一个downloader下载中间件,通过启动webkit来加载url并执行url中间js,在js执行完后获得页面数据,交给scrapy引擎。

修改配置文件为


 

 

至此使用scrapy和webkit抓取js页面的简单用例也完成了。

 


 

五、 未来计划

上面已经简单举例了scrapy如何进行页面抓取和如果进行保存数据,通过这几个用例可以看出通过scrapy搭建一个爬虫还是很简单的,只要编写业务逻辑即可,爬虫的底层模块scrapy都已经为开发人员设计好了。那是否可以通过scrapy搭建一套平台化的爬虫系统呢?这个我想应该是可以的。所以我未来的日子里我会研究如果通过scrapy来做成这个平台化爬虫系统。

 



-------------------------------------------------------------------------------------

黑夜路人,一个关注开源技术、乐于学习、喜欢分享的程序员


博客:http://blog.csdn.net/heiyeshuwu

微博:http://weibo.com/heiyeluren

微信:heiyeluren2012  

想获取更多IT开源技术相关信息,欢迎关注微信!

微信二维码扫描快速关注本号码:




  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值