scrapy-splash
ミドルウェア を使用して、Dockerコンテナ内で実行されているSplash
javascriptエンジンを介してスクレイピングされた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
をどのように使用できますか?
シェルする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
タイムアウトの秒単位の時間wait
JavaScriptが実行されるのを待ってからhtmlを読み取ったり保存したりする時間(秒単位)。
構成済みのScrapyプロジェクト内で引数なしで_scrapy Shell
_を実行してから、req = scrapy_splash.SplashRequest(url, ...)
を作成し、fetch(req)
を呼び出すことができます。
Docker Toolboxを使用するWindowsユーザーの場合:
invalid hostname:http
エラーを防ぐために、単一引用符を二重引用符に変更します。
ローカルホストを、クジラのロゴの下にあるdockeripアドレスに変更します。私にとっては192.168.99.100
でした。
最後に私はこれを手に入れました:
scrapy Shell "http://192.168.99.100:8050/render.html?url="https://samplewebsite.com/category/banking-insurance-financial-services/""