初窥Scrapy

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

虽然Scrapy最初设计用于网页爬取,它也可以用于使用API提取数据(如 Amazon Associates Web Services) 或作为一种通用的网络爬虫。

浏览一个示例爬虫

为了给你显示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)

把它放在一个文本文件中,把它命名为quotes_spider.py,并使用runspider命令运行这个spider︰

scrapy runspider quotes_spider.py -o quotes.json

终于,我们可以运行spider来获取网站的数据,并以JSON格式存入到 scraped_data.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类别中的quotes的URL) 开始并调用默认的回调方法parse,将响应对象作为参数传递。parse回调中,我们使用一个CSS Selector循环名言元素, 产生一个带有提取好的名言文本和作者的Python字典,寻找下一个页面的链接并且安排另一个请求使用相同的parse方法作为回调函数。

这里,你注意到关于Scrapy的主要有点之一︰ 请求是以异步方式调度和处理的这意味着Scrapy不需要等待请求完成和处理,它可以发送另一个请求,或同时做其他事情。这也意味着其他请求可以继续走下去,即使处理它时一些请求失败或错误发生。

虽然这使你可以做非常快速爬虫(以容错的方式发送多个并发请求同时) Scrapy还通过几个设置给你控制爬虫的礼貌性。你可以设置每个请求之间下载的延迟,限制每个域或每个IP并发请求的数量,甚至使用自动节流扩展试图自动找出这些设置。

它使用feed exports生成JSON文件,你可以轻松更改导出格式(例如XML或 CSV) 或存储后端(例如FTP或Amazon S3)。 同时,您也可以编写 item管道 将item存储到数据库中。

还有什么?

您已经了解了如何通过Scrapy提取存储网页中的信息,但这仅仅只是冰山一角。 Scrapy提供很多强大的功能使得爬取轻松且高效,如︰

  • 内置支持使用的扩展的CSS选择器和XPath表达式从HTML/XML源选择和提取数据,使用正则表达式和辅助方法来提取。
  • 一个交互式shell控制台(可用于IPython),用于尝试CSS和XPath表达式以爬取数据,当编写或调试你的spider时非常有用。
  • 内置支持生成feed 导出为多种格式 (JSON, CSV, XML) 以及将其存储在多个后端(FTP,S3,本地文件系统)
  • 针对非英语语系中不标准或者错误的编码声明, 提供了自动检测以及健壮的编码支持。
  • 强大的可扩展性支持,允许你使用 信号和定义良好的API(中间件、扩展管道)插入自己的功能。
  • 内置的中间件及扩展为下列功能提供了支持:
    • cookies and session 处理
    • HTTP 压缩
    • user-agent spoofing
    • robots.txt
    • 爬取深度限制
    • 以及更多
  • 一个Telnet控制台,用于挂接到运行你的Scrapy进行的一个Python控制台来审查和调试爬虫
  • 再加上其他好处,例如可重用的spider来爬取从站点地图和XML/CSV feed爬取站点和,一个媒体管道自动下载与爬取的item关联的图像(或其他媒体),一个缓存DNS解析程序,以及更多!

下一步是什么?

你的下一步是安装 Scrapy跟进本教程来了解如何创建一个全面的Scrapy项目并加入社区 感谢您的支持!