Не удается захватить HAR с помощью Python Selenium Script с BrowserMob-Proxy

Цель: я хочу запустить скрипт Selenium Python через BrowserMob-Proxy, который будет захватывать и выводить захват файла 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-бета-8 используется для запуска сервера. Честно говоря, меня это смущает. Однако при импорте сервера BMP требуется пакетный файл (.bat) для запуска сервера, который не предоставляется в 0.6.0, но есть в 2.0-бета-8... если кто-нибудь может пролить свет на эту область замешательство (я подозреваю, что это корень моих проблем, описанных ниже), тогда я был бы очень признателен.

Спецификации программного обеспечения:

  • Операционная система: Windows 7 (64x) — работает в VirtualBox
  • Браузер: FireFox (32.0.2)
  • Язык сценария: Python (2.7.8)
  • Автоматизированный веб-браузер: Selenium (2.43.0) — устанавливается через PIP
  • BrowserMob-Proxy: 0.6.0 И 2.0-бета-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 (не работает):

"""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 нигде не может быть найден на моем жестком диске. Я также заметил, что при попытке использовать этот браузер для посещения любого другого сайта он также не загружается (я подозреваю, что это связано с неправильной настройкой прокси-сервера).


person Civic_Matt    schedule 25.09.2014    source источник


Ответы (5)


Я использую 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()
person user2415430    schedule 15.01.2015

Попробуй это:

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()
person Paras Dahal    schedule 16.08.2015
comment
Я получаю ошибку ниже. raceback (последний последний вызов): файл e:sample.py, строка 10, в ‹module› profile.set_proxy(self.proxy.selenium_proxy()) NameError: имя 'self' не определено - person NaveenKumar Namachivayam; 10.05.2016

Что сработало для меня, так это понизить версию Java до java11. Я использовал jenv для установки и управления несколькими версиями Java.

person 1__elephant__1    schedule 01.04.2020

Когда вы делаете:

proxy.har

Вам нужно проанализировать этот ответ, proxy.har — это объект JSON, поэтому, если вам нужно сгенерировать файл, вам нужно сделать это:

myFile = open('BETA_HAR.har','w')
myFile.write( str(proxy.har) )
myFile.close()

Тогда вы найдете свой .har

person José Castro    schedule 15.04.2015

Поиск вашего HAR-файла

По сути, объект 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)

Я предполагаю, что ваша проблема связана с самим прокси. Проверьте файлы bmp.log и/или server.log в расположении скрипта Python и посмотрите, что он говорит, если что-то пойдет не так.

Другая альтернатива заключается в том, что селен сообщает, что веб-страница загрузилась до того, как она на самом деле закончила получать все элементы, и поэтому ваш прокси отключается слишком рано. Попробуйте заставить сценарий ждать немного дольше, прежде чем выключать прокси-сервер, или запускать его в интерактивном режиме через интерпретатор.

person Da Chucky    schedule 14.05.2018