scrapy框架之shell

scrapy shell

  scrapy shell是一個交互式shell,您能夠在其中快速調試 scrape 代碼,而沒必要運行spider。它原本是用來測試數據提取代碼的,但實際上您可使用它來測試任何類型的代碼,由於它也是一個常規的Python shell。css

  shell用於測試xpath或css表達式,並查看它們是如何工做的,以及它們從您試圖抓取的網頁中提取的數據。它容許您在編寫spider時交互地測試表達式,而沒必要運行spider來測試每一個更改。html

一旦你熟悉了 Scrapy Shell,你就會發現它是開發和調試蜘蛛的寶貴工具。python

配置shell

若是你有 IPython 安裝後,scrapy shell將使用它(而不是標準的python控制檯)。這個 IPython 控制檯功能更強大,提供智能自動完成和彩色輸出等功能。nginx

經過Scrapy的設置,您能夠將其配置爲使用 ipython , bpython 或標準 python shell,不管安裝了什麼。這是經過設置 SCRAPY_PYTHON_SHELL 環境變量;或經過在 scrapy.cfg ;shell

[settings]
shell = bpython

啓動shell

使用 shell 命令以下:api

scrapy shell <url>   # <url>是要抓取的url

shell 也適用於本地文件。若是你想玩一個網頁的本地副本,這很方便。 shell 瞭解本地文件的如下語法:瀏覽器

# UNIX-style
scrapy shell ./path/to/file.html
scrapy shell ../other/path/to/file.html
scrapy shell /absolute/path/to/file.html

# File URI
scrapy shell file:///absolute/path/to/file.html

使用相對文件路徑時,請使用 ./ (或) ../ 表示文件存儲的路徑app

scrapy shell ./index.html

使用shell

scrappyshell只是一個普通的python控制檯(或者 IPython 控制檯,若是你有它的話),它提供一些額外的快捷功能,以方便。dom

可用的快捷方式

shelp() -打印有關可用對象和快捷方式列表的幫助

fetch(url[, redirect=True]) - 從給定URL獲取一個新的響應,並相應地更新全部相關對象。您能夠選擇請求HTTP 3xx重定向,以免傳遞

fetch(request) -從給定的請求中獲取新的響應,並相應地更新全部相關對象。

view(response) -在本地Web瀏覽器中打開給定的響應以進行檢查。這將增長一個 <base> tag 到響應主體,以便外部連接(如圖像和樣式表)正確顯示。可是請注意,這將在您的計算機中建立一個臨時文件,該文件不會自動刪除。

可用的srapy對象

Scrapy Shell自動從下載的頁面建立一些方便的對象,例如 Response 對象與 Selector 對象(用於HTML和XML內容)。scrapy

這些對象是:

  • crawler -電流 Crawler 對象。
  • spider -已知用於處理URL的蜘蛛,或 Spider 若是沒有爲當前URL找到spider,則爲。
  • request -A Request 上次提取的頁的對象。您可使用修改此請求 replace() 或者使用 fetch 捷徑。
  • response -A Response 包含上次提取的頁的對象
  • settings - 當前scrapy的配置

Shell會話示例

下面是一個典型的shell會話的例子,咱們從抓取https://scrappy.org頁面開始,而後繼續抓取https://reddit.com頁面。最後,咱們修改(reddit)請求方法來發布和從新獲取它,獲得一個錯誤。咱們經過在Windows中鍵入ctrl-d(在UNIX系統中)或ctrl-z來結束會話。

請記住,在這裏提取的數據在您嘗試時可能不相同,由於這些頁面不是靜態的,在您測試時可能已經更改了。這個例子的惟一目的是讓您熟悉下腳料外殼的工做原理。

首先,咱們發射炮彈:

C:\Users\admin>scrapy shell www.scrapy.org --nolog

而後,shell獲取URL(使用scrapy下載器)並打印可用對象和有用快捷方式的列表(您會注意到這些行都以 [s] 前綴):

以後咱們開始使用對象:

In [1]: response.xpath('//title/text()').get()   # 獲取網頁title
Out[1]: 'Scrapy | A Fast and Powerful Scraping and Web Crawling Framework'

In [5]: fetch('https://www.osgeo.cn/scrapy/topics/shell.html')  # 切換網址
   
In [6]: response.xpath('//title//text()').get()   # 獲取網頁title
Out[6]: 'Scrapy shell — Scrapy 1.7.0 文檔'

In [7]: request = request.replace(method='post')   # 改變request的請求方式爲post

In [8]: fetch(request)    # 重新請求上面的網址

In [9]: response.status   # 響應狀態碼
Out[9]: 405

In [10]: from pprint import pprint   # 導入模塊pprint

In [11]: pprint(response.headers)   # 打印請求頭
{b'Content-Type': [b'text/html'],
 b'Date': [b'Sat, 10 Aug 2019 04:08:19 GMT'],
 b'Server': [b'nginx/1.10.3']}

In [12]: pprint(type(response.headers))   # 打印類型
<class 'scrapy.http.headers.Headers'>

從spiders調用shell來檢查響應

有時,您但願檢查在您的蜘蛛的某個點上正在處理的響應,若是隻是檢查您指望的響應是否到達那裏的話。

這能夠經過使用 scrapy.shell.inspect_response 功能。

下面是一個例子,說明如何從您的蜘蛛中命名它:

import scrapy

class MySpider(scrapy.Spider):
    name = "myspider"
    start_urls = [
        "http://example.com",
        "http://example.org",
        "http://example.net",
    ]

    def parse(self, response):
        # We want to inspect one specific response.
        if ".org" in response.url:
            from scrapy.shell import inspect_response
            inspect_response(response, self)

        # Rest of parsing code.

當你運行蜘蛛時,你會獲得相似的東西:

2014-01-23 17:48:31-0400 [scrapy.core.engine] DEBUG: Crawled (200) <GET http://example.com> (referer: None)
2014-01-23 17:48:31-0400 [scrapy.core.engine] DEBUG: Crawled (200) <GET http://example.org> (referer: None)
[s] Available Scrapy objects:
[s]   crawler    <scrapy.crawler.Crawler object at 0x1e16b50>
...

>>> response.url
'http://example.org'

而後,您能夠檢查提取代碼是否工做:

>>> response.xpath('//h1[@class="fn"]')
[]

不,不是這樣的。因此您能夠在Web瀏覽器中打開響應,看看它是不是您指望的響應:

>>> view(response)
True

最後,單擊ctrl-d(或在Windows中單擊ctrl-z)退出shell並繼續爬網:

>>> ^D
2014-01-23 17:50:03-0400 [scrapy.core.engine] DEBUG: Crawled (200) <GET http://example.net> (referer: None)
...

請注意,您不能使用 fetch 這裏的快捷方式,由於報廢的引擎被shell擋住了。然而,當你離開shell後,蜘蛛會繼續在它中止的地方爬行,如上圖所示。

示例:

# -*- coding: utf-8 -*-
import scrapy


class DowloadTaobaoSpider(scrapy.Spider):
    name = 'dowload_taobao'
    allowed_domains = ['www.taobao.com']
    start_urls = ['http://www.taobao.com/']

    def parse(self, response):
        if '.com' in response.url:
            from scrapy.shell import inspect_response
            inspect_response(response,self)

相關文章
相關標籤/搜索