Scrapy (/ˈskreɪpaɪ/) 是一个用于抓取网站和提取结构化数据的应用程序框架,可用于广泛的有用应用程序,如数据挖掘、信息处理或历史档案。

尽管 Scrapy 最初是为网络抓取而设计的,但它也可以用于使用 API(例如Amazon Associates Web Services)提取数据或作为通用网络爬虫

示例蜘蛛的演练

为了向您展示 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 行格式的引号列表,其中包含文本和作者,如下所示:

{"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 发出请求(在本例中,只有幽默类别中引号的 URL)并调用默认回调方法 parse,将响应对象作为参数传递。 在解析回调中,我们使用 CSS 选择器循环遍历引用元素,生成包含提取的引用文本和作者的 Python 字典,查找指向下一页的链接,并使用与回调相同的解析方法安排另一个请求。

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

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

还有什么?

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

  • 内置支持使用扩展的 CSS 选择器和 XPath 表达式从 HTML/XML 源中选择和提取数据,以及使用正则表达式提取的辅助方法。
  • 一个交互式 shell 控制台(IPython 感知),用于尝试 CSS 和 XPath 表达式来抓取数据,在编写或调试您的蜘蛛程序时非常有用。
  • 内置支持以多种格式(JSON、CSV、XML)生成提要导出并将它们存储在多个后端(FTP、S3、本地文件系统)
  • 强大的编码支持和自动检测,用于处理外部、非标准和损坏的编码声明。
  • 强大的可扩展性支持,允许您使用信号和定义良好的 API(中间件、扩展和管道)插入您自己的功能。
  • 用于处理的各种内置扩展和中间件:
  1. cookie 和会话处理
  2. HTTP 特性,如压缩、身份验证、缓存
  3. 用户代理欺骗
  4. 机器人.txt
  5. 抓取深度限制
  6. 和更多
  • 一个 Telnet 控制台,用于连接到在 Scrapy 进程中运行的 Python 控制台,以内省和调试你的爬虫
  • 再加上其他好东西,例如可重复使用的蜘蛛,用于从站点地图和 XML/CSV 提要中抓取站点,用于自动下载与抓取项目相关的图像(或任何其他媒体)的媒体管道,缓存 DNS 解析器等等!

评论被关闭。