初窥 Scrapy

Scrapy 是用于抓取网站并提取结构化数据的应用程序框架,其应用非常广泛,如数据挖掘,信息处理或历史存档。

尽管 Scrapy 最初设计用于网络数据采集(web scraping),但它也可用于使用 API(如 Amazon Associates Web Services)提取数据或用作通用的网络爬虫。

爬虫(spider)示例

为了向您展示 Scrapy 带给您的是什么,我们将使用最简单的方式运行一个爬虫,向您展示一个 Scrape Spider 的例子。

这是一个爬虫的代码,用于从网站 http://quotes.toscrape.com 中抓取名人名言(famous quotes):

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:
            yield response.follow(next_page, 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(在里,只有一个URL,为标签(tag)为幽默(humor)的名言)发起请求(making requests)启动爬虫,并调用默认的回调方法 parse,参数为响应对象(response)。在 parse 回调方法中,我们使用 CSS 选择器循环遍历名言(quote)所在的元素,产生(yield)一个包含名人名言的 Python 字典,然后查找下一页的链接,并使用同样的回调方法 parse 发起另一个请求。

在这里,您或许注意到了 Scrapy 的主要优点之一:请求和处理是异步的。 这意味着 Scrapy 不需要等待一个请求返回的结果被处理完毕,就可以在此期间发起另一个请求或执行其他操作。 这也意味着即使某些请求失败了或在处理它时发生错误,其他请求仍然可以继续进行。

虽然这样可以使您进行非常快速的抓取(以容错方式同时发起多个请求),Scrapy 也可以让您通过一些设置来控制爬网的速度。 您可以在每个请求之间设置下载延迟,限制每个域或每个 IP 的并发请求数量,甚至使用自动调节扩展来自动计算这些延迟。

注意

这里使用了 feed exports 来生成 JSON 文件,您可以轻松地更改导出格式(例如,XML 或 CSV)和存储后台(例如,FTP 或 Amazon S3)。您还可以编写一个项目管道(item pipeline)以将项目存储在数据库中。

还有什么?

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

  • 内置支持使用扩展的 CSS 选择器和 XPath 表达式从 HTML/XML 源代码中选择和提取数据,支持正则表达式。
  • 交互式 shell 控制台(IPython aware)用于尝试 CSS 和 XPath 表达式来抓取数据,在编写或调试您的爬虫时非常有用。
  • 内置支持以多种格式(JSON,CSV,XML)生成 feed exports,并将其存储在多种后端(FTP,S3,本地文件系统)
  • 强大的编码支持和自动检测功能,用于处理多种语言的,非标准的和错误的编码声明。
  • 强大的可扩展性,允许您使用信号(signals)和良好定义的API(中间件,扩展和管道)插入自己的功能。
  • 广泛的内置扩展和中间件处理:
    • Cookie 和会话处理
    • HTTP 功能,如压缩,身份验证,缓存
    • 用户代理欺骗
    • robots.txt
    • 爬取深度限制
    • 和更多
  • 一个 Telnet 控制台,用于挂接到 Scrapy 所在的的 Python 控制台,以便检查并调试您的爬虫
  • 还有其他好处诸如:可复用的从网站地图和 XML/CSV 文件中抓取网站的爬虫,自动下载与被抓取项目相关的图像(或任何其他多媒体)的媒体管道,可缓存的DNS解析器等等!

下一步是什么?

接下来的步骤是安装 Scrapy,根据教程创建一个完整的 Scrapy 项目并加入社区。 感谢您的关注!

Scrapy 1.4 文档 01 初窥 Scrapy的更多相关文章

  1. scrapy2_初窥Scrapy

    递归知识:oop,xpath,jsp,items,pipline等专业网络知识,初级水平并不是很scrapy,可以从简单模块自己写. 初窥Scrapy Scrapy是一个为了爬取网站数据,提取结构性数 ...

  2. python爬虫 scrapy2_初窥Scrapy

    sklearn实战-乳腺癌细胞数据挖掘 https://study.163.com/course/introduction.htm?courseId=1005269003&utm_campai ...

  3. Scrapy 1.4 文档 03 Scrapy 教程

    在本教程中,我们假设您已经安装了Scrapy.如果没有,请参阅安装指南. 我们将要抓取 quotes.toscrape.com,一个列出著名作家的名言(quote)的网站. 本教程将引导您完成以下任务 ...

  4. 初窥scrapy爬虫

    2017-10-30  21:49:55 前言: 初步使用scrapy爬虫框架,爬取各个网站信息 系统环境: 64位win10系统,装有64位python3.6,IDE为pycharm,使用cmd命令 ...

  5. Scrapy 1.4 文档 02 安装指南

    安装 Scrapy Scrapy 运行在 Python 2.7 和 Python 3.3 或更高版本上. 如果您使用的是 Anaconda 或 Miniconda,则可以从 conda-forge 通 ...

  6. Scrapy 1.4 文档 05 命令行工具

    在系统命令行中,使用 scrapy 命令可以创建工程或启动爬虫,它控制着 Scrapy 的行为,我们称之为 Scrapy 命令行工具(command-line tool)或 Scrapy 工具(Scr ...

  7. Scrapy 1.4 文档 04 例子

    最好的学习方法是举例说明,Scrapy也不例外. 因此,我们有一个名为 quotesbot 的 Scrapy 项目,您可以通过它来学习更多关于 Scrapy 的知识. 它包含两个用于http://qu ...

  8. ReactiveX/RxJava文档中文版

    项目地址:https://github.com/mcxiaoke/RxDocs,欢迎Star和帮忙改进. 有任何意见或建议,到这里提出 Create New Issue 阅读地址 ReactiveX文 ...

  9. ORACLE 10.2.01升级10.2.05 for windows 详细文档

    最近要做一个数据库的升级工作,提前在自己的PC机上练习了一下,这种文档在网上很多,但是大多都是使用命令编辑脚本,其实数据库还有一个DBUA的升级工具可以使用,使升级工作方便了很多. OS环境:wind ...

随机推荐

  1. C++项目中的extern "C" {}(转)

    注:本文转自吴秦先生的博客http://www.cnblogs.com/skynet/archive/2010/07/10/1774964.html#.吴秦先生的博客写的非常详细深刻容易理解,故特转载 ...

  2. Unity Socket TCP

    using UnityEngine; using System.Collections; using System.Collections.Generic; using System.Net.Sock ...

  3. Hadoop基本知识,(以及MR编程原理)

     hadoop核心是:MapReduce和HDFS (对应着job执行(程序)和文件存储系统(数据的输入和输出)) CRC32作数据交验:在文件Block写入的时候除了写入数据还会写入交验信息,在读取 ...

  4. OVS+DPDK Datapath 包分类技术

    本文主体内容译于[DPDK社区文档],但并没有逐字翻译,在原文的基础上进行了一些调整,增加了对TSS分类器的详细阐述. 1. 概览 本文描述了OVS+DPDK中的包分类器(datapath class ...

  5. MySQL 表名区分大小写设置

    1.关闭MySQL服务:         控制面板主页-管理工具-服务-MySQL服务 2.在服务器运行目录找到my.ini 或者my.cnf文件: 在[mysqld]下面增加一行添加 :lower_ ...

  6. 听《津津乐道》ThinkPad专题节目有感

    自2011年使用Mac以来,就没怎么想过要再换一个windows使用,可是前几天听了<津津乐道>播客节目,主播朱峰讲了ThinkPad的使用经历,这个倒是让我回想起第一次见到IBM电脑时的 ...

  7. Spring的事务 之 9.1 数据库事务概述 ——跟我学spring3

    9.1  数据库事务概述 事务首先是一系列操作组成的工作单元,该工作单元内的操作是不可分割的,即要么所有操作都做,要么所有操作都不做,这就是事务. 事务必需满足ACID(原子性.一致性.隔离性和持久性 ...

  8. SPRING事务的属性有哪些?其中,事务隔离级别有哪几种?什么情况需要使用这几种事务隔离级别?

    Spring 声明式事务,propagation属性列表  PROPAGATION_REQUIRED:支持当前事务,如果当前没有事务,就新建一个事务.这是最常见的选择.  PROPAGATION_SU ...

  9. AngularJS数据绑定中数据监控的机制说明

    from : http://docs.angularjs.org/guide/scope When the browser calls into JavaScript the code execute ...

  10. Java面试题全集(上-中-下)及Java面试题集(1-50/51-70)

    阅读量超百万级的文章,收藏并分享一下.感谢原创作者的总结 对初中级java开发人员有特别大的帮助,不论是技术点面试还是知识点总结上. Java面试题全集(上):     https://blog.cs ...