В urllib3 HTTP-запрос зависает ... но не в curl - PullRequest
2 голосов
/ 26 апреля 2019

(Спасибо, что взглянули на это!)

Я пытаюсь использовать python3 и простой urllib3 http.request для чтения HTML из https://login.morganstanleyclientserv.com.

Кажетсякак сервер сбрасывает соединение, и в конечном итоге попытки urllib3 прекращаются.

Есть ли здесь проблема согласования TLS?Если так, как может urllib3 компенсировать?

Или проблема в другом месте?Как решить эту проблему?


Я попытался идентичной (?) Транзакции, используя curl ... он возвращает ожидаемый HTML без какой-либо задержки.

Я также пытался читать из другогоsite (например, https://client.schwab.com/Login/SignOn/CustomerCenterLogin.aspx) ... без проблем.

Chrome загружает https://login.morganstanleyclientserv.com без проблем.

uname -a; python3 -V возвращает:

Linux Ubuntu 4.18.0-17-generic # 18 ~ 18.04.1-Ubuntu SMP Пт 15 марта 15:27:12 UTC 2019 x86_64 x86_64 x86_64 GNU / Linux Python 3.6.7


Это работает curl:

curl -v --user-agent "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36" --header "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3" --header "Accept-Encoding: text/plain" --header "Accept-Language: en-US,en;q=0.9" --output foo  https://login.morganstanleyclientserv.com 

Это код python3 + urllib3, который зависает (после печати 1, затем 2, но ничего больше):

import urllib3
import certifi

print (1)
try:
    http = urllib3.PoolManager(cert_reqs = 'CERT_REQUIRED', 
                               ca_certs = certifi.where())

    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36',
               'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3',
               'Accept-Encoding': 'text/plain',
               'Accept-Language':'en-US,en;q=0.9'
               }
    print (2)
# *** This hangs ***
    r = http.request("GET", "https://login.morganstanleyclientserv.com", headers)
    print (3)
    print (r.data)
    print (4)
except Exception as e:
    print(e)
except:
    print("error")

1 Ответ

1 голос
/ 26 апреля 2019

Будучи новичком в Python, я не стал называть параметр headers в вызове http.request.Надо было читать:

r = http.request("GET", "https://login.morganstanleyclientserv.com", headers=headers)

Спасибо Эдеки!

...