目标: 我想通过BrowserMob-Proxy运行Selenium Python脚本,它将捕获并输出HAR文件捕获。
问题: 我有一个功能(非常基本)的Python脚本(如下所示)。当改变它以利用BrowserMob-Proxy来捕获HAR时,它会失败。下面我提供两个不同的脚本都失败了,但出于不同的原因(在代码片段后提供的详细信息)。
BrowserMob-Proxy说明: 如前所述,我使用的是0.6.0和2.0-beta-8。这样做的原因是A)LightBody(BMP的首席设计师)最近表示他最新版本(2.0-beta-9)不起作用,建议用户使用2.0-beta-8而不是B)。通过阅读各种站点/ stackoverflow信息告诉我,0.6.0(通过PIP获取)用于调用Client.py/Server.py,而2.0-beta-8用于启动服务器。说实话,这让我很困惑。然而,当导入BMP的服务器时,它需要一个批处理(.bat)文件来启动服务器,这在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
此脚本成功运行,不会产生任何错误。它仅用于说明目的,表明它在添加BMP逻辑之前有效。
脚本ALPHA与BMP(不起作用):
"""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()
此代码将成功运行脚本,不会产生任何错误。但是,在搜索我的整个硬盘时,我从未成功找到ALPHA_HAR.har。
使用BMP编写BETA脚本(不起作用):
"""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()
此代码取自http://browsermob-proxy-py.readthedocs.org/en/latest/。运行上述代码时,FireFox将尝试获取google.com,但永远不会成功加载页面。最终会超时而不会产生任何错误。并且在我的硬盘驱动器上的任何地方都找不到BETA_HAR.har。我还注意到,当尝试使用此浏览器访问任何其他站点时,它同样无法加载(我怀疑这是由于代理未正确配置)。
答案 0 :(得分:2)
我使用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()
答案 1 :(得分:2)
试试这个:
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()
答案 2 :(得分:1)
对我有用的是将Java版本降级为java11。我使用jenv来安装和管理多个Java版本。
答案 3 :(得分:0)
当你这样做时:
proxy.har
你需要解析那个响应,proxy.har是一个JSON对象,所以如果你需要生成一个文件,你需要这样做:
myFile = open('BETA_HAR.har','w')
myFile.write( str(proxy.har) )
myFile.close()
然后你会找到你的.har
答案 4 :(得分:0)
本质上,代理生成的HAR对象就是:内存中的对象。您无法在硬盘上找到它的原因是因为除非您自己在那里写它,否则它不会保存在那里。这是一个非常简单的操作,因为HAR只是JSON。
with open("harfile", "w") as harfile:
harfile.write(json.dumps(proxy.har))
当你开始转储你的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会在实际获取所有元素之前报告网页已加载,因此您的代理服务器过早关闭。尝试让脚本等待一段时间再关闭代理,或者通过解释器以交互方式运行它。