Yêu cầu get / post đơn giản bị chặn trong python 3 nhưng không phải trong python 2


19

Tôi đang làm việc trên một trình quét web đơn giản trong python 3 nhưng khi tôi gửi một yêu cầu nhận hoặc một bài đăng, phản hồi là 403. Trong python 2 hoạt động tốt mặc dù. Tôi đang sử dụng cùng một phiên bản thư viện yêu cầu trong cả hai phiên bản. Tôi cũng đã thử với Verify=False/Truenhưng sự khác biệt trong cả hai phiên bản vẫn còn.

yêu cầu = 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

Chỉnh sửa bởi @blhsing:

Danh sách dưới đây theo dõi phiên bản Python cụ thể nào hoạt động và phiên bản nào bị lỗi theo các bình luận. Cho đến nay, thành công và thất bại đã được thống nhất cho từng phiên bản Python cụ thể trên các nền tảng.

Vui lòng chỉnh sửa phần câu hỏi này với kết quả của riêng bạn cùng với các phiên bản Python cụ thể được sử dụng để tạo kết quả.

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)

Bản trình diễn trên repl.it: Python 2.7.16Python 3.7.4


Cần lưu ý rằng điều này hoạt động trong Python 3.6 nhưng không phải trong 3.7.
blhsing

Tôi nhận được "Truy cập bị từ chối" ngay cả trong Firefox - sau vài lần chạy mã trong Python 3.7. Tôi đã không thử trong Firefox trước khi chạy Python - có thể tôi bị chặn sau khi sử dụng mã Python hoặc có thể nó bị chặn vì lý do khác - sai IP, sai quốc gia, sự cố trên máy chủ.
furas

1
@blhsing yep thật lạ, tôi đoán tôi sẽ đi với 3.6 sau đó, để ghi chú
EDM

2
Điều đó thật lạ. Sử dụng Wireshark và so sánh các yêu cầu được gửi bởi Python 3.6 và 3.7. Có một số khác biệt mà máy chủ đang chọn.
GordonAitchJay

1
Sau đó, nó có thể là do openssl ( ssl.OPENSSL_VERSION) khác nhau . Bạn không cần tất cả các tiêu đề đó để repro, chỉ cần một get (url) cũ đơn giản sẽ làm điều đó.
wim

Câu trả lời:


9

Đây là ngoại lệ được ném bởi urlib3:

/home/runner/.local/share/virtualenvs/python3/lib/python3.7/site-packages/urllib3/connectionpool.py:1004: InsecureRequestWarning: Yêu cầu HTTPS chưa được xác minh. Thêm xác nhận chứng chỉ được khuyến khích. Xem: https://urllib3.readthedocs.io/en/latest/advified-usage.html#ssl-warnings InsecureRequestWarning,

Theo ghi chú phát hành mới nhất, phần 1.25.5 (2019-09-19) :

Thêm giảm thiểu cho BPO-37428 ảnh hưởng đến Python < 3.7.4 và OpenSSL 1.1.1+, điều này khiến cho xác minh chứng chỉ được bật khi sử dụng cert_Vqs = CERT_NONE. (Số phát hành # 1682 )

Bạn có thể theo dõi vấn đề trên Github , nó đã bị đóng.

TLD

Người dùng @sethmlarson trên Github đã tìm thấy lỗi này trên urllib3 :

created_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

đặt giá trị này thành Truesẽ cho phép xác minh chứng chỉ máy chủ, thay vì bị tắt.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.