高度なクローラー - JS 自動レンダリングのための Scrapy_splash コンポーネントの使用

高度なクローラー - JS 自動レンダリングのための Scrapy_splash コンポーネントの使用

1. scrapy_splash とは何ですか?

scrapy_splashscrapyのコンポーネントです

  • Scrapy-splash の js データの読み込みは Splash に基づいています。
  • Splash は、Javascript レンダリング サービスです。これは、HTTP API を実装した軽量ブラウザです。Splash は Python と Lua で実装されており、Twisted や QT などのモジュール上に構築されています。
  • scrapy-splash を使用して取得された応答は、ブラウザーがレンダリングを完了した後の Web ページのソース コードと同等になります。

Splash 公式ドキュメントhttps://splash.readthedocs.io/en/stable/

2. scrapy_splashの役割

scrapy-splashはブラウザをシミュレートしてjsをロードし、jsの実行後にデータを返すことができます。

3. scrapy_splashの環境インストール

3.1 スプラッシュDockerイメージの使用

Splash の Dockerfile https://github.com/scrapinghub/splash/blob/master/Dockerfile

スプラッシュ依存環境が少し複雑であることが観察されたので、スプラッシュDockerイメージを直接使用することができます。

Dockerイメージを使用しない場合は、公式のスプラッシュドキュメントを参照して、対応する依存関係環境をインストールしてください。

3.1.1 Dockerサービスをインストールして起動する

インストールリファレンス https://www.jb51.net/article/213611.htm

3.1.2 スプラッシュイメージを取得する

Dockerの正しいインストールに基づいてスプラッシュイメージをプルします

sudo docker pull scrapinghub/splash

3.1.3 インストールが成功したことを確認する

スプラッシュドッカーサービスを実行し、ブラウザからポート8050にアクセスしてインストールが成功したかどうかを確認します。

  • フロントエンドで実行: sudo docker run -p 8050:8050 scrapinghub/splash
  • バックグラウンドで実行sudo docker run -d -p 8050:8050 scrapinghub/splash

http://127.0.0.1:8050にアクセスし、次のスクリーンショットを確認してください。これは成功を意味します。

ここに画像の説明を挿入

3.1.4 イメージ取得タイムアウトの問題を解決する: Dockerイメージソースを変更する

Ubuntu 18.04を例に挙げる

1. Docker設定ファイルを作成して編集する

sudo vi /etc/docker/daemon.json

2.国内docker-cn.comのミラーアドレス設定を書き込み、保存して終了する

{ 
"レジストリミラー": ["https://registry.docker-cn.com"] 
}

3. コンピュータまたはDockerサービスを再起動し、スプラッシュイメージを再度取得します。

4. それでも遅い場合は、モバイルホットスポット(データorz)を使用してください。

3.1.5 スプラッシュサービスを無効にする

まずコンテナを閉じてから削除する必要があります。

sudo docker ps -a
sudo docker stop コンテナID
sudo docker rm コンテナID

3.2 Python仮想環境にscrapy-splashパッケージをインストールする

pip で scrapy-splash をインストールします

4. スクレイピーでスプラッシュを使用する

百度を例に挙げてみよう

4.1 プロジェクトを作成し、クローラーを作成する

scrapy startproject test_splash
cd テストスプラッシュ
スクレイピー genspider no_splash baidu.com
scrapy genspider with_splash baidu.com

4.2 settings.py設定ファイルの改善

settings.pyファイルにスプラッシュ設定を追加し、ロボットプロトコルを変更します。

# レンダリングサービス URL
SPLASH_URL = 'http://127.0.0.1:8050'
# ダウンローダーミドルウェア DOWNLOADER_MIDDLEWARES = {
    'scrapy_splash.SplashCookiesMiddleware': 723,
    'scrapy_splash.SplashMiddleware': 725,
    'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 810,
}
# 重複排除フィルター DUPEFILTER_CLASS = 'scrapy_splash.SplashAwareDupeFilter'
#Splash の HTTP キャッシュを使用する HTTPCACHE_STORAGE = 'scrapy_splash.SplashAwareFSCacheStorage'

# robots.txt のルールに従う
ROBOTSTXT_OBEY = 偽

4.3 飛沫なし

spiders/no_splash.pyの改善

スクレイピーをインポートする

クラス NoSplashSpider(scrapy.Spider):
    名前 = 'no_splash'
    allowed_domains = ['baidu.com']
    start_urls = ['https://www.baidu.com/s?wd=13161933309']

    def parse(self, レスポンス):
        open('no_splash.html', 'w') を f として実行します:
            f.write(レスポンス本文デコード())

4.4 スプラッシュの使用

