首页 > 代码库 > Scrapy了解(译)

Scrapy了解(译)

Scrapy简述

  Scrapy是一个爬虫应用框架,所谓爬虫,即是用来爬取web网页并从中提取结构化数据,这些爬来的数据可以被应用在广泛的有用的应用中,像数据挖掘,信息处理和历史存档等。

  尽管Scrapy起初被设计用于web scraping,但是它也能被用于使用APIs提取数据(例如Amazon Associates Web Services)或者作为一个多功能web爬虫。

 

通过一个实例spider了解Scrapy

  为了展示Scrapy带来了什么价值,下面将通过一个最简单的例子来说明。

  这里有一段著名的代码引用自http://quotes.toscrape.com,代码如下:

import scrapy


class QuotesSpider(scrapy.Spider):
    name = "quotes"
    start_urls = [
        http://quotes.toscrape.com/tag/humor/,
    ]

    def parse(self, response):
        for quote in response.css(div.quote):
            yield {
                text: quote.css(span.text::text).extract_first(),
                author: quote.xpath(span/small/text()).extract_first(),
            }

        next_page = response.css(li.next a::attr("href")).extract_first()
        if next_page is not None:
            next_page = response.urljoin(next_page)
            yield scrapy.Request(next_page, callback=self.parse)

  将上述代码写到一个text文件中,例如quotes_spider.py文件,使用 runspider 命令运行spider。

scrapy runspider quotes_spider.py -o quotes.json

 

  当执行完成后,你将看到一个JSON文件quotes.json,包含文本和作者,如下(这里重新格式化了文件,为了提高可读性):

[{
    "author": "Jane Austen",
    "text": "\u201cThe person, be it gentleman or lady, who has not pleasure in a good novel, must be intolerably stupid.\u201d"
},
{
    "author": "Groucho Marx",
    "text": "\u201cOutside of a dog, a book is man‘s best friend. Inside of a dog it‘s too dark to read.\u201d"
},
{
    "author": "Steve Martin",
    "text": "\u201cA day without sunshine is like, you know, night.\u201d"
},
...]

 

 

刚才发生了什么?

  当你运行命令 scrapy runspider quotes_spider.py,Scrapy查找定义在它里面的一个Spider,并通过它的crawler引擎运行它。

  crawl开始,通过向定义在start_urls属性里的URLs(在这个例子里,只有humor category的quotes的URL)提出请求,并且调用默认的反馈函数parse,通过回复对象做为一个参数。在反馈函数parse中,我们使用一个CSS Selector 遍历quote元素,生成一个提取了quote内容和作者的Python字典,查找子页面的链接,并使用同样的parse方法做为反馈函数依次提出请求。

  这里你能看到Scrapy的一个主要优点之一:请求是可调度的并且可以异步处理。这意味着Scrapy不需要等待一个请求结束和处理完成,在这期间,它可以发送另一个请求或者做其他的事情。这也意味着其他请求可以保持进行,即是一些请求失败或者一些错误发生。

  Scrapy使你有能力非常快速的爬取(以容错的方式,同时发送多条请求),与此同时,你也可以通过a few settings进行爬取配置。你可以做一些配置,比如设置两个请求之间的下载延迟,限制每个域或者每个IP的并发请求数量,甚至学习using an auto-throttling extension来自动计算出这些。

Scrapy了解(译)