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

即可看到爬取的结果。

posted @ 2018-11-15 20:32  东东欧尼酱  阅读(174)  评论(0编辑  收藏  举报