可能很多小伙伴在做网站爬虫的时候,会遇到这样一种情况,在设置requests的header的时候,只设置User-Agent字段的时候,返回的结果是503,这时候的话,首先第一步要做的是看一看是不是自己之前太狂了,爬页面时候没加个延时,被对方主机干掉了,一般这种也不是永久性的。
但是如果确定不是这种原因而是第一次就不行的话,那就可能是要用到本文提到的这个攻破cf_clearance的工具了。
首先呢,这个字段的由来出于此保护机制:cloudflare,当然就是进行人机校验的工具。很多网站都会用。
笔者毕业设计做的是数字货币的交易研究,在爬取这个网站遇到了它的阻挠,之前采取的办法是每天都复制粘贴一下Requests的cookies的内容,放到我爬虫的header里面,可想而知很麻烦。
经过笔者检验,在cookies的所有字段中,__cfduid;_session_id;cf_clearance这三个字段是必要的,其他都可以没有。
session_id比较容易,回话的id一般是在第一次进入该网站时候生成,只要我们的爬虫在本地保持就可以了,具体的操作方法可以是:第二次访问就自动保持了session_id,而另外两个字段则需要用该工具:
s = req.session() res = s.get(url,headers = header) data = s.get(url_new,headers = header2)
安装好之后,按照教程里的,使用如下的代码:
import subprocess import cfscrape # With get_tokens() cookie dict: # tokens, user_agent = cfscrape.get_tokens("http://somesite.com") # cookie_arg = "cf_clearance=%s; __cfduid=%s" % (tokens["cf_clearance"], tokens["__cfduid"]) # With get_cookie_string() cookie header; recommended for curl and similar external applications: cookie_arg, user_agent = cfscrape.get_cookie_string("http://somesite.com") # With a custom user-agent string you can optionally provide: # ua = "Scraping Bot" # cookie_arg, user_agent = cfscrape.get_cookie_string("http://somesite.com", user_agent=ua) result = subprocess.check_output(["curl", "--cookie", cookie_arg, "-A", user_agent, "http://somesite.com"])
其中cookie_arg就是拿到了上面两个字段的变量: