คำร้องขอรับ / โพสต์อย่างง่ายถูกบล็อกใน python 3 แต่ไม่ได้อยู่ใน python 2


19

ฉันกำลังทำงานกับ web scraper อย่างง่ายใน 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
blhsing

ฉันได้รับ "Access Denied" แม้แต่ใน Firefox - หลังจากใช้รหัสไม่กี่ครั้งใน Python 3.7 ฉันไม่ได้ทดลองใช้ Firefox ก่อนใช้งาน Python บางทีฉันอาจถูกบล็อคหลังจากใช้รหัส Python หรืออาจบล็อกด้วยเหตุผลอื่น - IP ผิดประเทศผิดประเทศปัญหาบนเซิร์ฟเวอร์
furas

1
@blhsing yep ที่แปลกฉันเดาว่าฉันจะไปกับ 3.6 แล้วขอบคุณสำหรับบันทึก
EDM

2
มันแปลกมาก ใช้ Wireshark และเปรียบเทียบคำขอที่ส่งโดย Python 3.6 และ 3.7 มีความแตกต่างที่เซิร์ฟเวอร์กำลังหยิบขึ้นมา
GordonAitchJay

1
อาจเป็นเพราะ openssl ( ssl.OPENSSL_VERSION) ที่แตกต่างกัน คุณไม่ต้องการส่วนหัวเหล่านั้นทั้งหมดเพื่อทำซ้ำเพียงรับ (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) :

เพิ่มการลดผลกระทบสำหรับ 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จะเปิดใช้งานการตรวจสอบใบรับรองเซิร์ฟเวอร์แทนที่จะถูกปิดใช้งาน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.