Почему не просит.получить() возвращают? Что такое тайм-аут по умолчанию, который запрашивает.получить() использует?
В моем скрипте, 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)Примечание:
тайм-аут-это не ограничение по времени на всю загрузку ответа; скорее, исключение возникает, если сервер не выдал ответа тайм-аут секунд (точнее, если байты не были получены на базовое гнездо для таймаут).
это происходит много для меня, что просит.получить() занимает очень много времени, чтобы вернуться, даже если
timeout1 секунда. Есть несколько способов преодолеть эту проблему: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)