无法使用curl模拟此浏览器请求

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

我正在尝试从网站上抓取产品(例如https://www.violetgrey.com/en-us/shopping/the-rich-cream-18105401)。虽然在浏览器上它正常加载,但当我复制该站点的初始curl请求时,它拒绝访问。这都是在本地环境中完成的。到目前为止,在从浏览器开发工具复制curl请求之前,我已经:

  1. 网站禁用了 JS
  2. 清除了我所有的缓存、cookies
  3. 尝试过不同的浏览器

尽管如此,结果是一样的——通过curl 被阻止。当完全相同的请求在我的浏览器中运行时。谁能指出我正确的方向吗?

google-chrome curl python-requests screen-scraping
2个回答
2
投票

如果您查看响应标头,您可以看到它来自 Cloudflare。
Cloudflare 是邪恶的。恕我直言。
HTTP 状态为 403。

HTTP/2 403
表示禁止。
正文是正文:

错误代码:1020

错误 1020 可以粗略地翻译为 “带着你的卷发去别处。这里不需要你和你的卷发。”

Cloudflare 配置文件和指纹浏览器。例如,他们监视 SSL/TLS 握手,如果您的curl 握手没有像用户代理中的浏览器那样完全握手,他们会给您一个 403 Forbidden 和错误代码 1020。

并且您的请求未到达 violetgrey.com。他们甚至不知道你尝试过。

Cloudflare 具有政治性,会阻止他们想要的任何流量。如果不允许您通过符合他们的最大利益,他们就会阻止您。例如,Cloudflare 阻止我访问美国专利和商标网站。不仅如此,他们还向 YouTube 和 Google Play 发送了 3 个 XHR 信标请求。我的 Firefox 阻止了这些请求。 Cloudflare 和 Google 关系密切。我不相信他们中的任何一个。

不乏有关您的问题和可能的解决方法的文章。只需搜索“Cloudflare 403 禁止 1020 错误”即可。也许不使用谷歌进行搜索。

这是我努力抓取您的网址。我尝试了一些事情,例如尝试各种用户代理。我尝试过 wget。

请求头

GET /en-us/shopping/the-rich-cream-18105401 HTTP/2
Host: www.violetgrey.com
mozilla/5.0 (x11; netbsd amd64; rv:16.0) Gecko/20121102 Firefox/16.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
alt-used: www.violetgrey.com
connection: keep-alive
upgrade-insecure-requests: 1
sec-fetch-dest: document
sec-fetch-mode: navigate
sec-fetch-site: cross-site
sec-fetch-user: ?1
te: trailers

响应头:

HTTP/2 403 
date: Thu, 27 Oct 2022 23:56:19 GMT
content-type: text/plain; charset=UTF-8
content-length: 16
x-frame-options: SAMEORIGIN
referrer-policy: same-origin
cache-control: private, max-age=0, no-store, no-cache, must-revalidate, post-check=0, pre-check=0
expires: Thu, 01 Jan 1970 00:00:01 GMT
server-timing: cf-q-config;dur=4.9999998736894e-06
vary: Accept-Encoding
server: cloudflare
cf-ray: 760f5e1ced6e8dcc-MIA
alt-svc: h3=":443"; ma=86400, h3-29=":443"; ma=86400

响应正文:

error code: 1020

0
投票

你应该尝试一下

curl-impersonate

curl 的特殊版本,可以模拟四种主要浏览器:Chrome、Edge、Safari 和 Firefox。 curl-impersonate 能够执行与真实浏览器相同的 TLS 和 HTTP 握手。

由于这个问题被标记为

python-requests
,读者可能会对
curl_cffi
感兴趣。

通过cffi 进行curl 模拟的Python 绑定。一个可以模拟浏览器tls/ja3/http2指纹的http客户端。

注意:我尚未在 OP 要求的特定 URL 上进行测试,但使用curl-impersonate 解决了我在另一个网站上遇到的类似问题。

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