基本情報の確認
1 |
scrapy |
バージョン、アクティブなプロジェクト、利用できるコマンドの情報を表示できます。
scrapyコマンド一覧
コマンド | 内容 |
---|---|
bench | 簡単なベンチマークテストを実行 |
startproject | プロジェクトを作成。Scrapyはプロジェクトという単位で一つのプロジェクトを構成します。その中にSpiderというWebサイトから情報をスクレイピングするためのclassを作成します。一つのプロジェクトの中には複数spiderを作成可能です。 |
genspider | あらかじめ用意されたテンプレートをもとに新しいスパイダーを作成 |
runspider | プロジェクトを作成せずに、スパイダーを実行する。通常はプロジェクトを作成して作るので滅多に利用しないです。何か試したい使い捨てのスパイダーを作る場合などは活用できるかもしれません。 |
crawl | プロジェクト内でスパイダーを実行する。 |
shell | 対話型シェルを起動する。XPathやCSSでデータの取得などを試すことが可能。 |
基本的なコマンド利用の流れ
データの取得方法の検討
XPathやCSSセレクタなどを使います。データの取得方法などはshellによって適宜確認して確認が終わったらspiderに反映するみたいな実装イメージです。なお、慣れてきたらshellで確認しなくても動きが予測できるようになるのでshellを使うのは最初のうちだけかもしれません。
プロジェクトの作成
startprojectでプロジェクトを作成し、genspiderでスパイダーを作成し、crawlコマンドでスパイダーを実行するというような流れになります。
1 |
scrapy startproject プロジェクト名[指定なしの場合はディレクトリ名] |
自動的に作成されるファイル一覧
ファイル/ディレクトリ名 | 説明 |
---|---|
scrapy.cfg | Spiderの作成や設定に必要なファイル |
プロジェクト名フォルダ | |
└spiders | spidersを作成していくディレクトリ |
└__init__.py | |
└__init__.py | |
└items.py | スクレイピングで取得したデータを格納する入れ物クラス |
└middlewares.py |
XXXSpiderMiddleware(リクエストとレスポンスに関する追加処理を実装したい場合に記述する)、xxxDownloaderMiddleware(Webサイトからページのダウンロード処理を拡張したい場合に記述する)
|
└pipelines.py | Webサイトから取得したデータのクレンジング、DBなどの更新処理を記述します。 |
└settings.py | パラメータで各種設定を行う設定ファイルです。 |
bench
マシンスペックに依存しますが、実行するとリクエストやレスポンスの件数が表示されます。高いマシンスペックを持つPCであれば高い数を実行できます。
- downloader/request_count
- downloader/response_count
shell
利用する場合は事前にipythonのインストールが必要になります。まだインストールしていない場合はconda install ipythonでインストールしておきましょう。
1 |
scrapy shell URL(https://xxx.com) |
指定したURLのデータを取得した状態でシェルを起動することができます。以下の状態になればshellの起動に成功しています。
1 2 3 |
[s] shelp() Shell help (print this help) [s] view(response) View response in a browser In [1]: |
試しに以下のようにfetchコマンドを実行すれば指定したURLから情報を取得できます。
1 |
fetch('https://xxx.com/') |
Xpathを実行
1 |
aaa = response.xpath('//h2/a') |
変数名を入力すれば、こんな感じで取得結果を出力できます。
1 2 3 4 5 |
In [6]: aaa Out[6]: [<Selector query='//h2/a' data='<a href="https://qiita.com/cha84rakan...'>, <Selector query='//h2/a' data='<a href="https://qiita.com/takoraisut...'>, <Selector query='//h2/a' data='<a href="https://qiita.com/WebEngrChi...'>,] |
get()
1 |
変数 = response.xpath('Xpath').get() |
getall()
1 |
変数 = response.xpath('Xpath').getall() |
取得できたHTML要素が複数でもまとめてテキストを取得できます。
HTMLのdata(テキスト)を取得できます。
CSSセレクタを実行
1 |
bbb = response.css('h2 > a') |
以下のように取得できます。
1 2 3 4 |
In [12]: bbb Out[12]: [<Selector query='descendant-or-self::h2/a' data='<a href="https://qiita.com/cha84rakan...'>, <Selector query='descendant-or-self::h2/a' data='<a href="https://qiita.com/takoraisut...'>,] |
XPathと同様にget、getallでテキストなどを取得することも可能です。
シェルから抜ける
1 |
exit |
事前設定
projectフォルダの中のsettings.pyをいじっていきます。
出力ファイルの文字コードの設定
文字コードの設定をしておきましょう。UTF-8にします。
1 |
FEED_EXPORT_ENCODING = 'uft-8' |
指定しないと出力ファイルが文字化けする可能性があります。
ダウンロード間隔の設定
以下の行のコメントを外します。あるページをダウンロードしてから次のページをダウンロードする間隔の指定になります。
誤って相手のサーバーに負荷をかけすぎないように必ず設定しておくようにしましょう。
1 |
DOWNLOAD_DELAY = 3 |
単位は秒数になります。なので上記であれば「3秒間隔でダウンロードする」という指定になります。
ROBOTSTXT_OBEY = True
日本語設定
取得する情報の言語設定です。HTTPのリクエストヘッダになります。日本語になるように設定しておきましょう。デフォルトだと「DEFAULT_REQUEST_HEADERS」はコメントアウトされているので解除した上で以下の設定をします。
1 2 3 |
DEFAULT_REQUEST_HEADERS = { "Accept-Language": "ja", } |
HTTPCACHE_ENABLED = True
HTTPCACHE_EXPIRATION_SECS
1 |
HTTPCACHE_EXPIRATION_SECS = 86400 # 1日にする場合 |
単位は秒で指定します。
キャッシュの保存場所
ちなみに、以下の場所にキャッシュは保存されます。
1 |
projects/プロジェクト名/.scrapy/httpcache |
もし変更したい場合はHTTPCACHE_DIRという設定値をいじる必要があります。
CONCURRENT_REQUESTS
Scrapyが同時に処理するリクエストの数を設定できます。デフォルトは16になっています。
DEPTH_PRIORITY = 1
階層による優先度を設定できます。1を指定すれば低い階層のリクエストから順番に処理されます。
FIFOにする
Scrapyではデフォルトでリクエストを処理する方式がLIFOですが、以下の設定をすればFIFOに変更できます。
1 2 |
SCHEDULER_DISK_QUEUE = 'scrapy.squeues.PickleFifoDiskQueue' SCHEDULER_MEMORY_QUEUE = 'scrapy.squeues.FifoMemoryQueue' |
この記事へのコメントはありません。