Basit alma / gönderme isteği python 3'te engellendi, ancak python 2'de engellendi


19

Ben python 3 basit bir web kazıyıcı üzerinde çalışıyorum ama bir get veya bir posta isteği göndermek zaman, yanıt 403 olduğunu. Python 2 olsa iyi çalışıyor. Her iki sürümde de istek kütüphanelerinin aynı sürümünü kullanıyorum. Ben de denedim Verify=False/Trueama her iki sürümdeki fark kalır.

istekler = 2.22.0

sertifika = 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 tarafından düzenle:

Aşağıdaki liste, hangi Python sürümlerinin çalıştığını ve yorumlara göre hangi sürümlerin başarısız olduğunu izler. Şimdiye kadar başarılar ve başarısızlıklar, platformlardaki her belirli Python sürümü için tutarlı olmuştur.

Sorunun bu bölümünü, sonuçları üretmek için kullanılan belirli Python sürümleriyle birlikte kendi sonuçlarınızla düzenlemekten çekinmeyin.

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 hakkında demo: Python 2.7.16 ve Python 3.7.4


Bunun Python 3.6'da çalıştığı ancak 3.7'de çalışmadığı unutulmamalıdır.
blhsing

Firefox'ta bile "Erişim Reddedildi" ifadesini alıyorum - Python 3.7'de birkaç kod çalıştırdıktan sonra. Python çalıştırmadan önce Firefox'ta denemedim - belki Python kodunu kullandıktan sonra bloke oldum veya belki başka bir nedenden ötürü engeller - yanlış IP, yanlış ülke, sunucuda sorun.
furas

1
@blhsing yep bu garip, sanırım 3.6 ile gideceğim sonra, not için thx
EDM

2
Bu garip. Wireshark kullanın ve Python 3.6 ve 3.7 tarafından gönderilen istekleri karşılaştırın. Sunucunun aldığı bazı farklar olmalı.
GordonAitchJay

1
O zaman muhtemelen farklı openssl ( ssl.OPENSSL_VERSION) nedeniyle . Repro etmek için tüm bu başlıklara ihtiyacınız yok, sadece düz bir eski get (url) bunu yapacak.
wim

Yanıtlar:


9

Urlib3 tarafından atılan istisna budur:

/home/runner/.local/share/virtualenvs/python3/lib/python3.7/site-packages/urllib3/connectionpool.py:1004: GüvensizRequestUyarı: Doğrulanmamış HTTPS isteği yapılıyor. Sertifika doğrulaması eklemeniz önemle tavsiye edilir. Bkz. Https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings InsecureRequestWarning,

Göre son sürüm notları, bölüm 1.25.5 (2019/09/19) :

Cert_reqs = CERT_NONE kullanılırken sertifika doğrulamanın etkinleştirilmesine neden olan Python <3.7.4 ve OpenSSL 1.1.1+' yi etkileyen BPO-37428 için azaltma ekleyin. (Sayı # 1682 )

Konuyu Github'da takip edebilirsiniz , kapatıldı.

TLDR

Github'daki @sethmlarson kullanıcısı bu hatayı urllib3'te buldu :

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

bu değerin olarak ayarlanması True, devre dışı bırakmak yerine sunucu sertifikalarının doğrulanmasını sağlayacaktır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.