スクレイピーをインポートする
from scrapy_splash import SplashRequest # scrapy_splash パッケージが提供するリクエスト オブジェクトを使用します class WithSplashSpider(scrapy.Spider):
    名前 = 'スプラッシュ付き'
    allowed_domains = ['baidu.com']
    start_urls = ['https://www.baidu.com/s?wd=13161933309']

    def start_requests(self):
        SplashRequest(self.start_urls[0], を生成します。
                            コールバック=self.parse_splash,
                            args={'wait': 10}, # 最大タイムアウト、単位: 秒 エンドポイント='render.html') # スプラッシュサービスの固定パラメータを使用する def parse_splash(self, response):
        open('with_splash.html', 'w') を f として実行します:
            f.write(レスポンスボディデコード())

4.5 2つのクローラーを別々に実行し、現象を観察する

4.5.1 2つのクローラーを別々に実行する

スクレイピークロール no_splash
スクレイピークロール with_splash

4.5.2 取得した2つのHTMLファイルを観察する

飛沫なし

ここに画像の説明を挿入

スプラッシュの使用

ここに画像の説明を挿入

4.6 結論

  • SplashはSeleniumに似ており、ブラウザのようにリクエストオブジェクト内のURLアドレスにアクセスできます。
  • URLに対応するレスポンス内容に応じて順番にリクエストを送信できる
  • 複数のリクエストに対応する複数のレスポンスコンテンツをレンダリングする
  • 最後に、レンダリングされたレスポンス オブジェクトが返されます。

5. さらに詳しく

スプラッシュについて https://www.jb51.net/article/219166.htm

scrapy_splashについて(スクリーンショット、get_cookiesなど) https://www.e-learn.cn/content/qita/800748

6. まとめ

1. scrapy_splashコンポーネントの役割

  • SplashはSeleniumに似ており、ブラウザのようにリクエストオブジェクト内のURLアドレスにアクセスできます。
  • URLに対応するレスポンス内容に応じて順番にリクエストを送信できる
  • 複数のリクエストに対応する複数のレスポンスコンテンツをレンダリングする
  • 最後に、レンダリングされたレスポンス オブジェクトが返されます。

2. scrapy_splashコンポーネントの使用

  • サポートとしてスプラッシュサービスが必要
  • 構築されたリクエストオブジェクトはsplash.SplashRequestになります。
  • ダウンロードミドルウェアとして使用
  • scrapy_splash固有の設定が必要

3. scrapy_splashの具体的な設定

SPLASH_URL = 'http://127.0.0.1:8050'
DOWNLOADER_MIDDLEWARES = {
    'scrapy_splash.SplashCookiesMiddleware': 723,
    'scrapy_splash.SplashMiddleware': 725,
    'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 810,
}
DUPEFILTER_CLASS = 'scrapy_splash.SplashAwareDupeFilter'
HTTPCACHE_STORAGE = 'scrapy_splash.SplashAwareFSCacheStorage'

高度なクローラーに関するこの記事はこれで終わりです - JS 自動レンダリングのための Scrapy_splash コンポーネントの使用。 js Scrapy_splash コンポーネントの使用に関するより関連性の高いコンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。 今後とも 123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • scrapy-splashの簡単な使い方の詳しい説明

<<:  Win10にMySQL8圧縮パッケージ版をインストールするチュートリアル

>>:  Windows 10 に Linux サブシステムをインストールする 2 つの方法 (画像とテキスト付き)

推薦する

プレーヤー機能を実現するためのvue + element uiのサンプルコード

効果画像のない表示は単なる空虚な言葉です。 1. オーディオをベースにし、elementUI と組み...

MySQLでデータベースデータ保存ディレクトリを変更する方法

序文MySQL データベースのデフォルトのデータベース ファイルは /var/lib/mysql に...

MySQL テーブル内の重複データを検索して削除する方法の概要

時々、データベース テーブルに重複したデータが大量に保存されます。これらの重複データはリソースを浪費...

MySQL5.7 mysqldump バックアップとリカバリの実装

MySQL バックアップコールドバックアップ:停止服務進行備份,即停止數據庫的寫入ホットバックアップ...

JavaScript ECharts の使用方法の説明

以前、プロジェクトを行う際に ECharts を使用しました。今日はそれをメモとして整理し、より多く...

NginxとLuaによるグレースケールリリースの実装

memcachedをインストールする yum インストール -y memcached #memcac...

ミニプログラム開発ツールのソースコードからの基本実装の分析

目次ミニプログラム開発者ツールのソースコードを表示する方法ミニプログラムアーキテクチャ設計1. ミニ...

CSS でレスポンシブ レイアウトを実装する方法

CSS でレスポンシブ レイアウトを実装するレスポンシブレイアウトは非常にハイエンドで難しいように思...

MySQL の分離レベル、ロック、MVCC の紹介

この記事の目的は、これらの概念とその機能の関係を明らかにすることです。 Mysql がトランザクショ...

CSS3のtransform属性で実装される4つの機能

CSS3 では、transform 関数を使用して、テキストや画像の回転、拡大縮小、傾斜、移動という...

初心者がdockerにmysqlをインストールするときに遭遇するさまざまな問題

序文最近、パソコンのシャットダウンに時間がかかることが多く、強制的にシャットダウンするには電源ボタン...

Linux の権限管理コマンド (chmod/chown/chgrp/unmask) の詳細な説明

目次chmod例権限に関する特別な注意分析するチョーンchgrp umask Linux オペレーテ...

InnoDB テーブルの BLOB 列と TEXT 列のストレージ効率を最適化します。

まず、MySQL InnoDB エンジンのストレージ形式に関する重要なポイントをいくつか紹介します。...

ウェブページのグリッドデザインを考える

<br />元のアドレス: http://andymao.com/andy/post/8...

jQuery はテーブルのページング効果を実装します

この記事では、テーブルのページング効果を実現するためのjQueryの具体的なコードを参考までに紹介し...