Can';t使用带有BrowserMob代理的Python Selenium脚本捕获HAR

Can';t使用带有BrowserMob代理的Python Selenium脚本捕获HAR,python,selenium,proxy,har,browsermob,Python,Selenium,Proxy,Har,Browsermob,目标: 我想通过BrowserMob代理运行一个Selenium Python脚本,它将捕获并输出一个HAR文件捕获 问题: 我有一个功能性(非常基本的)Python脚本(如下所示)。然而,当它被更改为使用BrowserMob代理来捕获HAR时,它失败了。下面我将提供两个不同的脚本,它们都失败了,但原因不同(代码片段后面提供了详细信息) 浏览器移动代理解释: 如前所述,我同时使用0.6.0和2.0-beta-8。原因是A)LightBody(BMP的首席设计师)最近表示,他最新的版本(2.0-b

目标: 我想通过BrowserMob代理运行一个Selenium Python脚本,它将捕获并输出一个HAR文件捕获

问题: 我有一个功能性(非常基本的)Python脚本(如下所示)。然而,当它被更改为使用BrowserMob代理来捕获HAR时,它失败了。下面我将提供两个不同的脚本,它们都失败了,但原因不同(代码片段后面提供了详细信息)

浏览器移动代理解释: 如前所述,我同时使用0.6.0和2.0-beta-8。原因是A)LightBody(BMP的首席设计师)最近表示,他最新的版本(2.0-beta-9)不起作用,建议用户改用2.0-beta-8;B)从阅读各种站点/堆栈溢出信息可以看出,0.6.0(通过PIP获得)用于调用Client.py/Server.py,而2.0-beta-8用于启动服务器。老实说,这让我很困惑。然而,当导入BMP的服务器时,它需要一个批处理(.bat)文件来启动服务器,该文件在0.6.0中没有提供,但在2.0-beta-8中有提供……如果有人能解释一下这方面的困惑(我怀疑这是我下面描述的问题的根源),我将不胜感激

软件规格:

"""This script utilizes Selenium to obtain the Google homepage"""
from selenium import webdriver

driver = webdriver.Firefox()       # Opens FireFox browser.
driver.get('https://google.com/')  # Gets google.com and loads page in browser.

driver.quit()                      # Closes Firefox browser
"""Using the same functional Selenium script, produce ALPHA_HAR.har output"""
from browsermobproxy import Server
server = Server('C:\Users\Matt\Desktop\\browsermob-proxy-2.0-beta-8\\bin\\browsermob-proxy')
server.start()
proxy = server.create_proxy()

from selenium import webdriver
driver = webdriver.Firefox()           # Opens FireFox browser.

proxy.new_har("ALPHA_HAR")             # Creates a new HAR
driver.get("https://www.google.com/")  # Gets google.com and loads page in browser.
proxy.har                              # Returns a HAR JSON blob

server.stop()
"""Using the same functional Selenium script, produce BETA_HAR.har output"""
from browsermobproxy import Server
server = Server("C:\Users\Matt\Desktop\\browsermob-proxy-2.0-beta-8\\bin\\browsermob-proxy")
server.start()    
proxy = server.create_proxy()

from selenium import webdriver
profile = webdriver.FirefoxProfile()
profile.set_proxy(proxy.selenium_proxy())
driver = webdriver.Firefox(firefox_profile=profile)

proxy.new_har("BETA_HAR")             # Creates a new HAR
driver.get("https://www.google.com/") # Gets google.com and loads page in browser.
proxy.har                             # Returns a HAR JSON blob

server.stop()
  • 操作系统:Windows 7(64x)——在VirtualBox中运行
  • 浏览器:FireFox(32.0.2)
  • 脚本语言:Python(2.7.8)
  • 自动Web浏览器:Selenium(2.43.0)——通过PIP安装
  • BrowserMob代理:0.6.0和2.0-beta-8——见下面的解释
Selenium脚本(此脚本有效):

"""This script utilizes Selenium to obtain the Google homepage"""
from selenium import webdriver

driver = webdriver.Firefox()       # Opens FireFox browser.
driver.get('https://google.com/')  # Gets google.com and loads page in browser.

