无法使用带有BrowserMob代理的Python Selenium脚本捕获HAR

2024-04-24 05:51:27 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

BrowserMob代理说明: 如前所述,我同时使用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中提供的……如果有人能对这个混乱的区域有所了解(我怀疑这是下面描述的问题的根源),那么我将非常感激。

软件规格:

  • 操作系统: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

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

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

"""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。我还注意到,当尝试使用此浏览器访问任何其他站点时,它也将同样无法加载(我怀疑这是由于未正确配置代理)。


Tags: browser脚本com代理serverdriverseleniumgoogle
3条回答

试试这个:

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()

我使用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()

然后你会找到你的

相关问题 更多 >