Skip to main content

Scrapy一览

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

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

通过示例蜘蛛

为了告诉你Scrapy给表带来了什么,我们将使用最简单的方法来运行一个蜘蛛,让你了解一个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').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)

把它放在一个文本文件中,命名为 quotes_spider.py,并使用 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"
},
...]

刚刚发生了什么?

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

抓取通过向 start_urls 属性中定义的URL发出请求(在本例中,只有 humor 类别中的引号的URL)开始请求,并调用默认回调方法 parse,将响应对象作为参数传递。在 parse 回调中,我们使用CSS选择器循环引用元素,产生一个带有提取的引用文本和作者的Python dict,寻找指向下一页的链接,并使用相同的 parse 方法调用另一个请求作为回调。

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

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

注解

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

还有什么?

你已经看到如何使用Scrapy从网站中提取和存储项目,但这只是表面。 Scrapy提供了许多强大的功能,使刮削容易和高效,如:

  • 内置支持来自HTML/XML源的 选择和提取 数据,使用扩展的CSS选择器和XPath表达式,以及使用正则表达式提取的帮助方法。

  • 一个 交互式shell控制台 (IPython知道)试用CSS和XPath表达式来抓取数据,在写或调试你的蜘蛛时非常有用。

  • 内置支持多种格式(JSON,CSV,XML)的 产生饲料出口 并将它们存储在多个后端(FTP,S3,本地文件系统)

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

  • 强大的可扩展性支持,允许您使用 信号 和定义明确的API(中间件,扩展管道)插入自己的功能。

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

    • Cookie和会话处理

    • HTTP功能,如压缩,身份验证,缓存

    • 用户代理欺骗

    • robots.txt

    • 爬行深度限制

    • 和更多

  • Telnet控制台 用于挂接到在Scrapy进程中运行的Python控制台,以自我检查和调试爬网程序

  • 加上其他好东西,如可重复使用的蜘蛛,从 Sitemaps 和XML/CSV Feed抓取网站,与被抓取的项目相关联的 自动下载图像 (或任何其他媒体)的媒体管道,缓存DNS解析器,以及更多!

下一步是什么?

接下来的步骤是给 安装Scrapy遵循教程 学习如何创建一个成熟的Scrapy项目和 join the community。感谢您的关注!