プログラミングマガジン

プログラミングを中心にIT技術をできるだけわかりやすくまとめます。

  • ホーム
  • Python
  • 【Python】Scrapyのコマンド、開発の流れ
 
 
     
  • サーバー言語  
    • Python
    • Ruby
    • PHP
    • SQL
  •  
  • インフラ  
       
    • AWS
    •  
    • 基本
    • Git
  • Web
       
    • Web開発
    • JavaScript
    • Vue.js
    • React
  •  
  • 設計  
       
    • 実装設計
    • DB設計
  • 問い合わせ
  

【Python】Scrapyのコマンド、開発の流れ

06.03

  • miyabisan2
  • コメントを書く

この記事は4分で読めます

基本情報の確認

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

robots.txt(クローラーへのアクセス許可などを指示するファイル)がある場合はそれに従うかどうかの設定になります。trueなら従います。

日本語設定

取得する情報の言語設定です。HTTPのリクエストヘッダになります。日本語になるように設定しておきましょう。デフォルトだと「DEFAULT_REQUEST_HEADERS」はコメントアウトされているので解除した上で以下の設定をします。

1
2
3
DEFAULT_REQUEST_HEADERS = {
   "Accept-Language": "ja",
}

HTTPCACHE_ENABLED = True

一度ダウンロードしたWebページをローカルにキャッシュしてくれます。構成が難しいサイトとかだと何度も実行して何度もダウンロードすることになってしまうので、キャッシュしておくと開発が早くなります。
ただ、デメリットとしては常に同じページを参照し続けることになるのでもしかしたらページの内容が変わっている可能性もあることです。
そのためキャッシュには有効期限を設定しておくと良いでしょう。

HTTPCACHE_EXPIRATION_SECS

キャッシュの有効期限を設定できます。Spiderを再実行した際に以下の秒数経過していた場合は再度Webページをダウンロードしてくれます。
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'

 

スポンサーリンク
  • 2023 06.03
  • miyabisan2
  • コメントを書く
  • Python
  • Tweets Twitter
  • このエントリーをはてなブックマークに追加
  • LINEで送る

関連記事

  1. 2023 06.04

    スクレイピングにおけるXPathの基本

  2. 2023 06.22

    【Python】Tkinterについて

  3. 2023 06.09

    【NoSQL】MongoDBの基本

  4. 2023 06.04

    【Python】Scrapyでspiderを作成する流れ

  5. 2023 05.30

    【Python】スクレイピング結果をCSVに保存する。

  6. 2023 06.06

    【Python】scrapyのcrawlテンプレートで実装

  • コメント ( 0 )
  • トラックバック ( 0 )
  1. この記事へのコメントはありません。

  1. この記事へのトラックバックはありません。

返信をキャンセルする。

【Python】Scrapyの構成、処理の流れ

スクレイピングにおけるXPathの基本

RETURN TOP

著者プロフィール

エンジニア歴10年で過去に業務系、Webデザイン、インフラ系なども経験あります。現在はWeb系でフロントエンド開発中心です。

詳細なプロフィールはこちら

スポンサーリンク

カテゴリー

  • Android
  • AngularJS
  • API
  • AWS
  • C++
  • CSS
  • cursor
  • C言語
  • DDD
  • DevOps
  • Django
  • Docker
  • Figma
  • Git
  • GitLab
  • GraphQL
  • gRPC
  • Hasura
  • Java
  • JavaScript
  • Kubernetes
  • Laravel
  • linux
  • MySQL
  • Next.js
  • nginx
  • Node.js
  • NoSQL
  • Nuxt.js
  • Oracle
  • PHP
  • Python
  • React
  • Redux
  • Rspec
  • Ruby
  • Ruby on Rails
  • Sass
  • Spring Framework
  • SQL
  • TypeScript
  • Unity
  • Vue.js
  • Webサービス開発
  • Webデザイン
  • Web技術
  • インフラ
  • オブジェクト指向
  • システム開発
  • セキュリティ
  • その他
  • データベース
  • デザインパターン
  • テスト
  • ネットワーク
  • プログラミング全般
  • マイクロサービス
  • マイクロソフト系技術
  • マルチメディア
  • リファクタリング
  • 副業
  • 未分類
  • 業務知識
  • 生成AI
  • 設計
  • 関数型言語
RETURN TOP

Copyright ©  プログラミングマガジン | プライバシーポリシー