CentOS7でscrapy-splashを使ってJavaScriptの解析(Scrapy その3)

★関連記事
CentOS環境の python3.6(pyenv環境)で Scrapy を利用してみる(Scrapy その1)
Scrapyでデータ取得でクローリングで取得したURLから検索する(Scrapy その2)
Scrapyでデータの保存をmongodbにして見る(Scrapy その4)
CentOS7でscrapy-splashを使ってJavaScriptの解析 その2(Scrapy その5)

Splashについて

一般的にスクレイピング単体ではJavaScriptの解析ができないため、JavaScriptの解析にはSelenimumを使用したり、PhantomJSを使用したりします。

Scrapy でも JavaScript の解析にはSplashを利用します。

Splash は Scrapinghub 社が開発しているオープンソースの JavaScriptレンダリングサービスで、WebKitをベースにしたヘッダレスブラウザ(GUIのないブラウザ)を組み込んだサーバです。

Webサイトの通信はSplashを中継して行われ、JavaScriptを読み込んだ状態のHTMLを取得したり、JavaScriptの実行をしたりできます。

ScrapyでもSeleniumなどは利用できますが、Scrapyのメンテナンスを主にしている Scrapinghub 社が開発しているということもあり Splash を利用するケースの方が多いようです。

単純に Selenium より Sprasy の方が実行が早いというのもありますが。

 

Scrapy を利用するために実施する流れは以下となります。

  • Scrapyサーバをインストール・起動する
  • scrapy-splashというライブラリをインストールする
  • SpiderでRrequestクラスの代わりにSplashRequestクラスを使う

 

Splashサーバのインストールと起動の方法

Splashサーバのインストールは主に以下の2つの方法があります。

  • Dockerを使って構築
  • 手動で構築(通常のインストール)

 

参考)
https://splash.readthedocs.io/en/stable/install.html

今回はCentOSで実施しますが、Dockerを使って構築を行います。

SIPやPyQt5を入れて手動で構築することもできますが、手順としては煩雑になります。

Ubuntuであれば手順も揃っているので手動での構築でも良いかもしれません。

 

Dockerのインストールと起動

事前準備としてdockerインストールの必要ライブラリをインストールし、リポジトリを読み込み、docker-ceのインストールを行います。

また、dockerの起動と起動設定も行っておきます。

こちらでDocker環境の準備は完了です。

 

Splashサーバのインストール

インストールはdockerファイルを使って行います。

こちらでインストールと起動は完了です。

通常は8050のHTTP用のポートを使って Scrapy から呼び出しを行います。

5023はtelnet用のポートです。

https://doc.scrapy.org/en/latest/topics/telnetconsole.html

 

scrapy-splashのライブラリのインストール

ソースコードはこちらになります。

https://github.com/scrapy-plugins/scrapy-splash

 

 

Scrapyからのサンプルファイルの取得(事前確認)

今回、ファイルの取得は以下のサイトから行います。

https://developer-collaboration.com/sample/sample1.html

ファイルの中身は以下のようになっています。

 

表示される画面はこちらです。

JavaScriptのonloadイベントでdivの中身を書き換えているので、通常のScrapyのファイルだけではブラウザに表示されている値が取得できません。

Scrapyで値の取得を試してみます。

以下は「items.py」の設定です。

 

そして、spider本体である「spiders/devcolla.py」の設定です。

 

こちらでクローラーを動かしてみます。

 

結果ファイルを確認します。

 

テキストの内容を確認すると画面表示とは違う「NoNoNo」が出力されていました。

 

Splashでのテキスト情報の取得

まず、Scrapyで動作を行うために「settings.py」の変更を行います。

設定の概要は公式の以下を参考にしています。
https://pypi.org/project/scrapy-splash/

追加された項目は以下となります。

ます、最初の「SPLASH_URL」でSplashサーバのアドレスを追加しています。
今回はローカルのdockerに接続しているので、localhostを指定しています。

次にSplashの「DOWNLOADER_MIDDLEWARES」でSplashミドルウェアを設定しています。
後ろの数字は読み込みの順番を表すプライオリティです。

次は「SPIDER_MIDDLEWARES」を追加しています。

そして、「DUPEFILTER_CLASS」と「HTTPCACHE_STORAGE」の設定を行います。

 

次にspider本体である「spiders/devcolla.py」の設定です。

 

SplashRequestの読み込みを行い、リクエストをこちらから行っています。

JavaScriptの読み込みを行うため、起動時に0.5秒のwaitを設定しています。

 

こちらでクローラーを動かしてみます。

 

結果ファイルを確認します。

 

今度は表示と同じ形でテキストが出力されました。

 

UserAgentの確認

最後にサーバ側でのアクセスログですが、上がSplashを使わない場合のログで、下がSplashを使った場合のログです。

どちらも同じUserAgentになりました。

表示されているUserAgentはScrapyのデフォルトのものなので、Splashでは追加でUserAgentのセットはしないようです。