05. Scrapy

図解!Scrapy Shellの使い方を徹底解説!

更新日:

Scrapy Shellの使い方

Scrapy Shellは、spiderを実行することなく、簡単にXPathやCSSセレクタなどのデータ抽出用コードの検証やデバッグができる対話型シェルです。responseやrequestの内容も確認することができます。

 
この記事では、Scrapy Shell を用いて、Chromeの開発者ツールで確認したXPathやCSSセレクタで、うまく目的の情報を取得できるか確認する方法を解説いたします。

 
取得方法に特に懸念点が無い場合、このプロセスを飛ばして、次のspiderへのコーディングに進んで頂いても問題御座いません。慣れてくるとspiderに直接まとめてコーディングして、エラーが出た場合は修正する、という方がやり易いかもしれません。

 


人気記事 Pythonのスキルが劇的に向上した!Udemyのおすすめ講座3選!
         9月30日(木)まで!Udemyの「スキルを磨こう」大セール中!!!

確認対象のページ・項目とXPath、CSSセレクタ

ここではScrapyの練習用サイトBook To Scrapeのサイトから、カテゴリFantasyの書籍に絞り込み、一覧のページから書籍のタイトルや詳細ページへのURLを取得していきます。

 
この記事ではshellの使い方の例として、Chromeで確認した以下のXPathやCSSセレクタで、書籍のタイトルが問題無く取得できることを確認していきます。

XPath: //h3/a/@title
CSSセレクタ: h3 a::attr(title)

 
 

Scrapy Shellの起動方法

まずは、scrapy shellに必要なipythonをインストールします。もし未だインストールされていないようでしたら、ターミナルより、

conda install ipython

もしくは、

pip install ipython

でインストールすることができます。

 
インストールが終わりましたら、shellを起動します。Shellはターミナルを開いて、次のコマンドで起動することができます。

scrapy shell
In [1]: 

shellが起動し、説明文の後に、In [1]: と表示され、コマンドが入力できるようになりました。

 
 


人気記事 Pythonのスキルが劇的に向上した!Udemyのおすすめ講座3選!
         9月30日(木)まで!Udemyの「スキルを磨こう」大セール中!!!

URLの指定とResponse/Requestヘッダの確認方法

また合わせてURLを指定することで、

scrapy shell URL

で指定したURLからデータを取得することができます。

 
もしくは、次のように後からfetchで指定したURLからデータを取得することもできます。

fetch('https://books.toscrape.com/catalogue/category/books/fantasy_19/index.html')
INFO: Spider opened
DEBUG: Crawled (200) <GET https://books.toscrape.com/catalogue/category/books/fantasy_19/index.html> (referer: None)

GETは送信したrequestの種類を示します。ここでは、指定したBooks To ScrapeのサイトのURLにrequestを送信しています。

 
HTTPで定義されているリクエストのメソッドについては、次のようなものがあります。
Scrapy Shellの使い方:Requestのメソッド
ここでは、サーバから情報を取得したいので、GETを使っています。

 
またここに表示されているCrawled (200)の数字は、Scrapyが送信したrequestに対して、Webサイトから返ってくるレスポンスのステータスコードで、200は成功を表します。
 
Webサイトから返ってくるレスポンスのステータスコードには、次のようなものがあります。
3桁のコードからなり、何番台かによって意味合いが異なってきます。
Scrapy Shellの使い方:Responseのstatus code
400番台と500番台がエラーコードになります。ここでは200となっていますので、こちらから送信したリクエストに対して、処理が成功したことを表しています。

 
URLやステータスコードは、shellで次のコマンドでも確認することができます。response.urlで、レスポンスが返ってきたURLを確認することができます。

response.url
'https://books.toscrape.com/catalogue/category/books/fantasy_19/index.html'

 
またresponse.statusで、レスポンスのステータスコードを確認することができます。

response.status
200

 
またその他のレスポンスのヘッダーの情報は、response.headersで確認することができます。

