Простий запит на отримання / повідомлення заблокований у python 3, але не у python 2


19

Я працюю над простим веб-скребком у python 3, але коли я надсилаю заявку на отримання або повідомлення, відповідь - 403. Хоча в python 2 добре працює. Я використовую однакову версію бібліотек запитів в обох версіях. Я також спробував, Verify=False/Trueале різниця в обох версіях залишається.

запити = 2,22,0

certifi = 2019.9.11

from requests import get
url = 'https://www.gamestop.com/'
header = {
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    'Accept-Encoding': 'gzip, deflate, br',
    'Accept-Language': 'en-US,en;q=0.5',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:56.0) Gecko/20100101 Firefox/56.0',
    'DNT': '1',
    'Upgrade-Insecure-Requests': '1',
    'Connection': 'keep-alive',
    'Host': 'www.gamestop.com'
}
res = get(url, headers=header, verify=False).status_code
print(res)
# 403 when using python 3.7.4
# 200 when using python 2.7.16

Редагувати @blhsing:

У наведеному нижче списку відстежується, які конкретні версії Python працюють, а які - відмовляються відповідно до коментарів. Досі успіхи та невдачі були послідовними для кожної конкретної версії Python на всіх платформах.

Не соромтесь редагувати цей розділ питання своїми власними результатами разом із конкретними версіями Python, які використовуються для отримання результатів.

2.7.14 works (blhsing)
2.7.16 works (repl.it)
3.6.5 works (blhsing)
3.6.8 fails (Reinderien and blhsing)
3.7.3 works (wim and blhsing)
3.7.4 fails (repl.it and blhsing)
3.8.0 fails (OP)

Демонстрація на repl.it: Python 2.7.16 та Python 3.7.4


Слід зазначити, що це працює в Python 3.6, але не в 3.7.
блхзінг

Я отримую "Заборонено доступ" навіть у Firefox - після кількох запусків коду в Python 3.7. Я не пробував Firefox перед запуском Python - можливо, я заблокований після використання коду Python, а може він блокується з іншої причини - неправильний IP, неправильна країна, проблема на сервері.
furas

1
@blhsing так, це дивно, я думаю, я піду з 3.6 потім, THX на замітку
EDM

2
Це дивно. Використовуйте Wireshark та порівняйте запити, надіслані Python 3.6 та 3.7. Повинна бути якась різниця, на яку береться сервер.
GordonAitchJay

1
Тоді, ймовірно, це пов'язано з різними openssl ( ssl.OPENSSL_VERSION). Вам не потрібні всі ці заголовки для спростування, просто звичайний старий get (URL) зробить це.
Вім

Відповіді:


9

Це виняток, кинутий urlib3:

/home/runner/.local/share/virtualenvs/python3/lib/python3.7/site-packages/urllib3/connectionpool.py:1004: InsecureRequestWarning: робиться неперевірений запит HTTPS. Настійно рекомендується додавати перевірку сертифікатів. Дивіться: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings InsecureRequestWarning,

Відповідно до останніх приміток до випуску, розділ 1.25.5 (2019-09-19) :

Додайте пом'якшення для BPO-37428, що впливає на Python <3.7.4 та OpenSSL 1.1.1+, що призвело до активації перевірки сертифікатів при використанні cert_reqs = CERT_NONE. (Випуск № 1682 )

Ви можете слідкувати за проблемою на Github , вона закрита.

TLDR

Користувач @sethmlarson в Github знайшов цю помилку на urllib3 :

create_urllib3_context ():

    # Enable post-handshake authentication for TLS 1.3, see GH #1634. PHA is
    # necessary for conditional client cert authentication with TLS 1.3.
    # The attribute is None for OpenSSL <= 1.1.0 or does not exist in older
    # versions of Python.
    if getattr(context, "post_handshake_auth", None) is not None:
        context.post_handshake_auth = True

встановлення цього значення Trueдозволить перевірити сертифікати серверів, а не відключати їх.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.