Измеряйте время загрузки веб-сайта с помощью запросов Python

Я пытаюсь создать инструмент для тестирования задержки моего интернет-соединения, а точнее времени загрузки веб-сайта. Я подумал об использовании модуля python requests для части загрузки.

Проблема в том, что у него нет встроенных функций для измерения времени, необходимого для получения полного ответа. Для этого я подумал, что буду использовать модуль timeit.

В чем я не уверен, так это в том, что если я запускаю timeit так:

t = timeit.Timer("requests.get('http://www.google.com')", "import requests")

Я действительно измеряю время, которое потребовалось для получения ответа, или это время, необходимое для создания, отправки, получения запроса и т. д.? Я предполагаю, что могу игнорировать это время выполнения, так как я тестирую сети с очень большими задержками (~ 700 мс)?

Есть ли лучший способ сделать это программно?


person cookM    schedule 22.06.2012    source источник


Ответы (3)


Что касается вашего вопроса, это должно быть общее время для

  1. время для создания объекта запроса
  2. Послать запрос
  3. Получить ответ
  4. Разобрать ответ (см. комментарий Томаса Ороско)

Другие способы измерить время загрузки одного запроса — использовать urllib:

nf = urllib.urlopen(url)
start = time.time()
page = nf.read()
end = time.time()
nf.close()
# end - start gives you the page load time
person pyfunc    schedule 22.06.2012
comment
+ 4. разобрать HTTP-ответ - person Thomas Orozco; 22.06.2012
comment
Выглядит очень красиво, но, глядя на один из примеров, я вижу 1. start_timer = time.time() 2. Open Browser + Read Response 3. latency = time.time() - start_timer Будет ли это похоже на ту же проблему? - person cookM; 22.06.2012
comment
@cookM: я не видел в этом проблемы, а увидел в реальном времени, какой будет задержка запроса. На самом деле это среднее значение по многим запросам, которое будет ближе к реальному времени. - person pyfunc; 22.06.2012
comment
#cookM: в вики есть более подробная информация о профилировании лимитов загрузки: code.google.com /p/multi-mechanize/wiki/AdvancedScripts - person pyfunc; 22.06.2012
comment
@pyfunc Только что увидел ваше редактирование, я думаю, что этот фрагмент — именно то, что я искал. Я не очень хорошо знаком с urllib, но я предполагаю, что когда я выдаю nf.read(), я отправляю запрос и получаю его обратно правильно? - person cookM; 22.06.2012
comment
Ницца! Похоже, в вики есть много полезной информации (да). Попробую мультимеханизировать. Большое спасибо за твою помощь. - person cookM; 22.06.2012
comment
@cookM: Да, когда вы делаете nf.read(), вы делаете все четыре, упомянутые выше, но для реалистичного профиля нагрузки я бы посоветовал вам попробовать мультимеханизировать. Это немного сложнее, чем фрагмент, но имеет реальную отдачу. - person pyfunc; 22.06.2012
comment
urlopen, похоже, блокируется до тех пор, пока не появятся заголовки, поэтому я бы поставил начальное назначение раньше. - person Janus Troelsen; 23.03.2013
comment
Я бы сказал, что это очень мало говорит о веб-сайте. Веб-сайт — это не только ответ на запрос, но и все последующие запросы html и ajax.... Что я упускаю? - person ; 17.08.2014
comment
Привет @pyfunc, я только что прочитал твой ответ. Можно детализировать время по каждому вашему пункту? Например, сколько времени требуется для отправки запроса, сколько времени требуется серверу для его обработки и т. д. - person Gregorius Edwadr; 05.04.2017
comment
Эта ссылка кажется зараженной. Переносит вас на рекламный сайт: как, где и стоит ли покупать подписчиков в Instagram - person agent nate; 27.05.2017

В последней версии запросов есть такой функционал:

https://requests.readthedocs.io/en/latest/api/?highlight=elapsed#requests.Response.elapsed

Например:

requests.get("http://127.0.0.1").elapsed.total_seconds()
person TJL    schedule 09.01.2014
comment
чтобы получить время ответа в секундах: requests.get("http://127.0.0.1").elapsed.total_seconds() - person Michael Osl; 04.04.2014
comment
Чтобы добавить к комментарию Микаэля Осла: total_seconds() - это десятичное число, которое, кажется, имеет микросекундную точность. - person Luc; 14.05.2016
comment
Не используйте это для профилирования и оптимизации кода на стороне клиента. Он измеряет только время отклика сервера (это был вопрос ОП). Количество времени, прошедшее между отправкой запроса и получением ответа (как timedelta). Это свойство специально измеряет время, прошедшее между отправкой первого байта запроса и завершением синтаксического анализа заголовков. Поэтому на него не влияет потребление содержимого ответа или значения аргумента ключевого слова потока. — docs. - person ChaimG; 29.06.2016
comment
@GvS как насчет Python 3 и urllib3? - person Heinz; 16.10.2017

response.elapsed возвращает объект timedelta со временем, прошедшим с момента отправки запроса до получения ответа. Он часто используется для прекращения соединения через определенный момент времени elapsed.

# import requests module 
import requests 
  
# Making a get request 
response = requests.get('http://stackoverflow.com/') 
  
# print response 
print(response) 
  
# print elapsed time 
print(response.elapsed)

выход:

<Response [200]>
0:00:00.343720
person Milovan Tomašević    schedule 19.02.2021