「条件に同意する」ボタンをクリックして入力する必要がある Javacode でレンダリングされた Web サイトをクロールしたいと考えています。私は Scrapy と Splash を使用しており、'render.html' と 'execute' の両方のスプラッシュ エンドポイントを使用して JavaScript コードを実行しようとしました。どちらの場合も、出力は開始ページです。なぜこれが期待どおりに機能しないのですか?
url = 「規約に同意する」ボタンのある開始ページ。
url/index.aspx = 表示したいページ。
render.html の使用:
yield scrapy.Request('url', self.parse, meta={ 'splash':
{ 'endpoint':'render.html','args': {'js_source':
'document.getElementById("AcceptTerms").click();', 'html': 1, 'wait':
0.5}}})
またはexecuteとluaを使用して:
lua_source_string = 'function main(splash)
splash:go("url/index.aspx")
splash:wait(0.5)
splash:runjs("document.getElementById(\'AcceptTerms\').click();")
return splash:html() end'
yield scrapy.Request('url', self.parse, meta={ 'splash': { 'endpoint':'execute','args': {'lua_source' : lua_source_string}}})
「url」はレンダリングされるページです。
http://blog.scrapinghub.com/2015/03/02/handling-javascript-in-scrapy-with-splash/の例に従い、jquery で次の lua 文字列を使用すると、次のようになります。
lua_source_string = 'function main(splash)
splash:autoload("https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js")
splash:go("url/index.aspx")
splash:wait(0.5)
splash:runjs("$(\'#AcceptTerms\').click();")
return splash:html() end'
または、jquery コードを次のように使用します。
lua_source_string = 'function main(splash)
splash:autoload("i/am/restricted/to/only/two/links/see/above/jquery.min.js")
splash:go("url/index.aspx")
splash:wait(0.5)
splash:runjs("$(\'#AcceptTerms\').trigger(\'click\');")
return splash:html() end'
同じ結果が得られます。レンダリングされたページは「url」です。