Web scraping Python从网络头请求403禁止引用

Web scraping Python从网络头请求403禁止引用,web-scraping,python-requests,http-status-code-403,Web Scraping,Python Requests,Http Status Code 403,这个请求以前可以工作,但现在得到403。我尝试添加如下答案中所示的用户代理,但仍然没有效果: 下面的第二个答案是查找referer头,但我不知道这些响应头在哪里: 这是我在刷新页面后第一个选项卡的请求标题下看到的内容,但是内容太多了。我想我只需要这些线路中的一条 :authority: www.ziprecruiter.com :method: GET :path: /Salaries/What-Is-the-Average-Programmer-Salary-by-State :scheme:

这个请求以前可以工作,但现在得到403。我尝试添加如下答案中所示的用户代理,但仍然没有效果:

下面的第二个答案是查找referer头,但我不知道这些响应头在哪里:

这是我在刷新页面后第一个选项卡的请求标题下看到的内容,但是内容太多了。我想我只需要这些线路中的一条

:authority: www.ziprecruiter.com
:method: GET
:path: /Salaries/What-Is-the-Average-Programmer-Salary-by-State
: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: max-age=0
cookie: __cfduid=dea4372c39465cfa2422e97f84dea45fb1620355067; zva=100000000%3Bvid%3AYJSn-w3tCu9yJwJx; ziprecruiter_browser=99.31.211.77_1620355067_495865399; SAFESAVE_TOKEN=1a7e5e90-60de-494d-9af5-6efdab7ade45; zglobalid=b96f3b99-1bed-4b7c-a36f-37f2d16c99f4.62fd155f2bee.6094a7fb; ziprecruiter_session=66052203cea2bf6afa7e45cae7d1b0fe; experian_campaign_visited=1
sec-ch-ua: " Not A;Brand";v="99", "Chromium";v="90", "Google Chrome";v="90"
sec-ch-ua-mobile: ?0
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/90.0.4430.93 Safari/537.36
编辑:查看其他选项卡,它们有referer:“referer”:https://www.ziprecruiter.com/Salaries/What-Is-the-Average-Programmer-Salary-by-State“所以我现在正在尝试,但它仍然是403。

使用它似乎可以:

导入httpx
url='1〕https://ziprecruiter.com/Salaries/What-Is-the-Average-Programmer-Salary-by-State'
r=httpx.get(url)
打印(右文本)
打印(r.status\u代码)
打印(r.http_U版本)
答复:

我可能错了,但我认为服务器不喜欢请求库的TLS协商。这很奇怪,因为上面的调用在请求中使用了HTTP1.1,而curl只适用于http2和TLS1.3

使用一个使用http2和支持TLS1.3的openssl构建的curl二进制文件,可以实现以下功能:

docker运行--rm curlmages/curl:7.76.1\
--http2——tlsv1.3'https://ziprecruiter.com/Salaries/What-Is-the-Average-Programmer-Salary-by-State' \
-H'用户代理:Mozilla'\
-s-o/dev/null-w“{http_code}”
返回:

301
以下命令失败:

  • 强制执行http1.1和强制执行TLS 1.3
docker运行--rm curlmages/curl:7.76.1\
--http1.1--tlsv1.3'https://ziprecruiter.com/Salaries/What-Is-the-Average-Programmer-Salary-by-State' \
-H'用户代理:Mozilla'\
-s-o/dev/null-w“{http_code}”
输出:
403

  • 强制http2和强制TLS 1.2:
docker运行--rm curlmages/curl:7.76.1\
--http2--tlsv1.2'https://ziprecruiter.com/Salaries/What-Is-the-Average-Programmer-Salary-by-State' \
-H'用户代理:Mozilla'\
-s-o/dev/null-w“{http_code}”
输出:
403

我的猜测是,它在TLS协商中检测到一些东西,但当同时存在TLS1.3和HTTP/2时,检查是不同的


不幸的是,您无法使用requests/urlib检查http/2,因为它不受支持

更可能的是cloudflare还没有看到足够的httpx流量来识别/阻止它。
301