繁体   English   中英

使用 python 请求获取 403

[英]Getting 403 with python requests

我有一个 18 个月到今天都没有问题的刮刀。 现在我从 htlv.org 收到 403 响应,似乎无法解决问题。 我的代码在下面,所以答案不是通常只添加标题。 如果我打印 response.text 它会说一些关于验证码的事情。 所以我假设我必须绕过验证码或者我的 ip 被阻止了? 请帮忙:)

import requests

url = 'https://www.hltv.org/matches'
headers = {
    "Accept-Language": "en-US,en;q=0.5",
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:40.0) Gecko/20100101 Firefox/40.0",
    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
    "Referer": "http://thewebsite.com",
    "Connection": "keep-alive"}
response = requests.get(url, headers=headers)
print response

编辑:这对我来说仍然是个谜,但今天我的代码又开始在我的主 PC 上运行了。 没有对代码做任何改动。 KokoseiJ 无法重现该问题,但 Booboo 可以。 该代码也适用于我从存储设备中挖出的旧 PC,但不适用于我的主 PC。 无论如何,感谢所有试图帮助我解决这个问题的人。

我将其发布不是作为解决方案,而是作为不起作用的东西发布,但可能是有用的信息。

我去了https://www.hltv.org/matches然后打开了 Chrome 的 Inspector 并重新加载了页面并查看了用于 GET 请求的请求标头 Chrome(据说)。 一些 header 名称以“:”开头,请求认为是非法的。 但是环顾 Stack Overflow,我找到了一种解决方法(据说是 Python 3.7 及更高版本)。 有关详细信息,请参阅此处接受的答案和评论

这仍然导致 403 错误。 也许有人可能会发现这个错误(或没有)。

这些是检查员显示的标题:

:authority: www.hltv.org
:method: GET
:path: /matches
:scheme: https
accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
accept-encoding: gzip, deflate, br
accept-language: en-US,en;q=0.9
cache-control: no-cache
cookie: MatchFilter={%22active%22:false%2C%22live%22:false%2C%22stars%22:1%2C%22lan%22:false%2C%22teams%22:[]}
dnt: 1
pragma: no-cache
sec-ch-ua: " Not;A Brand";v="99", "Google Chrome";v="97", "Chromium";v="97"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "Windows"
sec-fetch-dest: document
sec-fetch-mode: navigate
sec-fetch-site: none
sec-fetch-user: ?1
upgrade-insecure-requests: 1
user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36

和代码:

import requests
import http.client
import re

http.client._is_legal_header_name = re.compile(rb'\S[^:\r\n]*').fullmatch

url = 'https://www.hltv.org/matches'
headers = {
    ':authority': 'www.hltv.org',
    ':method': 'GET',
    ':path': '/matches',
    ':scheme': 'https',
    'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
    'accept-encoding': 'gzip, deflate, br',
    'accept-language': 'en-US,en;q=0.9',
    'cache-control': 'no-cache',
    'cookie': 'MatchFilter={%22active%22:false%2C%22live%22:false%2C%22stars%22:1%2C%22lan%22:false%2C%22teams%22:[]}',
    'dnt': '1',
    'pragma': 'no-cache',
    'sec-ch-ua': '" Not;A Brand";v="99", "Google Chrome";v="97", "Chromium";v="97"',
    'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-platform': '"Windows"',
    'sec-fetch-dest': 'document',
    'sec-fetch-mode': 'navigate',
    'sec-fetch-site': 'none',
    'sec-fetch-user': '?1',
    'upgrade-insecure-requests': '1',
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36'
}
response = requests.get(url, headers=headers)
print(response.text)
print(response)

最近也遇到了这个问题。 我的解决方案是使用 th js-fetch 库(参见答案

我假设 cloudfare 和其他人找到了某种检测方法,无论请求是由浏览器 (js) 还是其他编程语言发出的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM