即使使用 User-Agent 标头,如何修复 Python 请求的“403 Forbidden”错误?

问题描述 投票:0回答:4

我正在向某个 URL 发送请求。我将curl命令复制到python中。因此,所有标头都包含在内,但我的请求不起作用,我在 HTML 输出中收到状态代码 403 和错误代码 1020。

代码是

import requests

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:106.0) Gecko/20100101 Firefox/106.0',
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8',
    'Accept-Language': 'en-US,en;q=0.5',
    # 'Accept-Encoding': 'gzip, deflate, br',
    'DNT': '1',
    'Connection': 'keep-alive',
    'Upgrade-Insecure-Requests': '1',
    'Sec-Fetch-Dest': 'document',
    'Sec-Fetch-Mode': 'navigate',
    'Sec-Fetch-Site': 'none',
    'Sec-Fetch-User': '?1',
}

response = requests.get('https://v2.gcchmc.org/book-appointment/', headers=headers)

print(response.status_code)
print(response.cookies.get_dict())
with open("test.html",'w') as f:
    f.write(response.text)

我也收到了 cookie,但没有得到所需的响应。我知道我可以用硒做到这一点,但我想知道这背后的原因。

注:
我已经安装了所有按请求安装的库,其版本与计算机相同,但仍然无法工作并抛出 403 错误

python python-requests http-status-code-403
4个回答
5
投票

该网站受

cloudflare
保护,旨在阻止未经授权的数据抓取等行为。来自 什么是数据抓取?

网页抓取的过程相当简单,尽管 实施可能很复杂。网页抓取分 3 个步骤进行:

  1. 首先,用于提取信息的代码段(我们称之为抓取机器人)将 HTTP GET 请求发送到特定网站。
  2. 当网站响应时,抓取工具会解析 HTML 文档以获取特定的数据模式。
  3. 提取数据后,它将转换为抓取机器人作者设计的任何特定格式。

可以用

urllib
代替
requests
,好像可以对付
cloudflare

req = urllib.request.Request('https://v2.gcchmc.org/book-appointment/')
req.add_headers('User-Agent', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:106.0) Gecko/20100101 Firefox/106.0')
req.add_header('Accept', 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8')
req.add_header('Accept-Language', 'en-US,en;q=0.5')

r = urllib.request.urlopen(req).read().decode('utf-8')
with open("test.html", 'w', encoding="utf-8") as f:
    f.write(r)

2
投票

它在我的机器上运行,所以我不确定问题是什么。

但是,当我想发送一个不起作用的请求时,我经常使用剧作家尝试它是否有效。 Playwright 使用浏览器驱动程序,从而在访问页面时模仿您的实际浏览器。可以使用

pip install playwright
进行安装。当您第一次尝试时,可能会出现错误,告诉您安装驱动程序,只需按照说明进行即可。

与剧作家一起,您可以尝试以下操作:

from playwright.sync_api import sync_playwright


url = 'https://v2.gcchmc.org/book-appointment/'
ua = (
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
    "AppleWebKit/537.36 (KHTML, like Gecko) "
    "Chrome/69.0.3497.100 Safari/537.36"
)

with sync_playwright() as p:
    browser = p.chromium.launch(headless=False)
    page = browser.new_page(user_agent=ua)
    page.goto(url)
    page.wait_for_timeout(1000)
    
    html = page.content()
    
print(html)

playwright 的一个缺点是它需要安装 chromium(或其他)浏览器。这是一个缺点,因为它可能会使部署复杂化,因为浏览器不能简单地添加到requirements.txt,并且需要容器镜像。


0
投票

尝试运行 Burp Suite 的代理来查看所有标头和其他数据(例如 cookie)。然后您可以使用 Python 模块模拟该请求。这就是我一直做的事情。

祝你好运!


0
投票

最简单的方法 - 只需跟踪您的开发工具请求,您可以在 NodeJS 请求中导出请求,不确定 Python。

但是如果 Python 不支持 - 仍然导出为任何可用语言并使用像 ChatGPT 这样的 AI 用 Python 重写它。

我更喜欢 NodeJS 开发,并且从 Python 开始,所以它对我帮助很大。不需要复杂的工具 - 使用最简单的工具,您会对相同的 DevTools 可以给您带来的印象深刻。

© www.soinside.com 2019 - 2024. All rights reserved.