HTTPS-запрос со стандартной библиотекой Python - PullRequest
0 голосов
/ 19 марта 2020

ОБНОВЛЕНИЕ: мне удалось сделать запрос с urllib2, но мне все еще интересно, что здесь происходит.

Я бы хотел сделать HTTPS-запрос с Python.

Это прекрасно работает с модулем запросов, но я не хочу использовать внешние зависимости, поэтому я хотел бы использовать стандартную библиотеку.

httplib

Когда Я следую этому примеру Я не получил ответа. Вместо этого я получаю тайм-аут. У меня нет идей относительно того, что могло бы вызвать это.

Код:

import requests
print requests.get('https://python.org')

from httplib import HTTPSConnection
conn = HTTPSConnection('www.python.org')
conn.request('GET', '/index.html')
print conn.getresponse()

Вывод:

<Response [200]>
Traceback (most recent call last):
  File "test.py", line 6, in <module>
    conn.request('GET', '/index.html')
  File "C:\Python27\lib\httplib.py", line 1069, in request
    self._send_request(method, url, body, headers)
  File "C:\Python27\lib\httplib.py", line 1109, in _send_request
    self.endheaders(body)
  File "C:\Python27\lib\httplib.py", line 1065, in endheaders
    self._send_output(message_body)
  File "C:\Python27\lib\httplib.py", line 892, in _send_output
    self.send(msg)
  File "C:\Python27\lib\httplib.py", line 854, in send
    self.connect()
  File "C:\Python27\lib\httplib.py", line 1282, in connect
    HTTPConnection.connect(self)
  File "C:\Python27\lib\httplib.py", line 831, in connect
    self.timeout, self.source_address)
  File "C:\Python27\lib\socket.py", line 575, in create_connection
    raise err
socket.error: [Errno 10060] A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond

urllib

Это не по другой (но, возможно, связанной) причине. Код:

import urllib
print urllib.urlopen("https://python.org")

Вывод:

Traceback (most recent call last):
  File "test.py", line 10, in <module>
    print urllib.urlopen("https://python.org")
  File "C:\Python27\lib\urllib.py", line 87, in urlopen
    return opener.open(url)
  File "C:\Python27\lib\urllib.py", line 215, in open
    return getattr(self, name)(url)
  File "C:\Python27\lib\urllib.py", line 445, in open_https
    h.endheaders(data)
  File "C:\Python27\lib\httplib.py", line 1065, in endheaders
    self._send_output(message_body)
  File "C:\Python27\lib\httplib.py", line 892, in _send_output
    self.send(msg)
  File "C:\Python27\lib\httplib.py", line 854, in send
    self.connect()
  File "C:\Python27\lib\httplib.py", line 1290, in connect
    server_hostname=server_hostname)
  File "C:\Python27\lib\ssl.py", line 369, in wrap_socket
    _context=self)
  File "C:\Python27\lib\ssl.py", line 599, in __init__
    self.do_handshake()
  File "C:\Python27\lib\ssl.py", line 828, in do_handshake
    self._sslobj.do_handshake()
IOError: [Errno socket error] [SSL: UNKNOWN_PROTOCOL] unknown protocol (_ssl.c:727)

Какие запросы выполняются, что делает его успешным в случае сбоя обеих этих библиотек?

1 Ответ

1 голос
/ 19 марта 2020

requests.get без параметра timeout означает отсутствие времени ожидания вообще. httplib.HTTPSConnection принять параметр timeout в Python 2.6 и новее в соответствии с httplib docs . Если ваша проблема была вызвана тайм-аутом, может помочь установка достаточно высокого тайм-аута. Попробуйте заменить:

conn = HTTPSConnection('www.python.org')

на:

conn = HTTPSConnection('www.python.org', timeout=300)

, что даст 300 секунд (5 минут) на обработку.

...