您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 其它行业文档 > Scrapy入门教程
Scrapy入门教程一、了解ScrapyScrapy是一套基于Twisted的异步处理框架,是纯python实现的爬虫框架,是一个为了爬取网站数据,提取结构性数据而编写的应用框架。可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。当我们面对如下的环境时,Twisted通常是一个好的选择:1.程序中有许多任务,而且…2.任务之间高度独立(因此它们不需要互相通信,或者等待彼此)而且…3.在等待事件到来时,某些任务会阻塞。二、框架Scrapy的大体架构,其中包含了scheduler、itempipeline、downloader、spider以及engine这几个组件模块一、组件说明:ScrapyEngine(Scrapy引擎)Scrapy引擎是用来控制整个系统的数据处理流程,并进行事务处理的触发。更多的详细内容可以看下面的数据处理流程。Scheduler(调度)调度程序从Scrapy引擎接受请求并排序列入队列,并在Scrapy引擎发出请求后返还给他们。Downloader(下载器)下载器的主要职责是抓取网页并将网页内容返还给蜘蛛(Spiders)。Spiders(蜘蛛)蜘蛛是有Scrapy用户自己定义用来解析网页并抓取制定URL返回的内容的类,每个蜘蛛都能处理一个域名或一组域名。换句话说就是用来定义特定网站的抓取和解析规则。蜘蛛的整个抓取流程:首先获取第一个URL的初始请求,当请求返回后调取一个回调函数。在回调函数中,你可以解析网页响应并返回项目对象和请求对象或两者的迭代。在回调函数中,你解析网站的内容,并生成解析的数据项。最后,从蜘蛛返回的项目通常会进驻到项目管道。ItemPipeline(项目管道)项目管道的主要责任是负责处理有蜘蛛从网页中抽取的项目,他的主要任务是清晰、验证和存储数据。项目管道通常执行的过程有:清洗HTML数据验证解析到的数据(检查项目是否包含必要的字段)检查是否是重复数据(如果重复就删除)将解析到的数据存储到数据库中二、数据处理流程Scrapy的整个数据处理流程由Scrapy引擎进行控制,其主要的运行方式为:1.引擎打开一个域名,时蜘蛛处理这个域名,并让蜘蛛获取第一个爬取的URL。2.引擎从蜘蛛那获取第一个需要爬取的URL,然后作为请求在调度中进行调度。3.引擎从调度那获取接下来进行爬取的页面。4.调度将下一个爬取的URL返回给引擎,引擎将他们通过下载中间件发送到下载器。5.当网页被下载器下载完成以后,响应内容通过下载中间件被发送到引擎。6.引擎收到下载器的响应并将它通过蜘蛛中间件发送到蜘蛛进行处理。7.蜘蛛处理响应并返回爬取到的项目,然后给引擎发送新的请求。8.引擎将抓取到的项目项目管道,并向调度发送请求。9.系统重复第二部后面的操作,直到调度中没有请求,然后断开引擎与域之间的联系。三、安装指南安装检查1.Python2.72.PythonPackage:pipandsetuptools.现在pip依赖setuptools,如果未安装,则会自动安装setuptools。3.lxml.大多数Linux发行版自带了lxml。如果缺失,请查看除了Windows(请查看平台安装指南)之外的系统都已经提供。四、开发流程新建项目(Project):新建一个新的爬虫项目明确目标(Item):定义提取的Item制作爬虫(Spider):编写爬取网站的spider并提取Item存储内容(Pipeline):编写ItemPipeline来存储提取到的Item(即数据)1.新建项目(Project)在任意目录下按住Shift键右击,选择“在此处打开命令窗口”,输入一下命令:scrapystartprojectsjzxetl将会创建一个sjzxetl文件夹,目录结构如下:各个文件的作用:scrapy.cfg:项目的配置文件sjzxetl/:项目的Python模块,将会从这里引用代码sjzxetl/items.py:项目的items文件sjzxetl/pipelines.py:项目的pipelines文件sjzxetl/settings.py:项目的设置文件sjzxetl/spiders/:存储爬虫的目录2.定义ItemItem是保存爬取到的数据的容器;提供了额外保护机制来避免拼写错误导致的未定义字段错误。您可以通过创建一个scrapy.Item类,并且定义类型为scrapy.Field的类属性来定义一个Item。classSjzxetlItem(scrapy.Item):title=scrapy.Field()link=scrapy.Field()desc=scrapy.Field()3.编写爬虫(Spider)为了创建一个Spider,您必须继承scrapy.Spider类,且定义以下三个属性:name:用于区别Spider。该名字必须是唯一的,您不可以为不同的Spider设定相同的名字。start_urls:包含了Spider在启动时进行爬取的url列表。因此,第一个被获取到的页面将是其中之一。后续的URL则从初始的URL获取到的数据中提取。parse()是spider的一个方法。被调用时,每个初始URL完成下载后生成的Response对象将会作为唯一的参数传递给该函数。该方法负责解析返回的数据(responsedata),提取数据(生成item)以及生成需要进一步处理的URL的Request对象。importscrapyclassDmozSpider(scrapy.spiders.Spider):name=dmozallowed_domains=[dmoz.org]start_urls=[://]defparse(self,response):filename=response.url.split(/)[-2]withopen(filename,'wb')asf:f.write(response.body)Scrapy为Spider的start_urls属性中的每个URL创建了scrapy.Request对象,并将parse方法作为回调函数(callback)赋值给了Request。Request对象经过调度,执行生成scrapy.http.Response对象并送回给spiderparse()方法。4.提取ItemScrapy使用了一种基于XPath和CSS表达式机制:ScrapySelectors。fromsjzxetl.itemsimportSjzxetlItemdefparse(self,response):forselinresponse.xpath('//ul/li'):item=SjzxetlItem()item['title']=sel.xpath('a/text()').extract()item['link']=sel.xpath('a/@href').extract()item['desc']=sel.xpath('text()').extract()yielditemSelector有四个基本的方法(点击相应的方法可以看到详细的API文档):xpath():传入xpath表达式,返回该表达式所对应的所有节点的selectorlist列表。css():传入CSS表达式,返回该表达式所对应的所有节点的selectorlist列表.extract():序列化该节点为unicode字符串并返回list。re():根据传入的正则表达式对数据进行提取,返回unicode字符串list列表。5.爬取进入项目的根目录,执行下列命令启动spider:scrapycrawldmoz6.使用itemItem对象是自定义的python字典。您可以使用标准的字典语法来获取到其每个字段的值。(字段即是我们之前用Field赋值的属性)7.保存数据当Item在Spider中被收集之后,它将会被传递到ItemPipeline,一些组件会按照一定的顺序执行对Item的处理。每个itempipeline组件(有时称之为“ItemPipeline”)是实现了简单方法的Python类。他们接收到Item并通过它执行一些行为,同时也决定此Item是否继续通过pipeline,或是被丢弃而不再进行处理。以下是itempipeline的一些典型应用:清理HTML数据验证爬取的数据(检查item包含某些字段)查重(并丢弃)将爬取结果保存到数据库中每个itempipeline组件都需要调用process_item方法,这个方法必须返回一个Item(或任何继承类)对象,或是抛出DropItem异常,被丢弃的item将不会被之后的pipeline组件所处理。process_item(self,item,spider)8.启用ItemPipeline组件为了启用一个ItemPipeline组件,你必须将它的类添加到ITEM_PIPELINES配置,就像下面这个例子:settings.set(ITEM_PIPELINES,{'sjzxetl.pipelines.YgPipeline':100})9.爬取使用proces.crawl来调用spider。可自定义settingfromsjzxetl.spiders.yg.yun_to_rawimportyun_to_rawprocess.crawl(yun_to_raw)process.start()五、参考资料:://scrapy-chs.readthedocs.io/zh_CN/latest/
本文标题:Scrapy入门教程
链接地址:https://www.777doc.com/doc-4473972 .html