web-dev-qa-db-ja.com

ScrapyShellとScrapySplash

scrapy-splashミドルウェア を使用して、Dockerコンテナ内で実行されているSplashjavascriptエンジンを介してスクレイピングされたHTMLソースを渡します。

スパイダーでSplashを使用する場合は、いくつかの 必要なプロジェクト設定 を構成し、特定の Request引数 を指定するmetaを生成します。

yield Request(url, self.parse_result, meta={
    'splash': {
        'args': {
            # set rendering arguments here
            'html': 1,
            'png': 1,

            # 'url' is prefilled from request url
        },

        # optional parameters
        'endpoint': 'render.json',  # optional; default is render.json
        'splash_url': '<url>',      # overrides SPLASH_URL
        'slot_policy': scrapyjs.SlotPolicy.PER_DOMAIN,
    }
})

これは文書化されているように機能します。しかし、 Scrapy Shell 内でscrapy-splashをどのように使用できますか?

16
alecxe

シェルするURLを splash http api でラップするだけです。

したがって、次のようなものが必要になります。

scrapy Shell 'http://localhost:8050/render.html?url=http://domain.com/page-with-javascript.html&timeout=10&wait=0.5'

どこ localhost:portはスプラッシュサービスが実行されている場所です
urlはクロールしたいURLであり、urlquoteを忘れないでください!
render.htmlは可能なhttpapiエンドポイントの1つであり、この場合は再作成されたhtmlページを返します
timeoutタイムアウトの秒単位の時間
waitJavaScriptが実行されるのを待ってからhtmlを読み取ったり保存したりする時間(秒単位)。

26
Granitosaurus

構成済みのScrapyプロジェクト内で引数なしで_scrapy Shell_を実行してから、req = scrapy_splash.SplashRequest(url, ...)を作成し、fetch(req)を呼び出すことができます。

18
Mikhail Korobov

Docker Toolboxを使用するWindowsユーザーの場合:

  1. invalid hostname:httpエラーを防ぐために、単一引用符を二重引用符に変更します。

  2. ローカルホストを、クジラのロゴの下にあるdockeripアドレスに変更します。私にとっては192.168.99.100でした。

最後に私はこれを手に入れました:

scrapy Shell "http://192.168.99.100:8050/render.html?url="https://samplewebsite.com/category/banking-insurance-financial-services/""

0
Uchiha AJ