response.headers
{b'Server': b'nginx/1.17.7',
b'Date': b'Fri, 30 Jul 2021 07:36:47 GMT',
b'Content-Type': b'text/html',
b'Vary': b'Accept-Encoding',
b'Last-Modified': b'Thu, 25 Mar 2021 13:59:05 GMT',
b'Strict-Transport-Security': b'max-age=15724800; includeSubDomains'}

辞書で各キー毎に値が格納されています。

 
response.request.headersで、リクエストとして送信したヘッダーも確認することができます。

response.request.headers
{b'Accept': b'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
b'Accept-Language': b'en',
b'User-Agent': b'Scrapy/2.4.1 (+https://scrapy.org)',
b'Accept-Encoding': b'gzip, deflate, br'}

 
User-Agentなど、ヘッダーの辞書の1つの項目だけを取得するには、.getlistで辞書のキーを指定します。ここでは’User-Agent’を指定しています。

response.request.headers.getlist('User-Agent')
[b'Scrapy/2.4.1 (+https://scrapy.org)']

 
 

Scrapy ShellでのXPathやCSSセレクタの確認

次にChromeブラウザ確認したXPathやCSSセレクタで、目的の情報が取得できることを確認します。

XPathの確認

取得した項目を格納する変数を定義します。ここでは、titleとします。そして、XPathで要素を指定するには、response.xpathと入力して、xpathメソッドを呼び出します。xpathメソッドの引数には、Chromeで確認したXPathを入力します。

title = response.xpath('//h3/a/@title')

ここで注意点ですが、引数として渡すXPathは文字列として渡しますので、XPathの外側をシングルクォーテーション、もしくは、ダブルクォーテーションで囲う必要があります。

但し、XPathにダブルクォーテーションが使われている場合、外側にはシングルクォーテーションを使う必要があります。また同様に、XPathにシングルクォーテーションが使われている場合は、外側にはダブルクォーテーションを使う必要があります。同じ種類のクォーテーションを使うことはできませんので、ご注意ください。

入力が終わりましたら、エンターキーで実行します。

 
次に変数titleに格納された値を確認します。

title
[<Selector xpath='//h3/a/@title' data='Unicorn Tracks'>,
<Selector xpath='//h3/a/@title' data='Saga, Volume 6 (Saga (Collected Editi...'>,
... ... ... ... ... ... ... ... ... ... ... ... ... ... ...   途中省略   ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
<Selector xpath='//h3/a/@title' data='A Shard of Ice (The Black Symphony Sa...'>,
<Selector xpath='//h3/a/@title' data="King's Folly (The Kinsman Chronicles #1)">]

Selectorオブジェクトというかたちで取得した内容が表示されました。これらSelectorオブジェクトがリストに格納されています。Selectorオブジェクトには、取得した要素の情報が格納されています。これらは、XPath または CSS セレクタで指定されたHTMLの特定の部分を「選択(select)」するため、セレクター(selector)と呼ばれています。
 
xpathのプロパティには、先ほど入力したxpathが、また、dataプロパティには取得した要素が格納されています。ここでは書籍のタイトルが格納されています。

 
これをSelectorオブジェクトではなく、テキストで取得するには、 .getall()を付けます。XPathで取得するデータが1つの場合は、.get()、複数の場合は.getall()でテキストだけを抽出することができます。

title = response.xpath('//h3/a/@title').getall()

 
titleを確認すると、

title
['Unicorn Tracks',
'Saga, Volume 6 (Saga (Collected Editions) #6)',
... ... ... ... ... ... ... ...   途中省略  ... ... ... ... ... ... ... ...
'A Shard of Ice (The Black Symphony Saga #1)',
"King's Folly (The Kinsman Chronicles #1)"]

このようにして、Webサイトより書籍のタイトルの文字を取得できることが確認できました。

 

CSSセレクタの確認

次に同様のことを、CSSセレクタを使って行います。

変数titleを定義し、CSSセレクタを使う場合、response.cssと記述し、引数にCSSセレクタを渡します。

title = response.css(' h3 a::attr(title)')

 
そして変数の中身を確認します。

