2015-10-20 123 views
7

我曾经偶尔刮电子商务网页来获取产品价格信息。我还没有使用过一段时间内使用Scrapy构建的刮板,昨天正在尝试使用它 - 我遇到了bot保护问题。如何绕过Scrapy中的cloudflare bot/ddos​​保护?

它正在使用CloudFlare的DDOS保护,它基本上使用JavaScript评估来过滤掉禁用JS的浏览器(因此也是刮板)。一旦函数被评估,就会生成计算编号的响应。作为回报,服务返回两个认证cookie,附加到每个请求允许通常抓取站点。 Here是它如何工作的描述。

我还发现了一个cloudflare-scrape Python模块,它使用外部JS评估引擎来计算数量并将请求发送回服务器。我不知道如何将它整合到Scrapy。或者,也许有一个更聪明的方式,而不使用JS执行?最后,这是一种形式...

我会apriciate任何帮助。

+0

执行JS有什么问题?如果没有它,很多内容都无法达到...... – dandavis

+0

@dandavis Scrapy不会执行JS执行。没有JS的 – Rejected

+0

,刮被越来越无用。你应该考虑使用浏览器来刮擦。我的Scrape脚本可以获取登录信息,获取动态页面和分页内容,甚至可以通过虚假点击来在请求之前请求更多动态子内容,而且我认为任何代码都不会超过10行或需要大型外部库。所有你需要的是篡改键和下载程序... KISS。如果你想让它更加自动化,你可以将用户脚本切换到phantomJS或类似的东西。 – dandavis

回答

4

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

要将刮刀,您需要添加以下代码:

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

一起解析功能。就是这样!

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

+0

嗨,我尝试使用您的解决方案使用cloudflare的网站 - 它似乎正确的请求正在发送,但我仍然超时从第一个请求503错误。 这里的reuqests样子: 'DEBUG:“GET/CDN-CGI/L/chk_jschl jschl_answer = 386&jschl_vc = 3ee197400dbcca30577bcb3949cf781f&通= 1446694346?755-esyN0f4s4%2F HTTP/1.1“302 165 DEBUG:”GET /forumdisplay.php?29-DotA-Chat HTTP/1.1“200 21367' '2015-11-04 22:32:48 [scrapy] DEBUG:重试重试(失败 3次):503服务不可用' – ddnm

+0

@ddnm,我更新了代码,它现在可以工作。将'cookies = {“cfuid”:token [“cfuid”]}'更改为'cookies = token' –

1

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

2

如果在抓取过程中妥协一点点速度是可以的,您可以将Scrapy与Selenium结合起来,以模拟真正的用户与浏览器的交互。 我在这里写了一篇关于它的简短教程:http://www.6020peaks.com/2014/12/how-to-scrape-hidden-web-data-with-python

它没有针对您的CloudFlare特定问题,但它可能有帮助,因为在加载需要某些JS执行的数据时,我遇到了类似的问题。