Почему не просит.получить() возвращают? Что такое тайм-аут по умолчанию, который запрашивает.получить() использует?


В моем скрипте, 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 64

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)