Javascript 使用python在网站上清除所有使用过的Java脚本

Javascript 使用python在网站上清除所有使用过的Java脚本,javascript,python,selenium,google-analytics,screen-scraping,Javascript,Python,Selenium,Google Analytics,Screen Scraping,我正在寻找一种方法来确定网站上使用的所有Java脚本的名称。使用请求库简单地下载网站的源代码是不合适的,因为这不会产生所使用的所有Java脚本。 例如,该网站使用Google Analytics(Analytics.js),正如使用chrome的“网络”选项卡可以看到的那样,所有使用的Java脚本 但是,由于analytics.js是通过google tag manager加载的,因此您无法仅通过sourcode确定analytics.js的使用情况。 我目前的方法是使用selenium加载网站

我正在寻找一种方法来确定网站上使用的所有Java脚本的名称。使用请求库简单地下载网站的源代码是不合适的,因为这不会产生所使用的所有Java脚本。 例如,该网站使用Google Analytics(Analytics.js),正如使用chrome的“网络”选项卡可以看到的那样,所有使用的Java脚本

但是,由于analytics.js是通过google tag manager加载的,因此您无法仅通过sourcode确定analytics.js的使用情况。 我目前的方法是使用selenium加载网站,并通过browsermob代理记录所有数据。然后,我可以通过检查URL(示例:)
还有比这更好的方法吗:

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)
编辑: 基于Florent B方法的解决方案。webdriver已被需要下载的chrome webdriver取代,而不是phantomjs:

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)

您还可以通过API获取所有下载的脚本:


你能分享你的代码测试吗?对不起,我过早地发布了这个问题;代码现在已附加。您是否想知道您的特定代码是否可以改进(可能是的),或者您的方法是否合理?两者都很低效,我可以想象,许多边缘案例没有被考虑。有没有更优雅的方法?这会产生一个提供Java脚本的所有URL的列表。而不是脚本本身的名称。但是,这可以很容易地转换,因为javascript的名称是URL的结尾。感谢您提供了更优雅的解决方案。只需将
e.name
替换为
e.name.match(+/.+\/([^?]+)/)[1]
即可获得名称。
scripts = driver.execute_script("""
  return window.performance.getEntriesByType("resource")
    .filter(e => e.initiatorType === 'script')
    .map(e => e.name);
  """)
print(scripts)