Scrapy 概览

Scrapy (/ˈskreɪpaɪ/) 是一个用于爬取网站并提取结构化数据的应用程序框架,这些数据可以用于各种有用的应用,如数据挖掘、信息处理或历史存档。

尽管Scrapy最初是为网页抓取设计的,它也可以用于通过API(如亚马逊联盟网络服务)提取数据,或者作为一个通用的网络爬虫。

示例爬虫的逐步解析

为了向您展示Scrapy带来的优势,我们将通过一个使用最简单方式运行爬虫的Scrapy Spider示例来引导您。

以下是一个从网站https://quotes.toscrape.com抓取名言的爬虫代码,跟随分页:

import scrapy


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

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

        next_page = response.css('li.next a::attr("href")').get()
        if next_page is not None:
            yield response.follow(next_page, self.parse)

将此内容放入一个文本文件中,命名为类似 quotes_spider.py 的文件,并使用 runspider 命令运行爬虫:

scrapy runspider quotes_spider.py -o quotes.jsonl

完成后,您将在quotes.jsonl文件中看到一个以JSON Lines格式列出的引文列表,包含文本和作者,看起来像这样:

{"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": "Steve Martin", "text": "\u201cA day without sunshine is like, you know, night.\u201d"}
{"author": "Garrison Keillor", "text": "\u201cAnyone who thinks sitting in church can make you a Christian must also think that sitting in a garage can make you a car.\u201d"}
...

刚刚发生了什么?

当你运行命令 scrapy runspider quotes_spider.py 时,Scrapy 在其中查找了一个 Spider 定义,并通过其爬虫引擎运行它。

爬虫开始时,会向start_urls属性中定义的URL发出请求(在本例中,仅为humor类别的引号URL),并调用默认的回调方法parse,将响应对象作为参数传递。在parse回调中,我们使用CSS选择器遍历引号元素,生成一个包含提取的引文和作者的Python字典,查找下一页的链接,并使用相同的parse方法作为回调安排另一个请求。

在这里,您会注意到Scrapy的主要优势之一:请求是异步调度和处理的。这意味着Scrapy不需要等待一个请求完成和处理,它可以同时发送另一个请求或做其他事情。这也意味着即使一个请求失败或处理时发生错误,其他请求也可以继续进行。

虽然这使您能够进行非常快速的爬取(以容错的方式同时发送多个并发请求),但Scrapy还允许您通过一些设置来控制爬取的礼貌性。您可以设置每个请求之间的下载延迟,限制每个域名或每个IP的并发请求数量,甚至使用自动节流扩展,该扩展尝试自动找出这些设置。

注意

这是使用feed exports来生成JSON文件,你可以轻松更改导出格式(例如XML或CSV)或存储后端(例如FTP或Amazon S3)。你也可以编写一个item pipeline来将项目存储在数据库中。

还有什么?

你已经了解了如何使用Scrapy从网站中提取和存储项目,但这只是表面。Scrapy提供了许多强大的功能,使得抓取变得简单高效,例如:

  • 内置支持使用扩展的CSS选择器和XPath表达式从HTML/XML源中选择和提取数据,并提供使用正则表达式进行提取的辅助方法。

  • 一个交互式 shell 控制台(支持 IPython),用于尝试 CSS 和 XPath 表达式来抓取数据,这在编写或调试蜘蛛时非常有用。

  • 内置支持以多种格式(JSON, CSV, XML)生成数据导出,并将它们存储在多个后端(FTP, S3, 本地文件系统)中。

  • 强大的编码支持和自动检测,用于处理外来的、非标准的和损坏的编码声明。

  • 强大的扩展性支持,允许你使用信号和定义良好的API(中间件、扩展管道)来插入你自己的功能。

  • 广泛的内置扩展和中间件用于处理:

    • cookies 和会话处理

    • HTTP功能如压缩、认证、缓存

    • 用户代理伪装

    • robots.txt

    • 爬取深度限制

    • 以及更多

  • 一个Telnet 控制台,用于连接到在您的Scrapy进程中运行的Python控制台,以检查和调试您的爬虫

  • 还有其他好东西,比如可重复使用的蜘蛛来从Sitemaps和XML/CSV源爬取网站,一个媒体管道用于自动下载与抓取项目相关的图片(或其他任何媒体),一个缓存DNS解析器,以及更多!

接下来是什么?

您的下一步是安装Scrapy跟随教程学习如何创建一个完整的Scrapy项目,并加入社区。感谢您的关注!