[WD+python] Как поймать GET запрос?

Ya hatel yznat kak y vas ydalos pachinit ety problemy.
Ya pitayus zdelat takoi setup:

Cent OS 6.2
Selenium web driver
python
headless browser
browsermob proxy

Moi script vot tyt:

Tolka kagda ya evo zapyskayu ya palychai pystoi HAR output:

[sgalkov@zpub-web-203 ~]$ python display.py
World Wide Web Consortium (W3C)
{u'log': {u'version': u'1.1', u'creator': {u'version': u'2.0', u'name': u'BrowserMob Proxy'}, u'pages': [{u'title': u'', u'startedDateTime': u'2013-01-31T19:22:35.600+0000', u'id': u'w3', u'pageTimings': {}}], u'entries': []}}
[sgalkov@zpub-web-203 ~]$

Esli mozhete podskazat shto nada zdelat shtobi paychit pravilni output bydy ochen blogadarin!

Spasibo.

http://poliarush.com/working/development/chromedriver-python-browsermob-proxy.html

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

Миша, спустя полгода я таки добрался до тасок с участием браузермоб-прокси. Пробую твой код из http://poliarush.com/working/development/chromedriver-python-browsermob-proxy.html (хром+питон). Возвращает пустой har...

это может быть несовместимость версии, надо проверять

хром+питон работает, а вот фф+питон:

>>> profile = webdriver.FirefoxProfile()
>>> profile.set_proxy(proxy.selenium_proxy())

Traceback (most recent call last):
File "<pyshell#12>", line 1, in <module>
profile.set_proxy(proxy.selenium_proxy())
File "C:\Python27\lib\site-packages\selenium\webdriver\firefox\firefox_profile.py", line 225, in set_proxy
self._set_manual_proxy_preference("http", proxy.http_proxy)
File "C:\Python27\lib\site-packages\selenium\webdriver\firefox\firefox_profile.py", line 245, in _set_manual_proxy_preference
self.set_preference("network.proxy.%s_port" % key, int(host_details[2]))
IndexError: list index out of range

в чем проблема, подскажите пожалуйста?

Попробуйте

driver = webdriver.Firefox(proxy=your_proxy)

У меня так заработало на FF

Предполагаю, что Вы исользуете что-то типа

proxy.http_proxy = '<domain>:<port>'

Вместо этого попробуйте:

proxy.http_proxy = 'http://<domain>:<port>'

я использую вот этот пример:

from browsermobproxy import Server
server = Server("path/to/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("google")
driver.get("http://www.google.co.uk")
proxy.har # returns a HAR JSON blob

server.stop()
driver.quit()

на шаге:

>>> profile.set_proxy(proxy.selenium_proxy())

получаю ошибку:

Traceback (most recent call last):
File "<pyshell#9>", line 1, in <module>
profile.set_proxy(proxy.selenium_proxy())
File "C:\Python27\lib\site-packages\selenium\webdriver\firefox\firefox_profile.py", line 225, in set_proxy
self._set_manual_proxy_preference("http", proxy.http_proxy)
File "C:\Python27\lib\site-packages\selenium\webdriver\firefox\firefox_profile.py", line 245, in _set_manual_proxy_preference
self.set_preference("network.proxy.%s_port" % key, int(host_details[2]))
IndexError: list index out of range

похоже, что proxy.selenium_proxy() возвращает неверный формат объекта, который впоследствии используется в настройке профиля

раньше этот код работал, какую версии selenium, broswermob и ff вы используете?

Ага, это баг в selenium.

Как workaround используйте, как Вам уже осоветовал @furious_duck, вместо:

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

используйте:

driver = webdriver.Firefox(proxy=proxy.selenium_proxy())

Спасибо за ответы и советы!

>>> from browsermobproxy import Server
>>> server = Server(r"c:\browsermob\bin\browsermob-proxy.bat")
>>> server.start()
>>> proxy = server.create_proxy()
>>> from selenium import webdriver
>>> driver = webdriver.Firefox(proxy=proxy.selenium_proxy())

Traceback (most recent call last):
File "<pyshell#5>", line 1, in <module>
driver = webdriver.Firefox(proxy=proxy.selenium_proxy())
TypeError: __init__() got an unexpected keyword argument 'proxy'

FF 14.0.1; browsermob-proxy-2.0-beta-8; selenium 2.25.0. НО после обновления до selenium 2.33.0 этот вариант заработал!!!

а вариант:

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

слетает с той же ошибкой


Есть еще один вопрос, извиняюсь за навязчивость :slight_smile:

Как средствами python из большого лога proxy.har достать определенный урл, зная только его часть?

Я для себя что-то вот такое написал. Правда я возвращаю ещё и ответ.

from collections import namedtuple

def find_in_har(source, key_to_find, match, extract):
    values_list = []
 
    def find_key(source, key_to_find):
        for key in source:
            if key == key_to_find:
                values_list.append(source)
            if isinstance(source[key], dict):
                find_key(source[key], key_to_find)
            if isinstance(source[key], list):
                for source_dict in source[key]:
                    find_key(source_dict, key_to_find)
 
    find_key(source, key_to_find)
    return map(extract, filter(match, values_list))
 
def find_requests_in_har(source, url_contains):
 
    ResponseUrl = namedtuple("ResponseUrl", ['url', 'status'])
 
    def match(entry):
        return url_contains in entry['request'].get('url', '')
 
    def extract(entry):
        return ResponseUrl(
                url=entry['request']['url'], 
                status=entry.get('response', {}).get('status'))
 
    return find_in_har(source, 'request', match, extract)

в данных proxy.har нет response. Как прочать именно response запроса?