高度なクローラー - 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 つの方法 (画像とテキスト付き)

推薦する

VMware 仮想マシンでの CentOS7 ネットワーク構成 (ホストのワイヤレス インターネット アクセス)

CentOS7 システムを使用するのは今回が初めてで、ネットワーク構成を行う際に多くの問題が発生し...

docker を使用して Windows 10 Home バージョンで Laravel 開発環境を構築する方法の詳細なチュートリアル

オペレーティング·システム: Win10 ホームエディションDockerをインストールします:公式サ...

Vue+ElementUI で超大規模なフォーム例を処理する方法

最近、社内の業務調整により、以前の超長文のロジックが大幅に変更されたため、リファクタリングする予定で...

MySQL コマンドライン操作中のエンコードの問題の詳細な説明

1. MySQLデータベースのエンコーディングを確認する mysql -u ユーザー名 -p パスワ...

txt ブックの内容を Web ページに表示するコード

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1...

DockerのTLS(SSL)証明書の有効期限の問題を解決する

問題現象: [root@localhost ~]# docker イメージをプル xxx.com.c...

Dockerを使用してgitlabコミュニティの中国語版を構築する詳細なプロセスを教えます

1. Docker Composeを使用して起動を構成するDocker Compose を知らない場...

dockerでpdflatex環境を設定する方法

技術的背景Latex は文書作成、特に記事作成には欠かせないツールであり、必須のテキスト組版ツールで...

Nginx セッション損失問題の解決策

nginx をリバース プロキシ tomcat として使用する場合、セッション損失が発生する可能性が...

ウェブデザインレイアウトの理解

<br />矛盾が生じます。私たちのような小さな工房では、デザインとレイアウトは基本的に...

MySQL テーブル結合クエリでグループ化と重複排除を実装する例

目次ビジネスロジックデータテーブル構造クエリロジックSQL スクリプトスクリプトの説明ビジネスロジッ...

Tomcat の一般的な例外と解決コードの例

弊社のプロジェクトは Java で開発され、ミドルウェアは Tomcat でした。運用中に、Tomc...

CSSブレンドモードとSVGを使用して、製品画像の色を動的に変更します。

数日前、Codepen で @Kyle Wetton が書いた、CSS ブレンディング モードと S...

mysql order by in の文字順序の詳細な説明 (推奨)

//MySQL ステートメント SELECT * FROM `MyTable` WHERE `id...

Windows Server 2012 リモート デスクトップ ライセンス サーバーがライセンスを提供できず、リモート セッションが切断される

本日、会社の内部サーバーにログインしたところ、リモートアクセスができませんでした。エラー メッセージ...