1. 程式人生 > >Python -- Scrapy 命令行工具(command line tools)

Python -- Scrapy 命令行工具(command line tools)

string price rri 爬取 方式 edi ref www. 一般來說

結合scrapy 官方文檔,進行學習,並整理了部分自己學習實踐的內容

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 ScrapyTest

技術分享

該命令將會在 ScrapyTest目錄中創建一個Scrapy項目。

接下來,進入到項目目錄中:

cd ScrapyTest

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

簡單加一句,在pycharm 中的終端同樣支持windows命令操作。

技術分享

創建後的項目結構如下,此時還沒有創建spider

技術分享

控制項目

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

比如,通過命令行或是終端在項目下創建一個新的spider:

scrapy genspider spiderDemo domainTest

技術分享

創建後的目錄結構如下

技術分享

自動生成的代碼如下

技術分享

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

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

可用的工具命令(tool commands)

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

scrapy

技術分享
scrapy <command> -h

scrapy genspider -h

技術分享

您也可以這樣查看可用的命令:

scrapy -h

技術分享

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

全局命令:

  • startproject
  • settings
  • runspider
  • shell
  • fetch
  • view
  • version

項目(Project-only)命令:

  • crawl
  • check
  • list
  • edit
  • parse
  • genspider
  • deploy
  • bench

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的源碼文件。

例子:

#使用命令 參數 -l  查看 spider 模板

scrapy genspider -l

#輸出結果為模板名稱
Available templates:
  basic
  crawl
  csvfeed
  xmlfeed

查看spider模板源代碼

#使用 命令加上參數 ‘-d’,以及模板名稱

scrapy genspider -d crawl

#輸出模板信息

# -*- coding: utf-8 -*-
import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule


class $classname(CrawlSpider):
    name = $name
    allowed_domains = [$domain]
    start_urls = [http://$domain/]

    rules = (
        Rule(LinkExtractor(allow=rItems/), callback=parse_item, follow=True),
    )

    def parse_item(self, response):
        i = {}
        #i[‘domain_id‘] = response.xpath(‘//input[@id="sid"]/@value‘).extract()
        #i[‘name‘] = response.xpath(‘//div[@id="name"]‘).extract()
        #i[‘description‘] = response.xpath(‘//div[@id="description"]‘).extract()
        return i

#通過命令加參數 -t 模板名稱  spiderName [domainName]  創建 spider

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‘

Python -- Scrapy 命令行工具(command line tools)