Scrapy-シェル
説明
Scrapyシェルを使用すると、スパイダーを使用せずに、エラーのないコードでデータをスクラップできます。Scrapyシェルの主な目的は、抽出されたコード、XPath、またはCSS式をテストすることです。また、データをスクレイピングするWebページを指定するのにも役立ちます。
シェルの構成
シェルは、オートコンプリートや色付きの出力などを提供する強力なインタラクティブシェルであるIPython(インタラクティブコンピューティングに使用)コンソールをインストールすることで構成できます。
Unixプラットフォームで作業している場合は、IPythonをインストールすることをお勧めします。IPythonにアクセスできない場合は、bpythonを使用することもできます。
SCRAPY_PYTHON_SHELLという環境変数を設定するか、scrapy.cfgファイルを次のように定義することで、シェルを構成できます。
[settings]
shell = bpython
シェルの起動
Scrapyシェルは、次のコマンドを使用して起動できます-
scrapy shell <url>
urlは、データを掻き取りする必要のあるURLを指定します。
シェルの使用
次の表で説明するように、シェルはいくつかの追加のショートカットとScrapyオブジェクトを提供します-
利用可能なショートカット
シェルは、プロジェクトで次の利用可能なショートカットを提供します-
シニア番号 | ショートカットと説明 |
---|---|
1 | shelp() ヘルプオプションを使用して、使用可能なオブジェクトとショートカットを提供します。 |
2 | fetch(request_or_url) リクエストまたはURLからの応答を収集し、関連するオブジェクトが適切に更新されます。 |
3 | view(response) 特定のリクエストに対する応答をローカルブラウザで表示して観察し、外部リンクを正しく表示するために、応答の本文にベースタグを追加します。 |
利用可能なScrapyオブジェクト
Shellは、プロジェクトで次の利用可能なScrapyオブジェクトを提供します-
シニア番号 | オブジェクトと説明 |
---|---|
1 | crawler 現在のクローラーオブジェクトを指定します。 |
2 | spider 現在のURLにスパイダーがない場合は、新しいスパイダーを定義することでURLまたはスパイダーオブジェクトを処理します。 |
3 | request 最後に収集されたページのリクエストオブジェクトを指定します。 |
4 | response 最後に収集されたページの応答オブジェクトを指定します。 |
5 | settings 現在のScrapy設定を提供します。 |
シェルセッションの例
次のように、scrapy.orgサイトをスクレイピングしてから、reddit.comからデータをスクレイピングし始めましょう。
先に進む前に、まず次のコマンドに示すようにシェルを起動します-
scrapy shell 'http://scrapy.org' --nolog
Scrapyは、上記のURLを使用している間、使用可能なオブジェクトを表示します-
[s] Available Scrapy objects:
[s] crawler <scrapy.crawler.Crawler object at 0x1e16b50>
[s] item {}
[s] request <GET http://scrapy.org >
[s] response <200 http://scrapy.org >
[s] settings <scrapy.settings.Settings object at 0x2bfd650>
[s] spider <Spider 'default' at 0x20c6f50>
[s] Useful shortcuts:
[s] shelp() Provides available objects and shortcuts with help option
[s] fetch(req_or_url) Collects the response from the request or URL and associated
objects will get update
[s] view(response) View the response for the given request
次に、次のように、オブジェクトの動作から始めます-
>> response.xpath('//title/text()').extract_first()
u'Scrapy | A Fast and Powerful Scraping and Web Crawling Framework'
>> fetch("http://reddit.com")
[s] Available Scrapy objects:
[s] crawler
[s] item {}
[s] request
[s] response <200 https://www.reddit.com/>
[s] settings
[s] spider
[s] Useful shortcuts:
[s] shelp() Shell help (print this help)
[s] fetch(req_or_url) Fetch request (or URL) and update local objects
[s] view(response) View response in a browser
>> response.xpath('//title/text()').extract()
[u'reddit: the front page of the internet']
>> request = request.replace(method="POST")
>> fetch(request)
[s] Available Scrapy objects:
[s] crawler
...
スパイダーからシェルを呼び出して応答を検査する
スパイダーから処理された応答を検査できるのは、その応答を期待している場合のみです。
たとえば-
import scrapy
class SpiderDemo(scrapy.Spider):
name = "spiderdemo"
start_urls = [
"http://mysite.com",
"http://mysite1.org",
"http://mysite2.net",
]
def parse(self, response):
# You can inspect one specific response
if ".net" in response.url:
from scrapy.shell import inspect_response
inspect_response(response, self)
上記のコードに示されているように、スパイダーからシェルを呼び出して、次の関数を使用して応答を検査できます。
scrapy.shell.inspect_response
スパイダーを実行すると、次の画面が表示されます-
2016-02-08 18:15:20-0400 [scrapy] DEBUG: Crawled (200) (referer: None)
2016-02-08 18:15:20-0400 [scrapy] DEBUG: Crawled (200) (referer: None)
2016-02-08 18:15:20-0400 [scrapy] DEBUG: Crawled (200) (referer: None)
[s] Available Scrapy objects:
[s] crawler
...
>> response.url
'http://mysite2.org'
次のコードを使用して、抽出されたコードが機能しているかどうかを調べることができます-
>> response.xpath('//div[@class = "val"]')
出力を次のように表示します
[]
上記の行は、空白の出力のみを表示しています。これで、シェルを呼び出して、次のように応答を検査できます。
>> view(response)
応答を次のように表示します
True