因为要收集数据,所以打算自己撸一个爬虫,期间碰到网站的反爬措施,让我非常头疼,在此记录一下。 基础爬虫的基础是不需要自己手动通过浏览器访问网页,而是通过程序构造网络请求,获取网站返回的结果。例如使用python的requests库发送请求: import requestsurl = 'https://www.baidu.com'ret = requests.get(url)print(ret.text) 得到返回的html代码后,可以自己解析数据,获取感兴趣的内容。 前期分析首先分析要爬的网站,本质是一个信息查询系统,提供了搜索页面。例如我想获取某个case,需要利用这个case的id或者name字段,才能搜索到这个case的页面。因为我是希望数据尽可能不同,id和name分布得比较广泛,自己构造的话特别麻烦,于是看看有没有什么别的办法。 好在网站还提供了热搜功能,可以点击热搜链接,获取每日/周/月的热搜条目,每个热搜榜单有50条信息。热搜的网站链接是 前期的信息就那么多,先构造个请求试试: 可以看到服务器网站返回的状态码是521,后面是返回的text,看起来是个js脚本。 没有正常的返回状态,我首先想到的是用浏览器打开时,本地会保存cookies,可能是cookies没对上。后来经过验证,确实如此。 绕过反爬虫出于对安全的考虑,有些网站会做一些反爬的措施,例如前面说的需要判断user-angent和cookies,或者判断请求的ip是否在短时间内多次访问。该网站用的是知道创宇的安全服务,频繁访问会提示ip行为不正常。 浏览器本质也是一个应用程序,只要ip不被封,既然可以通过浏览器访问,那么我们自己写程序来请求也是应该没有问题的。 一些常见的绕过反爬虫的措施有:
这些使用和实现起来都不是很麻烦,网上资料也比较多。 实战前面说到该网站需要cookies才能正常返回,但是该网站的cookies过期很快,我总不能用浏览器开发者工具获取cookies,然后让程序跑一会儿,每隔几分钟再手动获取cookies,再让程序继续跑吧。如果反复这样工作,那么写爬虫也就没意义了。便开始对cookies进行分析。 从浏览器的开发者工具获取到的cookies大约有10个字段,经过反复测试,能让网站正常返回的只需要两个字段,分别为 经过测试,如果请求的时候不自己构造cookies,默认会返回 我似乎明白了什么,看到之前返回那堆看不懂的js脚本,奥妙一定就在其中! 先尝试了将那段js脚本保存下来,包装成一个html文件打开,发现浏览器不停的刷新,也并没起什么作用。那就分析一下js脚本,原来的代码是单行的,自己整理一下并加了一些变量名和log,大概是这么个样子: 将第16行的变量 可以看到第二段脚本已经开始设置cookies的 而第一段脚本当中,变量 可是对于python和js的交互我完全没接触过,尝试了PyExecJS和Js2Py,都没办法正常执行第一段脚本。无奈之下,我用python复现了第一段脚本,然后用Js2Py获取了cookie。在请求一次过后,构造cookies,再请求一次,就可以了: def test(): url = REQUEST_URL # url = 'https://www.baidu.com' request_header = get_header() html = requests.get(url, headers=request_header) print(html) jscode = html.text # print(jscode) # tryjs.get_cookies()为复现的js代码,以及用Js2Py获取cookies的代码 request_cookies = try_js.get_cookies(jscode) request_cookies += ';__jsluid_h=' + html.cookies['__jsluid_h'] request_header['Cookie'] = request_cookies print(request_header) html = requests.get(url, headers=request_header, timeout=5) print('new connection') print(html) print(html.text) 其它在实际操作中,我使用了西刺代理提供的代理ip,全军覆没。可能是网站的安全系统默认屏蔽了这些ip,所以最终我还是用自己的本机ip发送请求。 根据我的网络与服务器的实际情况,我将请求间隔设置为10-20秒,超时设置为15秒。 因为我并不要求爬取网站的所有数据,所以有些返回不正常的页面和条目可以忽略,在处理和清晰的时候去掉这些数据即可。 经过麓战20多小时,差点就吐了,还好最终爬虫成功跑了起来。 |
|
来自: 文炳春秋 > 《Python资料》