【问题标题】:Python requests getting 403 but on mobile device works finePython 请求获得 403 但在移动设备上工作正常
【发布时间】:2022-01-14 21:52:29
【问题描述】:

在 Python 中请求 HTML 页面时,每次都会收到 403 禁止响应。

import requests
url = 'https://shop.rewe.de/mydata/login'
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5) 
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36'}
result = requests.get(url, headers=headers)

>>> result.status_code
403

当我使用 iOs 应用程序(例如“Rest”)时,我只发送具有相同域且没有其他附加设置的 GET 并得到 200 OK 响应。 当我在 Python 中运行它时,我不知道问题是什么。

编辑: 这显示了其余应用程序中的指标。在搜索协议时,我找到了 h2 或只是 http/2 协议。我认为这是问题所在。邮递员和请求库都不支持这一点。

【问题讨论】:

  • 我会在邮递员或类似的东西中尝试这个应该告诉你发生了什么。
  • 我在桌面上使用 curl 得到 403。您的 iOS 浏览器中是否有此网站的 cookie?
  • 我认为问题与 Cloudflare 重定向有关。页面提示启用Java,还有一点是他们希望启用http/2。
  • 我四处搜寻,发现问题出在哪里。真正的问题肯定是 cloudflare 重定向,但 cloudflare 在做什么?我搜索了一段时间,发现真正的问题是他们正在证明来自浏览器的 TLS 握手。没有它,就很难绕过 Cloudflare 的 TLS 保护。

标签: python python-requests


【解决方案1】:

我更改了请求会话的密码。暂时有效。不知道要多久……

url = 'https://shop.rewe.de/mydata/login'

import ssl
import requests

from requests.adapters import HTTPAdapter
from requests.packages.urllib3.poolmanager import PoolManager
from requests.packages.urllib3.util import ssl_

CIPHERS = (
    'ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-SHA256:AES256-SHA'
)


class TlsAdapter(HTTPAdapter):

    def __init__(self, ssl_options=0, **kwargs):
        self.ssl_options = ssl_options
        super(TlsAdapter, self).__init__(**kwargs)

    def init_poolmanager(self, *pool_args, **pool_kwargs):
        ctx = ssl_.create_urllib3_context(ciphers=CIPHERS, cert_reqs=ssl.CERT_REQUIRED, options=self.ssl_options)
        self.poolmanager = PoolManager(*pool_args,
                                       ssl_context=ctx,
                                       **pool_kwargs)


session = requests.session()
adapter = TlsAdapter(ssl.OP_NO_TLSv1 | ssl.OP_NO_TLSv1_1)
session.mount("https://", adapter)

headers = {
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:96.0) Gecko/20100101 Firefox/96.0',
}
try:
    r = session.request('GET', url, headers=headers)
    print(r)
except Exception as exception:
    print(exception)

【讨论】:

    猜你喜欢
    • 2017-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多