【问题标题】:How to bypass cloudflare bot/ddos protection in Scrapy?如何绕过 Scrapy 中的 cloudflare bot/ddos 保护?
【发布时间】:2016-01-19 18:18:04
【问题描述】:

我以前偶尔会抓取电子商务网页以获取产品价格信息。我有一段时间没有使用使用 Scrapy 构建的爬虫了,昨天尝试使用它 - 我遇到了机器人保护问题。

它使用 CloudFlare 的 DDOS 保护,基本上是使用 JavaScript 评估来过滤掉禁用 JS 的浏览器(因此是爬虫)。评估函数后,将生成具有计算数量的响应。作为回报,服务会发回两个附加到每个请求的身份验证 cookie,从而允许正常抓取站点。 Here 是对其工作原理的描述。

我还发现了一个cloudflare-scrape Python 模块,它使用外部 JS 评估引擎来计算数量并将请求发送回服务器。不过,我不确定如何将其集成到 Scrapy 中。或者也许有一种更聪明的方法而不使用 JS 执行?说到底,还是个形式……

我会寻求任何帮助。

【问题讨论】:

  • 执行JS有什么问题?没有它,很多内容都无法访问...
  • @dandavis Scrapy 不执行 JS。
  • 没有 JS,抓取越来越没用。您应该考虑使用浏览器进行抓取。我的抓取脚本可以在登录后获取动态和分页内容,甚至在抓取之前假点击请求更多动态子内容,我认为没有超过 10 行代码或需要一个大型外部库。您所需要的只是tampermonkey 和一个下载程序……KISS。如果你想让它更自动化,你可以将用户脚本切换到 phantomJS 或类似的东西。
  • 执行JS你可以使用splash,它与scrapy完全集成。

标签: javascript python cookies scrapy


【解决方案1】:

所以我在 cloudflare-scrape 的帮助下使用 Python 执行了 JavaScript。

到你的爬虫,你需要添加以下代码:

def start_requests(self):
  for url in self.start_urls:
    token, agent = cfscrape.get_tokens(url, 'Your prefarable user agent, _optional_')
    yield Request(url=url, cookies=token, headers={'User-Agent': agent})

连同解析函数。就是这样!

当然,您需要先安装 cloudflare-scrape 并将其导入您的蜘蛛。您还需要安装一个 JS 执行引擎。我已经有了 Node.JS,没有任何抱怨。

【讨论】:

  • 嗨,我尝试将您的解决方案用于使用 cloudflare 的网站 - 似乎正在发送正确的请求,但我仍然因第一个请求的 503 错误而超时。这是请求的样子:DEBUG: "GET /cdn-cgi/l/chk_jschl?jschl_answer=386&jschl_vc=3ee197400dbcca30577bcb3949cf781f&pass=1446694346.755-esyN0f4s4%2F HTTP/1.1" 302 165 DEBUG: "GET /forumdisplay.php?29-DotA-Chat HTTP/1.1" 200 213672015-11-04 22:32:48 [scrapy] DEBUG: Gave up retrying <GET http://nadota.com/forumdisplay.php?29-DotA-Chat> (failed 3 times): 503 Service Unavailable
  • @ddnm,我更新了代码。它现在可以工作了。将cookies={"cfuid":token["cfuid"]} 更改为cookies=token
  • 我在 2019 年 3 月收到 Error parsing Cloudflare IUAM Javascript challenge
  • cfscrape 不再有效且不再维护,根据:github.com/Anorov/cloudflare-scrape/issues/347
  • 此库无法正常工作(2021 年 4 月 28 日)。可能开发商不感兴趣。 ValueError: Unable to identify Cloudflare IUAM Javascript on website. Cloudflare may have changed their technique, or there may be a bug in the script.
【解决方案2】:

显然,最好的方法是在 CloudFlare 中将您的 IP 列入白名单;如果这不合适,让我推荐cloudflare-scrape 库。您可以使用它来获取 cookie 令牌,然后在您的 Scrapy request 中将此 cookie 令牌提供回服务器。

【讨论】:

    【解决方案3】:

    如果您收到 503 错误,您可以遵循以下准则:

    1. 转到settings.py
    2. 搜索:USER_AGENT
    3. 在这里,您将看到 scrapy 的 默认机器人用户代理。 用这个替换那个默认值:
      USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36'
      

    【讨论】:

      猜你喜欢
      • 2021-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-03
      • 2022-09-27
      • 1970-01-01
      • 2022-09-27
      相关资源
      最近更新 更多