文章目录
Scrapy框架介绍
- Scrapy是Python开发的一个快速、高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。Scrapy用途广泛,可以用于数据挖掘、监测和自动化测试。
- Scrapy吸引人的地方在于它是一个框架,任何人都可以根据需求方便的修改。它也提供了多种类型爬虫的基类,如BaseSpider、sitemap爬虫等,最新版本又提供了web2.0爬虫的支持。
[来自百度百科]
Scrapy架构及运行流程
五个功能模块
- 引擎(Scrapy Engine): 用来处理整个系统的数据流处理, 数据流的指挥官,负责控制数据流,控制各个模块之间的通信
- 调度器(Scheduler): 负责引擎发过来的请求URL,入队行成一个URL的优先队列, 由它来决定下一个要抓取的网址是什么, 同时去除重复的网址
- 下载器(Downloader): 用于下载网页内容, 并将网页内容返回给引擎Scrapy
- 爬虫(Spiders): 爬虫是主要干活的, 用于从特定的网页中提取自己需要的信息, 即Item。用户也可以从中提取出链接,让Scrapy继续抓取下一个页面
- 项目管道(item Pipeline): 负责处理爬虫从网页中抽取的实体,主要的功能是处理或加工来自item的数据。
三大中间件
- 下载器中间件(Downloader Middlewares): 位于Scrapy引擎和下载器之间的框架,主要是处理Scrapy引擎与下载器之间的请求及响应。
- 爬虫中间件(Spider Middlewares): 介于Scrapy引擎和爬虫之间的框架,主要工作是处理蜘蛛的响应输入和请求输出。
- 调度中间件(Scheduler Middewares): 介于Scrapy引擎和调度之间的中间件,从Scrapy引擎发送到调度的请求和响应。
Scrapy整体架构:
Scrapy运行流程:
- ①:scheduler从待下载队列中获取url
- ②:scheduler调用spider来爬取网页
- ③:downloader将网页下载之后传给spider
- ④:提取目标数据,抽取出目标对象(item)交给实体管道(item pipeline)进行在加工
- ⑤:将提取出来的url放入request队列中
Scrapy爬虫项目创建
-
在命令行中cd进入项目存储的路径
如,将项目存在D:/Pycharm下
D: cd D:/pycharm
-
使用‘scrapy startproject项目名’创建新项目
如创建myscrapy
scrapy startproject myscrapy
-
利用python编辑器打开该项目
如,用pycharm打开myscrapy
Scrapy项目目录结构
创建好的Scrapy项目如下
- 1:项目
- 2:项目核心目录,用来放置爬虫相关文件
- 3:项目配置文件
- 1:项目初始化文件,里面是项目的初始化信息
- 2:项目数据容器文件,用来定义我们需要获取的数据
- 3:项目管道文件,对item中数据进行再加工
- 4:项目设置文件
Scrapy项目 item
item常用结构化数据来保存一些爬取到关键信息
结构化数据:用于保存爬取到的一些关键数据,如网址,关键词等;
#定义结构化数据
数据名=scrapy.Field()
#如定义网站url
url=scrapy.Field()
Scrapy项目 spider
Spider
scrapy.spiders.spider是用于我们自定义爬取所需数据的类。
创建spider需继承scrapy.Spider类,同时需要定义三个属性:
- name:spider的名字,不能重复
- start_urls:初始URL列表。当没有制定特定的URL时,spider将从该列表中开始进行爬取。
- parse(self,response):当请求url返回网页没有指定回调函数时,默认下载回调方法。
该函数负责解析下载后的网页,并生成下一个的URL;每次下载URL完后都需要调用该函数
可选属性:
- allowed_domains:包含了spider允许爬取的域名(domain)列表
- start_requests()
当spider启动爬取并且未指定start_urls时,该方法被调用。
CrawlSpider
scrapy.spiders.CrawlSpider比scrapy.spiders.spider复杂一点的spider,在CrawlSpider中定义了一些rule用于跟进link,所以CrawlSpider比spider多一个基本属性:
- rule:包含一个(或多个) 规则对象的列表。 每个Rule对爬取网站的动作定义了特定操作。 如果多个rule匹配了相同的链接,则根据规则在列表中被定义的顺序,第一个会被使用。
Rule(link_extractor, callback=None, cb_kwargs=None, follow=None, process_links=None, process_request=None)
- rule定义函数
- link_extractor:其定义了如何从爬取到的页面中提取链接。
- callback:指定spider中哪个函数将会被调用。 从link_extractor中每获取到链接时将会调用该函数。该回调函数接受一个response作为其第一个参数(不能指定parse为callback,否则会报错)
- cb_kwargs:包含传递给回调函数的参数(keyword argument)的字典。
- follow:是一个布尔(boolean)值,指定了根据该规则从response提取的链接是否需要跟进。 如果callback为None,follow默认设置为True ,否则默认为False。
- process_links:指定该spider中哪个的函数将会被调用,从link_extractor中获取到链接列表时将会调用该函数。该方法常用于过滤参数
- process_request:指定该spider中哪个的函数将会被调用,该规则提取到每个request时都会调用该函数 (用来过滤request)
Scrapy项目 selector
selector常用于提取item,selector中内置XPath和CSS Selector表达式机制。
selector有四个基本方法:
- xpath():传入xpath表达式,以列表返回所有满足条件的节点
- css():传入css表达式,以列表返回所有满足条件的节点
- extract():序列化该节点,将其转换为unicode的字符串并以list形式返回
- re():传入正则表达式,以unicode字符串的list形式返回
Scrapy项目 item pipeline
spider在获取到item之后会将其传到item pipeline,在item pipeline中可以定义一些对item的操作,如对数据查重,保存数据或检验数据
item pipeline组件是一个独立的python类,定义时需实现process_item方法,spider获取到item之后调用该方法
process_item(self,item,spider)
- item:爬取到的结构化数据
- spider:爬取该item的spider