Scrapy at a glance

Scrapy是一个用于爬网网站并提取结构化数据的应用程序框架,可用于各种有用的应用程序,例如数据挖掘,信息处理或历史档案.

即使Scrapy最初是为Web抓取而设计的,它也可以用于使用API​​(例如Amazon Associates Web Services )或用作通用Web搜寻器来提取数据.

Walk-through of an example spider

为了向您展示Scrapy带来的好处,我们将使用最简单的运行Spider的方式向您介绍Scrapy Spider的示例.

以下是在分页之后从网站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').get(),
                'author': quote.xpath('span/small/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类的quotes_spider.py ,然后使用runspider命令运行蜘蛛runspider

scrapy runspider quotes_spider.py -o quotes.json

完成此操作后,您将在quotes.json文件中具有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"
},
...]

What just happened?

当您运行命令scrapy runspider quotes_spider.py ,Scrapy会在其中查找Spider定义并通过其搜寻器引擎运行它.

爬网开始于对start_urls属性中定义的URL(在这种情况下,仅是幽默类别中引号的URL)发出请求,并调用默认的回调方法parse ,将响应对象作为参数传递. 在parse回调中,我们使用CSS选择器遍历quote元素,生成包含提取的引用文本和作者的Python dict,查找指向下一页的链接,并使用与回调相同的parse方法安排另一个请求.

在这里,您会注意到Scrapy的主要优势之一:请求是异步调度和处理的 . 这意味着Scrapy无需等待请求完成和处理,它可以同时发送另一个请求或执行其他操作. 这也意味着即使某些请求失败或在处理过程中发生错误,其他请求也可以继续执行.

尽管这使您能够进行非常快速的爬网(以容错的方式同时发送多个并发请求),但是Scrapy还使您可以通过一些设置来控制爬网的礼貌. 您可以执行以下操作:设置每个请求之间的下载延迟,限制每个域或每个IP的并发请求数量,甚至使用试图自动找出这些请求的自动限制扩展 .

Note

这是使用Feed导出生成JSON文件,您可以轻松更改导出格式(例如XML或CSV)或存储后端(例如FTP或Amazon S3 ). 您还可以编写项目管道以将项目存储在数据库中.

What else?

You’ve seen how to extract and store items from a website using Scrapy, but this is just the surface. Scrapy provides a lot of powerful features for making scraping easy and efficient, such as:

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

What’s next?

接下来的步骤是安装Scrapy按照教程学习如何创建功能完善的Scrapy项目并加入社区 . 感谢您的关注!