Scrapy,Python开发的一个快速,高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。Scrapy用途广泛,可以用于数据挖掘、监测和自动化测试。
Scrapy吸引人的地方在于它是一个框架,任何人都可以根据需求方便的修改。它也提供了多种类型爬虫的基类,如BaseSpider、sitemap爬虫等,最新版本又提供了web2.0爬虫的支持。
如何下载scrapy
可以通过pip,conda或者github以及官网上下载。
pip install scrapy
或者
conda install scrapy
推荐使用国内的镜像源下载,否则会极其慢,而且经常会超时(说多了都是泪、、、)
如何新建一个scrapy项目
在Pycharm新建中有很多项目可以选择,例如flask,Django等,就是没有scrapy。所以scrapy的创建需要我们手动才可以。
我们可以通过命令行进入到需要建立项目的路径下,然后通过
scrapy startproject 项目名
即可创建一个scrapy项目。
上图即为一个基本scrapy项目的构成。
Scrapy的架构
- Scrapy Engine
引擎负责控制数据流在系统中所有组件中流动,并在相应动作发生时触发事件。 详细内容查看下面的数据流(Data Flow)部分。- 调度器(Scheduler)
调度器从引擎接受request并将他们入队,以便之后引擎请求他们时提供给引擎。- 下载器(Downloader)
下载器负责获取页面数据并提供给引擎,而后提供给spider。- Spiders
Spider是Scrapy用户编写用于分析response并提取item(即获取到的item)或额外跟进的URL的类。 每个spider负责处理一个特定(或一些)网站。- Item Pipeline
Item Pipeline负责处理被spider提取出来的item。典型的处理有清理、 验证及持久化(例如存取到数据库中)。- 下载器中间件(Downloader middlewares)
下载器中间件是在引擎及下载器之间的特定钩子(specific hook),处理Downloader传递给引擎的response。 其提供了一个简便的机制,通过插入自定义代码来扩展Scrapy功能。- Spider中间件(Spider middlewares)
Spider中间件是在引擎及Spider之间的特定钩子(specific hook),处理spider的输入(response)和输出(items及requests)。 其提供了一个简便的机制,通过插入自定义代码来扩展Scrapy功能
一个最基本的爬虫会按照着途中绿色线的顺讯执行。其中的中间件更利于个人对爬虫的自定义和扩展,pipeline则是定义scrapy如何对爬取下来的数据进行处理。具体的流程如下:
- 引擎打开一个网站,找到处理该网站的Spider并向该Spider请求第一个要爬取的URL。
- 引擎从Spider中获取需要处理的URL并在schedule中进行Request调度
- 引擎向schedule请求一个需要进行Request处理的URL
- schedule通过下载器中间件将URL发送至下载器对需要爬去的URL进行下载
- 一旦URL的内容下载完成,会通过下载器中间件返回一个response到引擎中
- 引擎将收到的response返回到Spider中进行处理
- Spider处理完response后会返回一个item数据字典和新的request给引擎。
- 引擎接受到返回的item发送到pipeline中进行数据的处理(插入到数据库、处理成CSV或json文件、将多媒体文件保存到本地)
- 重复第二步直到没有可以处理的request