本系列:《手把手教你写网络爬虫(1):网易云音乐歌单》《手把手教你写网络爬虫(2):迷你爬虫架构》?上一期我们理性分析了为什么要学习Scrapy。不需要花钱!嗯?有人怎么扔西红柿?好吧,我承认我电视看多了。但是今天没有什么可读的。为了赶稿,又是一个不眠之夜。..言归正传,本期介绍一下Scrapy的基础知识。如果想深入研究,可以参考官方文档,以全面着称,就不占公众号的篇幅了。架构介绍下面是Scrapy的架构,包括组件和系统中发生的数据流的概述(用红色箭头表示)。之后会简单介绍一下各个组件,也会简单介绍一下数据流向。架构是这样的,流程和我第二篇介绍的mini架构差不多,但是扩展性非常强大。还有一点scrapystartprojecttutorial该命令会创建一个教程目录,内容如下:tutorial/scrapy.cfg#项目配置文件tutorial/#项目的python模块。然后你会在这里添加代码__init__.pyitems.py#项目pipelines.py中的item文件#项目中的pipelines文件settings.py#projectsettingfilespiders/#spider代码放置的目录__init__.py*第一个爬虫Spider是用户编写的一个类,用来爬取单个网站(或几个网站)的数据。它包含用于下载的初始URL、如何跟踪网页中的链接以及如何分析页面中的内容的方法。下面是我们的第一个Spider代码,保存在tutorial/spiders目录下的quotes_spider.py文件中:.com/page/1/','http://quotes.toscrape.com/page/2/',]forurlinurls:yieldscrapy.Request(url=url,callback=self.parse)defparse(self,response):page=response.url.split("/")[-2]filename='quotes-%s.html'%pagewithopen(filename,'wb')asf:f.write(response.body)self.log('Savedfile%s'%filename)运行我们的爬虫进入项目的根目录,执行以下命令启动爬虫:scrapycrawlquotes该命令启动爬虫爬取quotes.toscrape.com,你会得到类似的输出:2017-05-1020:36:17[scrapy.core.engine]INFO:Spideropened2017-05-1020:36:17[scrapy.extensions.logstats]INFO:Crawled0pages(at0pages/min),scraped0items(at0items/min)2017-05-1020:36:17[scrapy.extensions.telnet]调试:Telnet控制台监听127.0.0.1:60232017-05-1020:36:17[scrapy.core.engine]调试:抓取(404)(referer:None)2017-05-1020:36:17[sscrapy.core.engine]DEBUG:Crawled(200)(referer:None)2017-05-1020:36:17[scrapy.core.engine]DEBUG:抓取(200)(referer:None)2017-05-1020:36:17[quotes]DEBUG:Savedfilequotes-1.html2017-05-1020:36:17[quotes]DEBUG:Savedfilequotes-2.html2017-05-1020:36:17[scrapy.core.engine]INFO:Closingspider(finished)提取数据我们之前只是保存了HTML页面,并没有提取数据现在升级看代码,加入提取功能。至于如何使用浏览器的开发者模式来分析网页,之前已经介绍过了。importscrapyclassQuotesSpider(scrapy.Spider):name="quotes"start_urls=['http://quotes.toscrape.com/page/1/','http://quotes.toscrape.com/page/2/',]defparse(self,response):forquoteinresponse.css('div.quote'):yield{'text':quote.css('span.text::text').extract_first(),'author':quote.css('small.author::text').extract_first(),'tags':quote.css('div.tagsa.tag::text').extract(),}再次运行爬虫,你会在日志中看到到提取的数据:2017-05-1020:38:33[scrapy.core.scraper]DEBUG:Scrapedfrom<200http://quotes.toscrape.com/page/1/>{'tags':['life','love'],'author':'AndréGide','text':'"Itisbettertobehatedforwhatyouarethantobelovedforwhatyouare."'}2017-05-1020:38:33[scrapy.core.scraper]DEBUG:Scrapedfrom<200http://quotes.toscrape.com/page/1/>{'tags':['edison','failure','inspirational','paraphrased'],'author':'ThomasA.Edison','text':""我没有失败。我刚刚发现10,000种方法都行不通。""}保存抓取的数据存储抓取的数据最简单的方法是使用Feedexports:scrapycrawlquotes-oquotes.json该命令会将爬取到的数据序列化为JSON格式,生成quotes.json文件。在像本教程这样的小型项目中,这种存储方式就足够了。如果需要对爬取的item做更复杂的操作,可以写ItemPipeline,tutorial/pipelines.py一开始就自动创建好了。