【问题标题】:Python cloudscraper requests slow, with 403 responsesPython cloudcraper 请求慢,有 403 响应
【发布时间】:2022-01-08 15:20:13
【问题描述】:

我正在使用 Cloduscraper Python 库从 url 获取 JSON 响应。 问题是我必须重试相同的请求 2-3 次才能获得正确的输出。第一个响应有一个 403 HTTP 状态码。

这是我的代码:

import json
from time import sleep
import cloudscraper

url = "https://www.endpoint.com/api/"
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:95.0) Gecko/20100101 Firefox/95.0",
    "Accept": "*/*",
    "Content-Type": "application/json"
}
json_response = 0
while json_response == 0:
    try:
        scraper = cloudscraper.create_scraper()
        r = scraper.get(url, headers=headers)
        json_response = json.loads(r.text)
    except:
        print(r.status_code)
        sleep(2)
return json_response

我可以做些什么来优化我的代码并防止 403 响应?

【问题讨论】:

  • cloudscraper 代码库已经有一段时间没有更新了,我不确定目前是否支持它。
  • 这是我 wrote 绕过受 Cloudflare 保护的站点时的内容。这项任务需要付出努力,而且大多数 Python 包很快就会过时,因为供应商会缓解这些绕过技术。
  • @Lifeiscomplex 感谢您报告的所有信息。不幸的是 cfscrape 在我的情况下不起作用。 Selenium 比 cloudcraper 慢很多,可能是因为我不能使用“headless”选项或者我得到 403。因此,是否有支持绕过 cloudflare 的库?
  • 我查看了 cloudcraper 的 Github 帐户。我注意到他们有一个development branch,最近一次更新了 3 个月。将此存储库克隆到您的系统,以测试它是否适用于您要抓取的站点。
  • @Lifeiscomplex 谢谢你的建议;我尝试了 cloudcraper 的开发版本,但它作为主版本执行

标签: python web-scraping cloudflare


【解决方案1】:

试试 https://rapidapi.com/restyler/api/scrapeninja - 它模拟 chrome 指纹,似乎可以在您提到的网站上正常工作。

【讨论】:

  • 看起来很有希望,可惜免费订阅每天只能处理100个请求
【解决方案2】:

你可以使用真正的浏览器来阻止机器人检测的某些部分,这里是playwright的例子:

import json

from playwright.sync_api import sync_playwright

API_URL = 'https://www.soraredata.com/api/players/info/29301348132354218386476497174231278066977835432352170109275714645119105189666'

with sync_playwright() as p:
    # Webkit is fastest to start and hardest to detect
    browser = p.webkit.launch(headless=True)

    page = browser.new_page()
    page.goto(API_URL)

    # Use evaluate instead of `content` not to import bs4 or lxml
    html = page.evaluate('document.querySelector("pre").innerText')

try:
    data = json.loads(html)
except:
    # Still might fail sometimes
    data = None

print(data)

【讨论】:

  • 是不是也可以用一些数据使用编剧来执行POST请求?
  • 是的,有可能,您可以尝试在 evaluate 中使用 JavaScript 的 fetch
  • 还有另一种方法:用真正的playwright浏览器打开网站绕过cloudflare,然后将所有cookie和会话内容复制回python并使用它们从python端无阻塞地执行请求
  • 另外,playwright提供了expect_request方法,可以用来捕获某个页面上已有的POST请求,可以通过GET请求获得
  • 谢谢;考虑到一些随机数据,您能否提供一个使用 playwright 的 POST 请求的工作示例?
【解决方案3】:

HTTP 403 Forbidden响应状态码表示服务器理解请求但拒绝授权。

如果您没有授权,我建议首先检查您发送请求的 url 是否需要任何类型的权限来授权请求​​。

但是,您在第二次或第三次试用时确实收到了响应,并且会发生一些服务器在返回答案之前需要几秒钟的时间,因此它们要求浏览器在提交响应之前等待大约 5 秒。

我建议添加一个延迟,它可以作为参数传递给 create_scraper():

scraper = cloudscraper.create_scraper(delay=10)

如果成功,则减少延迟,直到不能再减少为止。

【讨论】:

  • 很遗憾 delay=10 根本没有提高性能
  • 您能否提供更多有关您的端点的信息,它是私有的还是公共的?如果私有,是否有 VPN 或任何类型的 IP 白名单?如果是公开的,你能分享一下实际的网址吗?当您说“根本没有提高性能”时,您的意思是它在第一次尝试时仍然失败吗?如果是这样,您能否尝试一个更高的延迟,例如 60 秒,看看您是否在第一次尝试时得到响应?
  • 端点是公共的,特别是下面的“soraredata.com//api/players/info/…”。我尝试延迟 60,但仍然收到很多 403 响应,也是第一个响应
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-18
  • 2022-01-20
  • 2016-08-17
  • 1970-01-01
  • 1970-01-01
  • 2016-03-30
  • 2021-11-17
相关资源
最近更新 更多