title
[<Selector xpath='descendant-or-self::h3/descendant-or-self::*/a/@title' data='Unicorn Tracks'>,
<Selector xpath='descendant-or-self::h3/descendant-or-self::*/a/@title' data='Saga, Volume 6 (Saga (Collected Editi...'>,
... ... ... ... ... ... ... ... ... ... ... ... ... ... ...   途中省略   ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
<Selector xpath='descendant-or-self::h3/descendant-or-self::*/a/@title' data='A Shard of Ice (The Black Symphony Sa...'>,
<Selector xpath='descendant-or-self::h3/descendant-or-self::*/a/@title' data="King's Folly (The Kinsman Chronicles #1)">]

このように実行した結果、CSSを入力しても、Scrapyの内部的にはXPathに変換されて実行されます。

 
後はXPathの時と同様に、.getall()でテキストだけを抽出します。

title = response.css(' h3 a::attr(title)').getall()
title
['Unicorn Tracks',
'Saga, Volume 6 (Saga (Collected Editions) #6)',
... ... ... ... ... ... ... ...   途中省略  ... ... ... ... ... ... ... ...
'A Shard of Ice (The Black Symphony Saga #1)',
"King's Folly (The Kinsman Chronicles #1)"]

 
 


人気記事 Pythonのスキルが劇的に向上した!Udemyのおすすめ講座3選!
         9月30日(木)まで!Udemyの「スキルを磨こう」大セール中!!!

Scrapy Shellの終了方法

最後に、shellから抜けるコマンドは、exit() になります。

 
このようにして、Shellを使って、Chrome開発者ツールで確認したXpathやCSSセレクタで、Webサイトから目的の情報をうまく取得できることが確認できました。ここでは1つの項目だけを確認しましたが、必要に応じて他の項目も確認します。

 
最初に申し上げましたように、取得方法に特に懸念点が無い場合、このshellで確認するというプロセスを飛ばして次のspiderへのコーディングに進んで頂いても問題御座いません。慣れてくるとspiderに直接まとめてコーディングして、エラーが出た場合は修正する、という方がやり易いかもしれません。

 
 

最後に、Pythonやスクレイピングのスキルをさらに向上させたい方は、以下の私のUdemy講座を是非参考にしてみてください!

スクレイピング初心者にもわかりやすいよう、基本的なトピックから順を追って、丁寧に解説しています。またPythonを初めて学ばれた方も、最初に取り組みやすい内容になっています。

Pythonによるビジネスに役立つWebスクレイピング
発売数3,200本突破を記念して、今だけ期間限定で87%オフの大セール中!!!


既に3200名以上の方に受講頂き、大変好評です。またコースに満足いただけない場合でも、30日返金保証があるので安心です。

期間限定の割合クーポンは、こちらから!
>> Pythonによるビジネスに役立つWebスクレイピング
   
   
 
 
 





このページも人気です!!

まとめ記事

1

Python3におけるWEBスクレイピングのやり方について初心者向けに解説した記事です。   Requests、Beautiful Soup、Selenium、Pandas、newspape ...

2

Pythonの基本的なトピックについて、チュートリアル形式で初心者向けに解説した記事です。プログラミング未経験者や初心者でもわかりやすいよう、丁寧に解説しています。   Pythonでデータ ...

3

Pandas(パンダス)とは、データを効率的に扱うために開発されたPythonのライブラリの1つで、データの取り込みや加工・集計、分析処理に利用します。   Pandasには2つの主要なデー ...

4

データ分析、機械学習、ディープラーニングにはグラフの描画による可視化は不可欠です。データは、加工前の状態ではただの数字の羅列でしかなく、一目で必要な情報が伝わるものではありません。それを集計しグラフに ...

5

NumPy(ナンパイ)は、数値計算を効率的に行うための拡張ライブラリです。ベクトルや行列などを効率的に数値計算するための数学関数ライブラリを提供します。NumPyを使うことにより、数値計算をより早く、 ...

-05. Scrapy

Copyright© AI-interのPython3入門 , 2021 All Rights Reserved.