0

私は、ウェブサイトで使用されているすべてのjavascriptの名前を判別する方法を探しています。リクエストlibを使用してウェブサイトのソースコードをダウンロードするのは適切ではありません。これは、使用されるすべてのjavascriptを生成しないためです。 ウェブサイトhttps://www.grantthornton.global/en/は、使用されているすべてのjavascriptでchromeの[ネットワーク]タブを使用しているため、Googleアナリティクス(analytics.js)を使用しています。Pythonを使用してウェブサイトで使用されているすべてのjavascriptをスクラップします

analytics.jsがgoogle-tag-managerを通じて読み込まれるため、ソースコードだけでanalytics.jsの使用を判断することはできません。 私の現在のアプローチは、セレンを使ってウェブサイトをロードし、すべてのデータをbrowsermob-proxyで記録することです。私は、URLをチェックすることによって、アクセスされたすべてのJavaScript(例:https://www.google-analytics.com/analytics.js)を確認することができます
をこれよりも良い方法はあります:

from selenium import webdriver 
from browsermobproxy import Server 
import pprint, time 

server = Server("browsermob-proxy-2.1.4\\bin\\browsermob-proxy") 
server.start() 
proxy = server.create_proxy({'captureHeaders': True, 'captureContent': True, 'captureBinaryContent': True}) 

service_args = ["--proxy=%s" % proxy.proxy, '--ignore-ssl-errors=yes'] 
driver = webdriver.PhantomJS("phantomjs-2.1.1-windows\\bin\\phantomjs", service_args=service_args) 
proxy.new_har() 
driver.get('URL GOES HERE') 
time.sleep(3) 
all_requests = [entry['request']['url'] for entry in proxy.har['log']['entries']] 

pp = pprint.PrettyPrinter(indent=4) 
pp.pprint(proxy.har) 

はEDIT: ソリューションフロランBのアプローチに基づきます。 webdriverをはphantomjsの代わりにダウンロードする必要があるクロムwebdriverを置き換えられています

from selenium import webdriver 
import pprint, time 

driver = webdriver.Chrome('chromedriver.exe') 
driver.get("https://www.URLGOESHERE.com") 
time.sleep(3) 
scripts = driver.execute_script("""return window.performance.getEntriesByType("resource").filter(e => e.initiatorType === 'script').map(e => e.name.match(/.+\/([^?]+)/)[1]);""") 
driver.close() 

pp = pprint.PrettyPrinter(indent=4) 
pp.pprint(scripts) 
+0

あなたはあなたのコードのトライアルを共有することができます? – DebanjanB

+0

申し訳ありませんが、私は早期に質問を掲載しました。コードが添付されています。 –

+0

特定のコードを改善できるか(おそらくはい)、あるいはあなたの方法論が健全かどうか疑問に思っていますか? –

答えて

0

あなたはまた、window.performance API経由でダウンロードしたすべてのスクリプトを得ることができます:

scripts = driver.execute_script(""" 
    return window.performance.getEntriesByType("resource") 
    .filter(e => e.initiatorType === 'script') 
    .map(e => e.name); 
    """) 
print(scripts) 
+0

これは、javascriptを提供するすべてのURLのリストを生成します。スクリプト自体の名前ではありません。しかし、これはjavascriptの名前がURLの終わりであるので簡単に変換できます。もっとエレガントなソリューションをありがとうございました。 –

+0

は単に 'e.name'をe.name.match(/.+//([^?] +)/)[1]'に置き換えて名前を取得するだけです。 –

関連する問題