Scrapy-shell
スクレイピー-シェル
説明
Scrapyシェルを使用すると、スパイダーを使用せずに、エラーのないコードでデータをスクラップできます。 Scrapyシェルの主な目的は、抽出されたコード、XPath、またはCSS式をテストすることです。 また、データをスクレイピングするWebページを指定するのにも役立ちます。
シェルの構成
シェルはhttps://ipython.org/[IPython](インタラクティブコンピューティングに使用)コンソールをインストールすることで設定できます。これは自動補完、色付き出力などを提供する強力なインタラクティブシェルです。
Unixプラットフォームで作業している場合は、IPythonをインストールすることをお勧めします。 IPythonにアクセスできない場合は、https://www.bpython-interpreter.org/[bpython]を使用することもできます。
SCRAPY_PYTHON_SHELLと呼ばれる環境変数を設定するか、次のようにscrapy.cfgファイルを定義することにより、シェルを構成することができます-
[settings]
shell = bpython
シェルを起動する
スクレイピーシェルは、次のコマンドを使用して起動することができます-
scrapy shell <url>
_url_は、データのスクレイピングが必要なURLを指定します。
シェルを使用する
シェルは、次の表で説明するように、いくつかの追加のショートカットとScrapyオブジェクトを提供します-
利用可能なショートカット
シェルは、プロジェクトで次の利用可能なショートカットを提供します-
Sr.No | Shortcut & Description |
---|---|
1 |
shelp() ヘルプオプションで使用可能なオブジェクトとショートカットを提供します。 |
2 |
fetch(request_or_url) 要求またはURLからの応答を収集し、関連するオブジェクトが適切に更新されます。 |
3 |
view(response) 観察のためにローカルブラウザで指定されたリクエストの応答を表示し、外部リンクを正しく表示するために、応答本文にベースタグを追加します。 |
利用可能なスクレイピーオブジェクト
シェルは、プロジェクトで次の利用可能なスクレイピーオブジェクトを提供します-
Sr.No | Object & Description |
---|---|
1 |
crawler 現在のクローラーオブジェクトを指定します。 |
2 |
spider 現在のURLにスパイダーがない場合、新しいスパイダーを定義することでURLまたはスパイダーオブジェクトを処理します。 |
3 |
request 最後に収集されたページの要求オブジェクトを指定します。 |
4 |
response 最後に収集されたページの応答オブジェクトを指定します。 |
5 |
settings 現在のScrapy設定が提供されます。 |
シェルセッションの例
scrapy.orgサイトをスクレイピングしてから、説明どおりにreddit.comからデータのスクレイピングを開始しましょう。
先に進む前に、まず次のコマンドに示すようにシェルを起動します-
scrapy shell 'http://scrapy.org' --nolog
上記のURLを使用している間、Scrapyは使用可能なオブジェクトを表示します-
[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