単純なget / postリクエストはPython 3ではブロックされていますが、Python 2ではブロックされていません


19

私はpython 3で単純なWebスクレイパーに取り組んでいますが、getまたはpostリクエストを送信すると、応答は403です。python2では正常に動作します。両方のバージョンで同じバージョンのリクエストライブラリを使用しています。私も試しました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では機能しないことに注意してください。
blhsing

Firefoxでも "アクセスが拒否されました"と表示される-Python 3.7でコードをいくつか実行した後。Pythonを実行する前にFirefoxで試していません-Pythonコードの使用後にブロックされているか、他の理由でブロックされている可能性があります-IPの間違い、国の違い、サーバーの問題。
furas

1
@blhsingうん、それは変だ、私は3.6で行くと思う、それからノートのためにthx
EDM

2
それは奇妙だ。Wiresharkを使用して、Python 3.6と3.7から送信されたリクエストを比較します。サーバーが拾っているいくつかの違いがあるはずです。
GordonAitchJay

1
それはおそらく異なるopenssl(ssl.OPENSSL_VERSION)が原因です。再現するのにこれらすべてのヘッダーは必要ありません。単純な古いget(url)がそれを行います。
WIM

回答:


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)

Python <3.7.4およびOpenSSL 1.1.1+に影響するBPO-37428の緩和策を追加し ました。これにより、cert_reqs = CERT_NONEの使用時に証明書の検証が有効になります。(問題#1682

Github問題を追跡できますが、終了しました。

TLDR

Githubのユーザー@sethmlarsonがこのバグを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と、無効にする代わりにサーバー証明書の検証が有効になります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.