Вводная
Некоторое время назад я написал небольшую статью о browsermob-proxy http://poliarush.com/working/development/chromedriver-python-browsermob-proxy.html для использования на http://lessons2.ru, где попытался изложить, как использовать этот чудный инструмент для ChromeWebdriver. Но так сложилось, что до сих пор многие задают вопросы на частных консультациях, как же все таки с ним работать и не знают как запустить прокси и получить данные.
И все же, что такое browsermob-proxy? Это отдельный инструмент\библиотека, которая запускает прокси сервер и собирает данные, которые прошли через этот прокси сервер для последующей обработки в формате json. Формат данных еще называется HAR - HTTP Archive Specification. Вы уже его могли видеть, когда открывали developers tools в chrome.
Что будем использовать? Инсталляция
Для работы нам потребуются browsermob-proxy-py инсталируем его через pip
pip install browsermob-proxy
и сама библиотека browsermob-proxy, которая все будет выполнять.
- Скачиваем browsermob-proxy http://bmp.lightbody.net/
- Копируем в какую-то папку на жестком диске, например
c:\Program Files (x86)\browsermob-proxy\
Для того чтобы формировать запросы на сервер мы будем использовать python библиотеку requests Requests: HTTP for Humans™ — Requests 2.30.0 documentation в силу ее простоты.
А дальше простой кодинг и ничего лишнего.
Наша задача
- Запустить прокси сервер
- Настроить браузер на использование прокси сервера
- Выполнить загрузку http://google.com в браузере
- Считать данные с прокси сервера
Основы
Для того, чтобы понять как работает browsermob-proxy нам нужен браузер и интерпретатор python.
1. Запустить прокси сервер
Открываем интерпретатор python и пишем следующие строки:
from browsermobproxy import Server
server = Server(r"c:\Program Files (x86)\browsermob-proxy\bin\browsermob-proxy")
server.start()
Ну вот и все
Вот еще альтернативный вариант, если вам сам сервер нужно запустить на другом порту
from browsermobproxy import Server
server = Server(r"c:\Program Files (x86)\browsermob-proxy\bin\browsermob-proxy", , {"port":9090})
server.start()
Но это порт для веб-сервера, а не для прокси сервера. Об этом более детально в шаге 2.
Как убедиться, что сервер нормально работает? Если при старте у вас не было ошибки, то все хорошо. Можно также запустить netstat -a
и прослушать какие порты заняты
2. Настроить браузер на использование прокси сервера
В первом шаге мы узнали, что есть какой-то порт прокси сервера, на который нужно настроить браузер. Как его узнать? Только через прогон программного кода. Запускаем дальше команды в интерпретаторе:
import requests
resp = requests.post('http://localhost:8080/proxy', {})
resp
resp.content
Мы должны получить
In [95]: resp
Out[95]: <Response [200]>
In [96]: resp.content
Out[96]: '{"port":9097}'
Вот это и есть наш порт, т.е. фактически мы его получаем при первом POST запросе на веб-сервер. Ну а теперь нам надо просто вычленить номер порта и сохранить
port = resp.json()['port']
Ну а теперь просто надо открыть какой-то браузер и настроить на работу через прокси host = localhost и port = 9097
3. Выполнить загрузку http://google.com в браузере
И так теперь у нас есть уже включенный прокси и настроенный браузер. Теперь в браузере заходим на урл http://localhost:8080/proxy/9097/har
и смотрим, что идет через прокси. Но там будет просто пустая страница, потому что еще никаких действий не было. Для того, чтобы начать сессию мониторинга Вам нужно нотифицировать об этом прокси сервер. Как это сделать? Надо сделать PUT запрос на прокси сервер
resp = requests.put('http://localhost:8080/proxy/9097/har', {"initialPageRef": "google"})
Далее идем в браузер с прокси и открываем урл http://google.com.
4. Считать данные с прокси сервера
Через прокси прошли уже данные, теперь нам надо считать их. Как это можно сделать?
resp = requests.get('http://localhost:8080/proxy/9097/har')
resp.content
resp.json()
В общем, весь лог прикладывать не буду, только часть чтобы все было читабельно
In [111]: resp.content
Out[111]: '{"log":{"browser":{"name":"Firefox","version":"23.0"},"creator":{"nam
e":"BrowserMob Proxy","version":"2.0"},"pages":[{"pageTimings":{},"startedDateTi
me":"2013-10-09T21:26:49.391+0000","id":"Page 1","title":""}],"version":"1.1","e
ntries":[{"request":{"queryString":[],"cookies":[],"bodySize":0,"url":"http://oc
sp.thawte.com/","httpVersion":"HTTP","headersSize":0,"method":"POST","headers":[
]},"response":{"cookies":[],"bodySize":1425,"httpVersion":"HTTP","headersSize":0
,"statusText":"Ok","redirectURL":"","content":{"size":1425,"mimeType":"applicati
on/ocsp-response"},"headers":[],"status":200},"startedDateTime":"2013-10-09T21:2
9:56.647+0000","timings":{"blocked":1,"dns":195,"connect":336,"send":0,"wait":33
5,"receive":2},"pageref":"Page 1","serverIPAddress":"199.7.57.72","time":868,"ca
In [114]: resp.json()
Out[114]:
{u'log': {u'browser': {u'name': u'Firefox', u'version': u'23.0'},
u'creator': {u'name': u'BrowserMob Proxy', u'version': u'2.0'},
u'entries': [{u'cache': {},
u'pageref': u'google',
u'request': {u'bodySize': 0,
u'cookies': [],
u'headers': [],
u'headersSize': 0,
u'httpVersion': u'HTTP',
u'method': u'GET',
u'queryString': [],
u'url': u'http://download.cdn.mozilla.net/pub/mozilla.org/firefox/releases/
24.0/update/win32/en-US/firefox-23.0.1-24.0.partial.mar'},
u'response': {u'bodySize': 300000,
Эту же информацию мы можем посмотреть визуально через браузер, если зайдем на урл http://localhost:8080/proxy/9097/har
А дальше уже дело за Вами, точнее за вашими потребностями, ведь считать конкретные данные с словаря в Python не составляет особого труда
In [115]: resp.json()['log']['browser']['name']
Out[115]: u'Firefox'
Дополнение
Многое из того, что я показывал уже реализовано в клиенте browsermob-proxy-py. Просто берите и используйте! А зачем я тогда это все рассказывал? Чтобы Вы поняли суть, применение высокоуровневого API значительно проще, если понятна концепция.
from browsermobproxy import Server, Client
server = Server(r"c:\Program Files (x86)\browsermob-proxy\bin\browsermob-proxy")
server.start()
client = Client("localhost:8080")
client.port
client.new_har('google')
client.har
В итоге получаем вот такой вот вывод:
In [1]: from browsermobproxy import Server, Client
In [2]: server = Server(r"c:\Program Files (x86)\browsermob-proxy\bin\browsermob
-proxy")
In [3]: server.start()
In [6]: client = Client("localhost:8080")
In [7]: client.port
Out[7]: 9091
# configure browser with proxy server settings here
In [8]: client.new_har('google')
Out[8]: (204, None)
# open http://google.com here
In [9]: client.har
Out[9]:
{u'log': {u'browser': {u'name': u'Firefox', u'version': u'23.0'},
u'creator': {u'name': u'BrowserMob Proxy', u'version': u'2.0'},
u'entries': [{u'cache': {},
u'pageref': u'google',
u'request': {u'bodySize': 0,
u'cookies': [],
u'headers': [],
u'headersSize': 0,
u'httpVersion': u'HTTP',
u'method': u'GET',
u'queryString': [],
u'url': u'http://www.google.com/'},
u'response': {u'bodySize': 258,
u'content': {u'mimeType': u'text/html; charset=UTF-8', u'size': 258},
u'cookies': [],
u'headers': [],
u'headersSize': 0,
u'httpVersion': u'HTTP',
u'redirectURL': u'',
u'status': 302,
u'statusText': u'Found'},
u'serverIPAddress': u'74.125.143.105',
u'startedDateTime': u'2013-10-09T22:34:45.022+0000',
u'time': 297,
u'timings': {u'blocked': 9,
u'connect': 78,
u'dns': 93,
u'receive': 29,
u'send': 0,
u'wait': 97}},
{u'cache': {},
u'pageref': u'google',
u'request': {u'bodySize': 0,
u'cookies': [],
u'headers': [],
u'headersSize': 0,
u'httpVersion': u'HTTP',
u'method': u'GET',
u'queryString': [{u'name': u'gws_rd', u'value': u'cr'},
{u'name': u'ei', u'value': u'BdpVUvK9Cc_KswamroG4Dw'}],
u'url': u'http://www.google.se/?gws_rd=cr&ei=BdpVUvK9Cc_KswamroG4Dw'},
u'response': {u'bodySize': 259,
u'content': {u'mimeType': u'text/html; charset=UTF-8', u'size': 259},
u'cookies': [],
u'headers': [],
u'headersSize': 0,
u'httpVersion': u'HTTP',
u'redirectURL': u'',
u'status': 302,
u'statusText': u'Found'},
u'serverIPAddress': u'74.125.143.94',
u'startedDateTime': u'2013-10-09T22:34:45.325+0000',
u'time': 226,
u'timings': {u'blocked': 0,
u'connect': 70,
u'dns': 60,
u'receive': 0,
u'send': 0,
u'wait': 96}}],
u'pages': [{u'id': u'google',
u'pageTimings': {},
u'startedDateTime': u'2013-10-09T22:34:22.758+0000',
u'title': u''}],
u'version': u'1.1'}}
Вывод
Не нужно делать вывод, что browsermob-proxy какой-то замороченный тул с которым не понятно как работать. Как видно из приведенного примера, все просто и очень наглядно, и Вы можете смело его использовать, как для автоматизации тестирования, так и для ручного тестирования, где прослеживаете все запросы через прокси. В общем, решать как всегда Вам.
Это был Поляруш Михаил, хорошей Вам автоматизации! И я очень жду, что
Вы поддержите меня и начнете писать подобные заметки в базу знаний. Удачи и подписывайтесь на RSS канал базы знаний ! А кто хочет обучиться автоматизации заходите на http://lessons2.ru