1. 程式人生 > >scrapy命令列工具介紹

scrapy命令列工具介紹

命令列工具(Command line tools)

0.10 新版功能.

Scrapy是通過 scrapy 命令列工具進行控制的。 這裡我們稱之為 “Scrapy tool” 以用來和子命令進行區分。 對於子命令,我們稱為 “command” 或者 “Scrapy commands”。

Scrapy tool 針對不同的目的提供了多個命令,每個命令支援不同的引數和選項。

預設的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

使用 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]

[...]

建立專案

一般來說,使用 scrapy 工具的第一件事就是建立您的Scrapy專案:

scrapy startproject myproject

該命令將會在 myproject 目錄中建立一個Scrapy專案。

接下來,進入到專案目錄中:

cd myproject

這時候您就可以使用 scrapy 命令來管理和控制您的專案了。

控制專案

您可以在您的專案中使用 scrapy 工具來對其進行控制和管理。

比如,建立一個新的spider:

scrapy genspider mydomain mydomain.com

有些Scrapy命令(比如 crawl)要求必須在Scrapy專案中執行。 您可以通過下邊的 commands reference 來了解哪些命令需要在專案中執行,哪些不用。

另外要注意,有些命令在專案裡執行時的效果有些許區別。 以fetch命令為例,如果被爬取的url與某個特定spider相關聯, 則該命令將會使用spider的動作(spider-overridden behaviours)。 (比如spider指定的 user_agent)。 該表現是有意而為之的。一般來說, fetch 命令就是用來測試檢查spider是如何下載頁面。

可用的工具命令(tool commands)

該章節提供了可用的內建命令的列表。每個命令都提供了描述以及一些使用例子。您總是可以通過執行命令來獲取關於每個命令的詳細內容:

scrapy <command> -h

您也可以檢視所有可用的命令:

scrapy -h

Scrapy提供了兩種型別的命令。一種必須在Scrapy專案中執行(針對專案(Project-specific)的命令),另外一種則不需要(全域性命令)。全域性命令在專案中執行時的表現可能會與在非專案中執行有些許差別(因為可能會使用專案的設定)。

全域性命令:

專案(Project-only)命令:

startproject

  • 語法: scrapy startproject <project_name>
  • 是否需要專案: no

在 project_name 資料夾下建立一個名為 project_name 的Scrapy專案。

例子:

$ scrapy startproject myproject

genspider

  • 語法: scrapy genspider [-t template] <name> <domain>
  • 是否需要專案: yes

在當前專案中建立spider。

這僅僅是建立spider的一種快捷方法。該方法可以使用提前定義好的模板來生成spider。您也可以自己建立spider的原始碼檔案。

例子:

$ scrapy genspider -l
Available templates:
  basic
  crawl
  csvfeed
  xmlfeed

$ scrapy genspider -d basic
import scrapy

class $classname(scrapy.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

使用spider進行爬取。

例子:

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

check

  • 語法: scrapy check [-l] <spider>
  • 是否需要專案: yes

執行contract檢查。

例子:

$ 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

列出當前專案中所有可用的spider。每行輸出一個spider。

使用例子:

$ scrapy list
spider1
spider2

edit

  • 語法: scrapy edit <spider>
  • 是否需要專案: yes

使用 EDITOR 中設定的編輯器編輯給定的spider

該命令僅僅是提供一個快捷方式。開發者可以自由選擇其他工具或者IDE來編寫除錯spider。

例子:

$ scrapy edit spider1

fetch

  • 語法: scrapy fetch <url>
  • 是否需要專案: no

使用Scrapy下載器(downloader)下載給定的URL,並將獲取到的內容送到標準輸出。

該命令以spider下載頁面的方式獲取頁面。例如,如果spider有 USER_AGENT 屬性修改了 User Agent,該命令將會使用該屬性。

因此,您可以使用該命令來檢視spider如何獲取某個特定頁面。

該命令如果非專案中執行則會使用預設Scrapy downloader設定。

例子:

$ 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 spider獲取到的形式展現。 有些時候spider獲取到的頁面和普通使用者看到的並不相同。 因此該命令可以用來檢查spider所獲取到的頁面,並確認這是您所期望的。

例子:

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

shell

  • 語法: scrapy shell [url]
  • 是否需要專案: no

以給定的URL(如果給出)或者空(沒有給出URL)啟動Scrapy shell。 檢視 Scrapy終端(Scrapy shell) 獲取更多資訊。

例子:

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

parse

  • 語法: scrapy parse <url> [options]
  • 是否需要專案: yes

獲取給定的URL並使用相應的spider分析處理。如果您提供 --callback 選項,則使用spider的該方法處理,否則使用 parse 。

支援的選項:

  • --spider=SPIDER: 跳過自動檢測spider並強制使用特定的spider
  • --a NAME=VALUE: 設定spider的引數(可能被重複)
  • --callback or -c: spider中用於解析返回(response)的回撥函式
  • --pipelines: 在pipeline中處理item
  • --rules or -r: 使用 CrawlSpider 規則來發現用來解析返回(response)的回撥函式
  • --noitems: 不顯示爬取到的item
  • --nolinks: 不顯示提取到的連結
  • --nocolour: 避免使用pygments對輸出著色
  • --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檔案中的spider。

例子:

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

version

  • 語法: scrapy version [-v]
  • 是否需要專案: no

輸出Scrapy版本。配合 -v 執行時,該命令同時輸出Python, Twisted以及平臺的資訊,方便bug提交。

deploy

0.11 新版功能.

  • 語法: scrapy deploy [ <target:project> | -l <target> | -L ]
  • 是否需要專案: yes

將專案部署到Scrapyd服務。檢視 部署您的專案 。

bench

0.17 新版功能.

  • 語法: scrapy bench
  • 是否需要專案: no

執行benchmark測試。 Benchmarking 。

自定義專案命令

您也可以通過 COMMANDS_MODULE 來新增您自己的專案命令。您可以以 scrapy/commands 中Scrapy commands為例來了解如何實現您的命令。

COMMANDS_MODULE

Default: '' (empty string)

用於查詢新增自定義Scrapy命令的模組。

例子:

COMMANDS_MODULE = 'mybot.commands'

討論