Solicitud simple de obtención / publicación bloqueada en python 3 pero no en python 2

19

Estoy trabajando en un simple raspador web en python 3, pero cuando envío una solicitud get o post, la respuesta es 403. Sin embargo, en python 2 funciona bien. Estoy usando la misma versión de las bibliotecas de solicitudes en ambas versiones. También lo he intentado, Verify=False/Truepero la diferencia en ambas versiones sigue siendo.

solicitudes = 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

Editar por @blhsing:

La lista a continuación realiza un seguimiento de qué versiones específicas de Python funcionan y qué versiones fallan según los comentarios. Hasta ahora, los éxitos y los fracasos han sido consistentes para cada versión específica de Python en todas las plataformas.

Siéntase libre de editar esta sección de la pregunta con sus propios resultados junto con las versiones específicas de Python utilizadas para producir los resultados.

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)

Demostración en repl.it: Python 2.7.16 y Python 3.7.4

EDM
fuente
Cabe señalar que esto funciona en Python 3.6 pero no en 3.7.
blhsing
Me sale "Acceso denegado" incluso en Firefox, después de algunas ejecuciones de código en Python 3.7. No probé en Firefox antes de ejecutar Python; tal vez estoy bloqueado después de usar el código Python o tal vez se bloquea por otra razón: IP incorrecta, país incorrecto, problema en el servidor.
furas
1
@blhsing sí, eso es extraño, supongo que iré con 3.6 entonces, gracias por nota
EDM
2
Eso es extraño. Use Wireshark y compare las solicitudes enviadas por Python 3.6 y 3.7. Tiene que haber alguna diferencia que el servidor está recogiendo.
GordonAitchJay
1
Entonces probablemente se deba a diferentes openssl ( ssl.OPENSSL_VERSION). No necesita todos esos encabezados para reprobar, solo un simple get (url) lo hará.
wim

Respuestas:

9

Esta es la excepción lanzada por urlib3:

/home/runner/.local/share/virtualenvs/python3/lib/python3.7/site-packages/urllib3/connectionpool.py:1004: InsecureRequestWarning: se está realizando una solicitud HTTPS no verificada. Se recomienda agregar la verificación del certificado. Ver: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings InsecureRequestWarning,

Según las últimas notas de la versión, sección 1.25.5 (2019-09-19) :

Agregue mitigación para BPO-37428 que afecta a Python <3.7.4 y OpenSSL 1.1.1+, lo que provocó que se habilitara la verificación de certificados al usar cert_reqs = CERT_NONE. (Problema # 1682 )

Puede seguir el problema en Github , se ha cerrado.

TLDR

El usuario @sethmlarson en Github encontró este error en 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

establecer este valor en Truehabilitará la verificación de los certificados del servidor, en lugar de estar deshabilitado.

Naor Tedgi
fuente