Почему не просит.получить() возвращают? Что такое тайм-аут по умолчанию, который запрашивает.получить() использует?
В моем скрипте, requests.get
никогда не возвращает:
import requests
print ("requesting..")
# This call never returns!
r = requests.get(
"http://www.justdial.com",
proxies = {'http': '222.255.169.74:8080'},
)
print(r.ok)
в чем может быть возможная причина(ы)? Какое-нибудь лекарство? Что такое тайм-аут по умолчанию, что get
использует?
3 ответа:
каков тайм-аут по умолчанию, который используется get?
по умолчанию
None
, что означает, что он будет ждать (зависать), пока соединение не будет закрыто.что происходит, когда вы передаете значение тайм-аута?
r = requests.get( 'http://www.justdial.com', proxies={'http': '222.255.169.74:8080'}, timeout=5 )
вы можете сказать запросы, чтобы остановить ожидание ответа после заданного количество секунд с параметром timeout:
>>> requests.get('http://github.com', timeout=0.001) Traceback (most recent call last): File "<stdin>", line 1, in <module> requests.exceptions.Timeout: HTTPConnectionPool(host='github.com', port=80): Request timed out. (timeout=0.001)
Примечание:
тайм-аут-это не ограничение по времени на всю загрузку ответа; скорее, исключение возникает, если сервер не выдал ответа тайм-аут секунд (точнее, если байты не были получены на базовое гнездо для таймаут).
это происходит много для меня, что просит.получить() занимает очень много времени, чтобы вернуться, даже если
timeout
1 секунда. Есть несколько способов преодолеть эту проблему:1. Используйте
TimeoutSauce
внутренний классот: https://github.com/kennethreitz/requests/issues/1928#issuecomment-35811896
import requests from requests.adapters import TimeoutSauce class MyTimeout(TimeoutSauce): def __init__(self, *args, **kwargs): connect = kwargs.get('connect', 5) read = kwargs.get('read', connect) super(MyTimeout, self).__init__(connect=connect, read=read) requests.adapters.TimeoutSauce = MyTimeout
этот код должен заставить нас установить таймаут равным тайм-аут подключения-это значение тайм-аута, которое вы передаете Сессия.get () call. (Заметьте, что я не тестировал этот код, так возможно, потребуется быстрая отладка, я просто написал ее прямо в Окна на GitHub.)
2. Используйте вилку запросов от кевинбурка:https://github.com/kevinburke/requests/tree/connect-timeout
из его документации: https://github.com/kevinburke/requests/blob/connect-timeout/docs/user/advanced.rst
если вы укажете одно значение для таймаута, например:
r = requests.get('https://github.com', timeout=5)
значение таймаута будет применено как к соединению, так и к чтению таймауты. Укажите кортеж, если вы хотите установить значения отдельно:
r = requests.get('https://github.com', timeout=(3.05, 27))
Примечание: с тех пор изменения были объединены с основными запросами проект.
3. Используя
evenlet
илиsignal
как уже упоминалось в аналогичном вопросе: тайм-аут для запросов python.получить полный ответ
проанализировала все ответы и пришел к выводу, что проблема все еще существует. На некоторых сайтах запросы могут висеть бесконечно и использование многопроцессорной обработки кажется излишним. Вот мой подход (Python 3.5+):
import asyncio import aiohttp async def get_http(url): async with aiohttp.ClientSession(conn_timeout=1, read_timeout=3) as client: try: async with client.get(url) as response: content = await response.text() return content, response.status except Exception: pass loop = asyncio.get_event_loop() task = loop.create_task(get_http('http://example.com')) loop.run_until_complete(task) result = task.result() if result is not None: content, status = task.result() if status == 200: print(content)