scrapy深入学习----(3)

发布时间:2019-09-23 17:05:45编辑:auto阅读(1883)

    Command line tool

    命令行工具

    最新版本 0.10.

    我们可以通过scrapy命令行工具来控制Scrapy, 这里我们使用了“Scrapy tool”这么一个词,用来区分他们的子命令,那些通常我们称为 “commands”,或者 “Scrapy commands”.

    处于各种目的,Scrapy 工具提供了几个命令,每个都有一组可接受的的参数和选项。

    Default structure of Scrapy projects

    Scrapy工程的默认结构

    在深入学习命令行工具和它的子命令之前,我们县来了解一下Scrapy工程的目录结构。

    尽管这并不是固定的, 所有Scrapy工程在默认情况下都有相同的文件结构,像下面这样:

    scrapy.cfg
    myproject/
        __init__.py
        items.py
        pipelines.py
        settings.py
        spiders/
            __init__.py
            spider1.py
            spider2.py
            ...

    文件 scrapy.cfg 所存在的目录就是这个工程的根目录。这个文件包含了定义工程属性的python模块的名称。下面是一个示例:

    [settings]default = myproject.settings

    Using the scrapy tool

    使用scrapy工具

    首先,你可以启动一个没有任何参数的Scrapy 工具,然后会显示一些使用帮助和可用的命令。

    在命令行下输入scrapy,可以看到类似下面的内容:

    Scrapy X.Y - no active project
    
    Usage:
      scrapy <command> [options] [args]
    
    Available commands:
      crawl         Run a spider
      fetch         Fetch a URL using the Scrapy downloader
    [...]

    如果你在运行Scrapy工程,那么第一行显示的是当前在处于活动状态的工程。上面是在工程外运行的状态,下面这个是在工程内运行的状态:

    Scrapy X.Y - project: myproject
    
    Usage:
      scrapy <command> [options] [args]
    
    [...]

    Creating projects

    创建工程

    一般来说要做得第一件事就是创建一个工程:

    scrapy startproject myproject

    执行这条命令,会创建一个路径 myproject 并且在这个路径中新建了一个 Scrapy工程。

    下一步,进入这个工程的目录中:

    cd myproject

    此时,你应该准备好了使用 scrapy 命令来管理和控制你的工程。

    Controlling projects

    控制工程

    在你的工程中使用 scrapy 工具来控制和管理它们。 

    例如,让我们来新建一只小蛛:

    scrapy genspider mydomain mydomain.com
    会显示下面的内容:
    Created spider 'mydomain' using template 'crawl' in module:
      myproject.spiders.mydomain


    一些Scrapy 命令 (像crawl)必须在Scrapy工程的内部执行。要更详细的信息,请看一下 commands reference ,它会指导你那些必须在工程内部执行,哪些不必要。

    同时你要注意,有些命令在工程的内部和外部执行时有一些细微的差别。 举个栗子, 如果抓取的url与一些特殊的小蛛有关联,fetch命令会采取覆写蛛行为(比如 user_agent 属性会覆盖 user-agent). 这种行为是故意的, 因为 fetch 命令本来就是用来检查小蛛们是如何来下载页面的。

    Available tool commands

    可用的工具命令

    这一小节给出了程序所包含的内置命令的列表,并且给出了一些说明和使用示例。当然你要记得随时运行这些命令去获得更详细的信息: 

    scrapy <command> -h

    使用下面的命令来查看所有可用的命令:

    scrapy -h

    通常来说只有两种命令,一种是只在 Scrapy工程内部起作用的 (工程限定命令)。 另一种是无需活动工程的命令 (全局命令), 如果在工程内部运行这些命令可能会有小小的不同(他们会使用工程的内容来覆盖原先的设定).

    全局命令:

    工程限定的命令:

    startproject

    启动项目

    • 语法: scrapy startproject <project_name>

    • 是否工程限定:no

    创建一个名为 project_name的新Scrapy工程, 存放在project_name 目录下。

    使用示例:

    $ scrapy startproject myproject

    genspider

    情报蜘蛛

    • 语法:scrapy genspider [-t template] <name> <domain>

    • 是否工程限定: yes

    在当前工程中创建一只蜘蛛。

    这只是在预定义模板上定义蜘蛛的一个简短的命令(阉割版),这并不是创建蜘蛛的唯一办法。你完全可以不使用这些命令,而自己创建一个蜘蛛的源代码。

    使用示例:

    $ scrapy genspider -l
    Available templates:
      basic
      crawl
      csvfeed
      xmlfeed
    
    $ scrapy genspider -d basic
    from scrapy.spider import Spider
    
    class $classname(Spider):
        name = "$name"
        allowed_domains = ["$domain"]
        start_urls = (
            'http://www.$domain/',
            )
    
        def parse(self, response):
            pass
    
    $ scrapy genspider -t basic example example.com
    Created spider 'example' using template 'basic' in module:
      mybot.spiders.example

    crawl

    抓取

    • 语法:scrapy crawl <spider>

    • 是否工程限定:yes

    开启一个蜘蛛的爬行行为。

    使用示例:

    $ scrapy crawl myspider
    [ ... myspider starts crawling ... ]

    check

    核查

    • 语法:scrapy check [-l] <spider>

    • 是否工程限定:yes

    合同核查。

    使用示例:

    $ scrapy check -l
    first_spider
      * parse
      * parse_item
    second_spider
      * parse
      * parse_item
    
    $ scrapy check
    [FAILED] first_spider:parse_item
    >>> 'RetailPricex' field is missing
    
    [FAILED] first_spider:parse
    >>> Returned 92 requests, expected 0..4

    list

    列表

    • 语法:scrapy list

    • 是否工程限定:yes

    列出当前工程中所有可用的小蜘蛛。每行输出一个蜘蛛名。

    使用示例:

    $ scrapy list
    spider1
    spider2

    edit

    编辑

    • 语法:scrapy edit <spider>

    • 是否工程限定:yes

    使用在 EDITOR 设置中定义的编辑器编辑给定的蜘蛛。

    这个命令只是给出一个简单便捷的方法来处理最常见的情况,开发者可以根据自己的喜好来选择任何工具或IDE去编写和调试他的蜘蛛。

    使用示例:

    $ scrapy edit spider1

    fetch

    提取

    • 语法:scrapy fetch <url>

    • 是否工程限定:no

    使用Scrapy的下载器来下载给定的URL并将其内容输出到标准输出。

    关于这个命令最有趣的就是,如果是在工程内部,它会使用蜘蛛提供的方法去下载这个页面。例如,蜘蛛有一个 USER_AGENT属性覆盖了User Agent,那么这个命令就会使用蜘蛛的这个属性。 

    所以这个命令可以用来测试你的蜘蛛如何去提取某个页面。

    如果在工程外部使用,就不会应用某个蜘蛛的行为,它会使用 Scrapy默认的下载设定。

    使用示例:

    $ scrapy fetch --nolog http://www.example.com/some/page.html
    [ ... html content here ... ]
    
    $ scrapy fetch --nolog --headers http://www.example.com/
    {'Accept-Ranges': ['bytes'],
     'Age': ['1263   '],
     'Connection': ['close     '],
     'Content-Length': ['596'],
     'Content-Type': ['text/html; charset=UTF-8'],
     'Date': ['Wed, 18 Aug 2010 23:59:46 GMT'],
     'Etag': ['"573c1-254-48c9c87349680"'],
     'Last-Modified': ['Fri, 30 Jul 2010 15:30:18 GMT'],
     'Server': ['Apache/2.2.3 (CentOS)']}

    view

    总览

    • 语法:scrapy view <url>

    • 是否工程限定:no

    在浏览器中打开一个给定的URL,你的Scrapy 蜘蛛会 “看看” 它。由于有时蜘蛛所“看到”的页面跟用户不同, 那么使用这个命令你可以来检查蜘蛛看到了什么,并确定这是否是你想要的。

    使用示例:

    $ scrapy view http://www.example.com/some/page.html
    [ ... browser starts ... ]

    shell

    命令行解释器

    • 语法:scrapy shell [url]

    • 是否工程限定:no

    启动Scrapy命令行解释器来处理给定的URL,如果没有给出URL会打开一个空的解释器。 更多信息请参见Scrapy shell 。

    使用示例:

    $ scrapy shell http://www.example.com/some/page.html
    [ ... scrapy shell starts ... ]

    parse

    解析

    • 语法:scrapy parse <url> [options]

    • 是否工程限定:yes

    提取给定URL并用控制它的蜘蛛来解析,通过选项来使用这个命令,如果没有给出选项则执行默认的parse选项

    可支持的选项:

    • --callback or -c: 蜘蛛用回调作为解析响应的方法

    • --rules or -r:使用 CrawlSpider 规则 来发现用于解析响应的回调方法 (ie. spider method)

    • --noitems: 不显示抓取到的项目

    • --nolinks: 不显示抓取到的链接

    • --depth or -d: 请求的递归深度等级 (默认是:1)

    • --verbose or -v: 根据每个深度等级显示信息

    使用示例:

    $ scrapy parse http://www.example.com/ -c parse_item
    [ ... scrapy log lines crawling example.com spider ... ]
    
    >>> STATUS DEPTH LEVEL 1 <<<
    # Scraped Items  ------------------------------------------------------------
    [{'name': u'Example item',
     'category': u'Furniture',
     'length': u'12 cm'}]
    
    # Requests  -----------------------------------------------------------------
    []

    settings

    设置

    • 语法:scrapy settings [options]

    • 是否工程限定:no

    获取Scrapy 设定的值。

    如果在工程内部,它会显示工程的设定值,如果在工程外部,它会显示Scrapy 的默认设定值。

    使用示例:

    $ scrapy settings --get BOT_NAME
    scrapybot
    $ scrapy settings --get DOWNLOAD_DELAY
    0

    runspider

    运行蜘蛛

    • 语法:scrapy runspider <spider_file.py>

    • 是否工程限定:no

    不创建工程,在Python文件中独立的运行一个蜘蛛。

    使用示例:

    $ scrapy runspider myspider.py
    [ ... spider starts crawling ... ]

    version

    版本

    • 语法: scrapy version [-v]

    • 是否工程限定:no

    打印出Scrapy版本。如果使用后缀 -v, it它还会显示Python, Twisted 和 操作系统等相关内容的信息, 这对于错误报告是很有用的。

    deploy

    部署

    最新版本 0.11.

    • 语法:scrapy deploy [ <target:project> | -l <target> | -L ]

    • 是否工程限定:yes

    部署给定工程到Scrapyd服务器. 详情参见 Deploying your project.

    bench

    最新版本0.17.

    • 语法:scrapy bench

    • 是否工程限定:no

    启动快速基准检查程序测试 。参见 Benchmarking.

    Custom project commands

    定制工程命令

    通过 COMMANDS_MODULE 设定,你也可以添加自定义的工程命令。在 scrapy/commands 查看Scrapy命令的例子,用以参考如何实现你自己的命令。

    COMMANDS_MODULE

    命令模块

    默认: '' (空字符串)

    使用一个模块来查看Scrapy 自定义命令。这个是用来给Scrapy工程添加你的自定义命令的。 

    示例:

    COMMANDS_MODULE = 'mybot.commands'


关键字