Scrapy框架学习(二)Scrapy入门
接下来以爬取quote.toscrape.com为例完成一遍Scrapy的抓取流程。
首先创建一个Scrapy项目。打开命令行,输入以下命令:
scrapy startproject projectname
即可在当前位置创建一个Scrapy项目。我们创建一个名为tutorial的项目:
scrapy startproject tutorial
可以看到当前位置出现了一个名为tutorial的文件夹,这代表着项目已经创建完毕。
接下来我们需要创建一个Spider。Spider负责从网页中抓取内容并返回解析结果。创建Spider需继承scrapy.Spider类在命令行中输入:
cd tutorial
scrapy genspider quotes quotes.toscrape.com
以上命令建立了一个名为QuotesSpider的Spider,可以在项目文件夹找到。
接下来我们需要定义Item。Item是保存数据的容器。创建Item需要继承scrapy.Item类,并且定义类型为scrapy.Field的字段。打开浏览器开发者工具,我们观察到我们将爬取的内容有text、author、tags。定义Item,将items.py修改如下:
import scrapy class QuoteItem(scrapy.Item): text = scrapy.Field() author = scrapy.Field() tags = scrapy.Field()
查看网页源码,每页有多个class为quote的块,块中包含我们想要爬取的内容,那么我们先找出所有的quote,然后提取每个quote的内容。提取完毕后,我们需要将下一页的url提交给Engine。这一部分工作由Spider来完成。修改quotes.py如下:
# -*- coding: utf-8 -*- import scrapy from tutorial.items import QuoteItem class QuotesSpider(scrapy.Spider): name = 'quotes' allowed_domains = ['quotes.toscrape.com'] start_urls = ['http://quotes.toscrape.com/'] def parse(self, response): quotes = response.css('.quote') for quote in quotes: item = QuoteItem() item['text'] = quote.css('.text::text').extract_first() item['author'] = quote.css('.author::text').extract_first() item['tags'] = quote.css('.tags .tag::text').extract() yield item next = response.css('.paper .next a::attr(href)').extract_first() url = response.urljoin(next) yield scrapy.Request(url=url,callback=self.parse)
这里我们使用了css选择器进行提取,当然也可以用Xpath进行提取。extract_first()方法返回第一个匹配到的元素,extract()则返回匹配到的所有元素的列表。
代码中我们用了QuoteItem,这是一个Item对象,我们可以将它理解为一个字典,用来存放spider解析后的数据。
通过以上修改,我们已经完成了一个网站爬虫的所有工作。现在让我们来运行它!在命令行中输入:
scrapy crawl quotes
即可看到爬取的结果。