driver.quit()                      # Closes Firefox browser
"""Using the same functional Selenium script, produce ALPHA_HAR.har output"""
from browsermobproxy import Server
server = Server('C:\Users\Matt\Desktop\\browsermob-proxy-2.0-beta-8\\bin\\browsermob-proxy')
server.start()
proxy = server.create_proxy()

from selenium import webdriver
driver = webdriver.Firefox()           # Opens FireFox browser.

proxy.new_har("ALPHA_HAR")             # Creates a new HAR
driver.get("https://www.google.com/")  # Gets google.com and loads page in browser.
proxy.har                              # Returns a HAR JSON blob

server.stop()
"""Using the same functional Selenium script, produce BETA_HAR.har output"""
from browsermobproxy import Server
server = Server("C:\Users\Matt\Desktop\\browsermob-proxy-2.0-beta-8\\bin\\browsermob-proxy")
server.start()    
proxy = server.create_proxy()

from selenium import webdriver
profile = webdriver.FirefoxProfile()
profile.set_proxy(proxy.selenium_proxy())
driver = webdriver.Firefox(firefox_profile=profile)

proxy.new_har("BETA_HAR")             # Creates a new HAR
driver.get("https://www.google.com/") # Gets google.com and loads page in browser.
proxy.har                             # Returns a HAR JSON blob

server.stop()
此脚本成功运行,不会产生任何错误。为了说明的目的,在添加BMP逻辑之前指示它工作

使用BMP编写ALPHA脚本(不起作用):

"""This script utilizes Selenium to obtain the Google homepage"""
from selenium import webdriver

driver = webdriver.Firefox()       # Opens FireFox browser.
driver.get('https://google.com/')  # Gets google.com and loads page in browser.

driver.quit()                      # Closes Firefox browser
"""Using the same functional Selenium script, produce ALPHA_HAR.har output"""
from browsermobproxy import Server
server = Server('C:\Users\Matt\Desktop\\browsermob-proxy-2.0-beta-8\\bin\\browsermob-proxy')
server.start()
proxy = server.create_proxy()

from selenium import webdriver
driver = webdriver.Firefox()           # Opens FireFox browser.

proxy.new_har("ALPHA_HAR")             # Creates a new HAR
driver.get("https://www.google.com/")  # Gets google.com and loads page in browser.
proxy.har                              # Returns a HAR JSON blob

server.stop()
"""Using the same functional Selenium script, produce BETA_HAR.har output"""
from browsermobproxy import Server
server = Server("C:\Users\Matt\Desktop\\browsermob-proxy-2.0-beta-8\\bin\\browsermob-proxy")
server.start()    
proxy = server.create_proxy()

from selenium import webdriver
profile = webdriver.FirefoxProfile()
profile.set_proxy(proxy.selenium_proxy())
driver = webdriver.Firefox(firefox_profile=profile)

proxy.new_har("BETA_HAR")             # Creates a new HAR
driver.get("https://www.google.com/") # Gets google.com and loads page in browser.
proxy.har                             # Returns a HAR JSON blob

server.stop()
此代码将成功运行脚本,并且不会产生任何错误。然而,在搜索整个硬盘时,我从未成功找到ALPHA_HAR.HAR

使用BMP编写测试脚本(不起作用):

"""This script utilizes Selenium to obtain the Google homepage"""
from selenium import webdriver

driver = webdriver.Firefox()       # Opens FireFox browser.
driver.get('https://google.com/')  # Gets google.com and loads page in browser.

driver.quit()                      # Closes Firefox browser
"""Using the same functional Selenium script, produce ALPHA_HAR.har output"""
from browsermobproxy import Server
server = Server('C:\Users\Matt\Desktop\\browsermob-proxy-2.0-beta-8\\bin\\browsermob-proxy')
server.start()
proxy = server.create_proxy()

from selenium import webdriver
driver = webdriver.Firefox()           # Opens FireFox browser.

proxy.new_har("ALPHA_HAR")             # Creates a new HAR
driver.get("https://www.google.com/")  # Gets google.com and loads page in browser.
proxy.har                              # Returns a HAR JSON blob

server.stop()
"""Using the same functional Selenium script, produce BETA_HAR.har output"""
from browsermobproxy import Server
server = Server("C:\Users\Matt\Desktop\\browsermob-proxy-2.0-beta-8\\bin\\browsermob-proxy")
server.start()    
proxy = server.create_proxy()

