Cookie反爬虫
cookie反爬虫指的是服务器端通过校验请求头中的cookie值来区分正常用户和爬虫程序的手段,这种手段被广泛应用在web应用中。
Cookie反爬虫绕过实战
"""
Cookie 反爬虫绕过实战
示例2:旅游网公告详情页
网站:http://www.porters.vip/verify/cookie/content.html
任务:爬取旅游网公告详情页中地公告标题
"""
import requests
from lxml import etree
url = 'http://www.porters.vip/verify/cookie/content.html'
headers = {'Cookie': 'isfirst=789kq7uc1pp4c'}
#向目标网站发起请求
resp = requests.get(url,headers=headers)
#打印输出状态码
print(resp.status_code)
#如果本次请求地状态码是200,则继续,否则提示失败
if resp.status_code == 200:
html = etree.HTML(resp.text)
#根据HTML标签和签名从文档中去除标题
res = html.cssselect('.page-header h1')[0].text
print(res)
else:
print('This request is fial !')
Cookie反爬虫原理和实现
大部分的爬虫程序在默认情况下只请求HTML文本资源,这意味着它们并不会主动完成浏览器保存Cookie的操作,这次的反爬虫正是利用了这个特点。那浏览器又是如何完成Cookie的获取和设置呢?
浏览器会自动检测响应头中是否存在Set-Cookie头域,如果存在,则将值保存在本地,而且往后的每次请求都会自动携带对应的Cookie值,这时候只要服务器端对请求头中的Cookie值进行校验即可。服务器会校验每隔请求的Cookie值是否符合规则,如果通过校验,则返回正常资源,否则将请求重定向到首页,同时在响应头中添加Set-Cookie头域和Cookie值。
nginx中的add_header指令可以将头域添加到响应头中,结合条件判断,就可以实现反爬虫。
Cookie与JavaScript结合
除了反爬虫之外,重定向和Cookie常常被用来指定网站的入口或提高访问门槛,有些需要在登陆后才能访问的网页就是使用这个方法,但这种方法需要满足一定的需求或场景才能使用。而且以上的代码使用Cookie太简单了,每次使用的Cookie值都是相同的,只要爬虫工程师将Cookie值从浏览器得的请求头中复制,就可以一致使用。Cookie反爬虫这么简单嘛?岂不是很轻易就被绕过了?
其实,利用Cookie实现反爬虫的方法不止一种,接下来我们思考如何将Cookie和JavaScript结合起来实现爬虫。JavaScript中location对象可以将浏览器重定向到其他页面,那么是不是可以利用这一点,在HTML代码中引入一个可以将浏览器重定向到目标页面的JavaScript文件,并且在这个文件中实现随机字符串生成和Cookie设置的功能,那么服务器端只需要校验Cookie值的规则即可。
用户过滤
Cookie被广泛用于Web应用,它的主要作用时记录用户的身份,例如区分用户是否登录,进而判断用户是否为网站VIP等。Cookie的这个特点也可以用在反爬虫中,有些网站页面需要登录后才能查看,这一般是为了记录用户信息或者过滤掉未注册的用户。从网站运营的角度来看,这种做法对用户增长有一定的帮助。
小结
User-Agent和Cookie都是请求头的默认头域,在值的设定方面有一定的局限性,但是与JavaScript结合后,就会变得很灵活。
相对服务器软件来说,后端程序的校验更为灵活和准确,但使用后端程序进行校验所需的步骤较多,在实际应用时可以根据需求选择合适的校验方式。