2

「条件に同意する」ボタンをクリックして入力する必要がある 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」です。

4

2 に答える 2

0

lua スクリプトを実行エンドポイントに送信する推奨方法を使用して、

  1. Splash:go は、url/index.aspx の宛先ではなく、このスクリプトが実行される URL の開始ページをロードする必要があります。

  2. Splash:go はページをロードするため、すぐに splash:wait を実行する必要はありません

  3. ただし、splash:runjs に続いて、splash:wait を実行する必要があります。

  4. HTML ソースを調べて、ボタンの ID を確認します。

したがって、splash.args 内でクリックするボタンの ID を渡すことができます。

function main(splash) splash:go(splash.args.url) splash:runjs('document.getElementById["'.. splash.args.submit ..'"].click();') splash:wait(0.5) return splash:html() end

于 2015-05-28T18:27:11.477 に答える