from selenium import webdriver
profile = webdriver.FirefoxProfile()
profile.set_proxy(proxy.selenium_proxy())
driver = webdriver.Firefox(firefox_profile=profile)

proxy.new_har("BETA_HAR")             # Creates a new HAR
driver.get("https://www.google.com/") # Gets google.com and loads page in browser.
proxy.har                             # Returns a HAR JSON blob

server.stop()

此代码取自。当运行上述代码时,FireFox将尝试获取google.com,但永远无法成功加载页面。最终它将超时而不产生任何错误。在我的硬盘上找不到BETA_HAR.HAR。我还注意到,当尝试使用此浏览器访问任何其他站点时,它也同样无法加载(我怀疑这是由于代理未正确配置)。

我使用phantomJS,下面是如何将其与python一起使用的示例:

import browsermobproxy as mob
import json
from selenium import webdriver
BROWSERMOB_PROXY_PATH = '/usr/share/browsermob/bin/browsermob-proxy'
url = 'http://google.com'

s = mob.Server(BROWSERMOB_PROXY_PATH)
s.start()
proxy = s.create_proxy()
proxy_address = "--proxy=127.0.0.1:%s" % proxy.port
service_args = [ proxy_address, '--ignore-ssl-errors=yes', ] #so that i can do https connections
driver = webdriver.PhantomJS(service_args=service_args)
driver.set_window_size(1400, 1050)
proxy.new_har(url)
driver.get(url)
har_data = json.dumps(proxy.har, indent=4)
screenshot = driver.get_screenshot_as_png()
imgname = "google.png"
harname = "google.har"
save_img = open(imgname, 'a')
save_img.write(screenshot)
save_img.close()
save_har = open(harname, 'a')
save_har.write(har_data)
save_har.close()
driver.quit()
s.stop()
当您这样做时:

proxy.har
您需要解析该响应,proxy.har是一个JSON对象,因此如果您需要生成一个文件,您需要执行以下操作:

myFile = open('BETA_HAR.har','w')
myFile.write( str(proxy.har) )
myFile.close()
然后您将找到您的.har

尝试以下操作:

from browsermobproxy import Server
from selenium import webdriver
import json

server = Server("path/to/browsermob-proxy")
server.start()
proxy = server.create_proxy()
profile = webdriver.FirefoxProfile()
profile.set_proxy(self.proxy.selenium_proxy())
driver = webdriver.Firefox(firefox_profile=profile)
proxy.new_har("http://stackoverflow.com", options={'captureHeaders': True})
driver.get("http://stackoverflow.com")    
result = json.dumps(proxy.har, ensure_ascii=False)
print result
proxy.stop()    
driver.quit()
查找您的HAR文件 本质上,代理生成的HAR对象就是:内存中的对象。你在硬盘上找不到它的原因是,除非你自己在那里写,否则它不会保存在那里。这是一个非常简单的操作,因为HAR只是JSON

with open("harfile", "w") as harfile:
    harfile.write(json.dumps(proxy.har))
为什么ALPHA不起作用? 当您开始转储HAR文件时,您会发现您的HAR文件是空的,带有ALPHA脚本。这是因为您没有将代理添加到Firefox的设置中,这意味着它将直接绕过您的代理进行连接

贝塔呢? 虽然我个人更喜欢将代理添加到功能中并通过这些功能传递,但就连接到代理而言,这段代码编写得是正确的。其代码为:

cap = webdriver.DesiredCapabilities.FIREFOX.copy()
proxy.add_to_capabilities(cap)
driver = webdriver.Firefox(capabilities=cap)
我猜你的问题在于代理本身。检查python脚本位置中的bmp.log和/或server.log文件,查看如果出现问题会显示什么


另一种选择是,selenium报告网页在实际获取所有元素之前已经加载,因此您的代理关闭得太早。在关闭代理之前,请尝试让脚本等待更长的时间,或者通过解释器以交互方式运行它。

对我有效的方法是将java版本降级为java11。我使用jenv安装和管理多个java版本。

我发现以下错误。raceback(最近一次调用):profile.set_proxy(self.proxy.selenium_proxy())名称中第10行的文件“e:sample.py”错误:未定义名称“self”