使用 Python 和请求抓取受 Cloudflare 保护且没有 cookie 的网站

发布于 2025-01-16 14:44:35 字数 2445 浏览 4 评论 0原文

通常,当网站受 cloudflare 保护时,它们会加载一个带有第一个请求的值的 cookie,因此当您尝试获取它时,它会返回 403 禁止访问。

该网站 Oddschecker 是一个体育赔率聚合器,其运作方式有所不同。

在私人会话中检查,您可以看到标头不包含任何 cookie,也不包含任何对 cloudflare

Inspect Oddschecker

然而,这是我的代码

headers = {
  'authority': 'www.oddschecker.com',
  'upgrade-insecure-requests': '1',
  'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36',
  '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',
  'sec-gpc': '1',
  'sec-fetch-site': 'none',
  'sec-fetch-mode': 'navigate',
  'sec-fetch-user': '?1',
  'sec-fetch-dest': 'document',
  'accept-language': 'es-ES,es;q=0.9'}

url = "https://www.oddschecker.com/"

session=cloudscraper.create_scraper()
response=session.get(url=url, headers=headers)

,响应有 403 状态。这是为什么?如果 cloudflare 没有为其加载任何 cookie 并且我正在使用旨在接受 JS 加载的库,那么他们如何阻止我访问?

这是 Postman 中响应的片段(也是 403)

Snippet Postman

只是因为,我尝试在那里重新创建 POST 请求,所以我做了

url="https://sparrow.cloudflare.com/api/v1/event"
payload={'event':"feedback clicked",'properties':{'errorCode':1020,'version':2}}
headers={'Content-Type':"application/json","Sparrow-Source-Key":"c771f0e4b54944bebf4261d44bd79a1e"}

r=sesion.post(url=url,headers=headers,data=json.dumps(payload))

r.headers --> {'Date': 'Tue, 22 Mar 2022 23:19:25 GMT', 'Content-Type': 'text/plain;charset=UTF-8', 'Content-Length': '9', 'Connection': 'keep-alive', 'Access-Control-Allow-Origin': 'https://sparrow.cloudflare.com', 'Vary': 'Origin, Accept-Encoding', 'access-control-allow-headers': 'Content-Type, Sparrow-Client-ID, Sparrow-Source-Key, Origin', 'access-control-allow-methods': 'POST, OPTIONS', 'access-control-max-age': '600', 'Expect-CT': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', 'Server': 'cloudflare', 'CF-RAY': '6f02a6f2f8a9668f-MAD'}

有趣的事情,这个确实返回了 200 并且它的 r.content 是 b"Filtered." 我不知道这是否意味着什么。

那么,我该如何进行这项工作呢?怎么把我赶出去了?

来吧,别害羞

Usually when a website is protected by cloudflare they load a cookie with a value from the very first request, so when you try to fetch it it returns 403 forbidden access.

This website Oddschecker is a sports odds aggregator and does things differently.

Inspecting in a private session you can see the headers doesn't contain any cookie nor any reference to cloudflare

Inspect Oddschecker

Yet, this is my code

headers = {
  'authority': 'www.oddschecker.com',
  'upgrade-insecure-requests': '1',
  'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36',
  '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',
  'sec-gpc': '1',
  'sec-fetch-site': 'none',
  'sec-fetch-mode': 'navigate',
  'sec-fetch-user': '?1',
  'sec-fetch-dest': 'document',
  'accept-language': 'es-ES,es;q=0.9'}

url = "https://www.oddschecker.com/"

session=cloudscraper.create_scraper()
response=session.get(url=url, headers=headers)

and response has a 403 status. Why is that? How is cloudflare preventing me from access if they don't load any cookie for it and I'm using a library designed to accept JS loads?

This is a snippet of the response in Postman (also 403)

Snippet Postman

Just because, I tried to recreate the POST requests in there, so I did

url="https://sparrow.cloudflare.com/api/v1/event"
payload={'event':"feedback clicked",'properties':{'errorCode':1020,'version':2}}
headers={'Content-Type':"application/json","Sparrow-Source-Key":"c771f0e4b54944bebf4261d44bd79a1e"}

r=sesion.post(url=url,headers=headers,data=json.dumps(payload))

r.headers --> {'Date': 'Tue, 22 Mar 2022 23:19:25 GMT', 'Content-Type': 'text/plain;charset=UTF-8', 'Content-Length': '9', 'Connection': 'keep-alive', 'Access-Control-Allow-Origin': 'https://sparrow.cloudflare.com', 'Vary': 'Origin, Accept-Encoding', 'access-control-allow-headers': 'Content-Type, Sparrow-Client-ID, Sparrow-Source-Key, Origin', 'access-control-allow-methods': 'POST, OPTIONS', 'access-control-max-age': '600', 'Expect-CT': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', 'Server': 'cloudflare', 'CF-RAY': '6f02a6f2f8a9668f-MAD'}

Funny though, this one did return 200 and its r.content is b"Filtered." which I don't know if means something or not.

So, how do I make this work? How is it pushing me out?

Come on don't be shy

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

夏天碎花小短裙 2025-01-23 14:44:35

我不知道 cloudflare 是如何做到这一点的,但我意识到,在您第一次访问网站一段时间后,cloudflare 会创建像 cf_clearance 这样的 cookie。如果您继续在浏览器中尝试您的请求,将会生成您的 cookie。

I don't know how cloudflare is doing it but I realized that cloudflare create cookies like cf_clearance after a while from your first access to website. If you keep trying your requests in browser your cookies will be generated.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文