做数据挖掘的时候,不少数据是从其他网站抓取过来的,有爬虫技术,必然有反抓取技术,这里简单介绍一些常见的反爬虫技术以及应对这些反爬虫技术的方法。
反爬虫的目的主要就是对人机行为进行区分。一般是在假设人是通过浏览器来浏览网页,而爬虫是直接发送http请求进行区分。
反反爬虫方式一般就是通过模拟网页在浏览器的行为,发送相应的http请求到服务器,让服务器返回正确的数据。
反爬虫方式一般有两类:
(1)静态,通过某些设置让浏览器能正常访问而爬虫程序不能获得正确的结果
(2)动态,通过对ip、cookie之类的计数,到达某个阈值的时候,不返回正确的结果。
一、静态方式
1.通过检查Referer来返回不同数据。
浏览器访问网页的时候,总是很自觉的在http头上带上Referer
参数,爬虫爬的时候不带Referer
参数或者带了错误都Rererfer参数都不会返回正确的结果。
这种方式比较多的出现在图片防盗链上,用正确的Referer
参数或者不带Referer
参数都可以得到正确的结果。
比如我获取百度图片的时候特意带上一个错误的Referer
参数
wget --referer="http://www.163.com" "http://imgsrc.baidu.com/forum/pic/item/c091d52a2834349bab469d51c8ea15ce34d3bedb.jpg"
返回的结果就是这样的
正确的结果把链接粘贴到浏览器里就可以看到了。
应对方法就是不带Referer
参数或者跟前资源地址带上正确的参数,一搬查Referer
不会非常严格的,域名正确就会返回正确的时间了。
firefox 有Smart Referer 之类的插件就是用类似的方式实现的,不过用了这种插件之后,会导致云课堂的视频课程不能正常加载。
2.通过运行js+跳转
大部分情况下,爬虫是直接通过发送http请求来获取数据的,比较少会用浏览器或者运行页面上的js来获取数据,毕竟页面上所有的js耗的资源跟直接发送http请求相差的不是1倍2倍的事情。
部分云盾类的防DDOS攻击的会采用这种做法,产品的广告上还会说能SEO优化,大概是对搜索引擎的ip有白名单之类的吧。
这种方式就是通过第一次请求数据的时候,只返回一小段跳转到真实地址的js,浏览器能很快跳转过去,一般的爬虫就不能跳转过去了。
比如这个网站 http://news.ctdsb.net/yule/
第一次访问的时候,返回js,这段js用于记录用户ip是否正确的就行了跳转,如果正确执行了跳转,用户的ip地址就会被加入白名单一段时间,之后一段时间内的访问不再进行跳转。
<!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/><meta http-equiv="pragma" content="no-cache"/><meta http-equiv="cache-control" content="no-store"/><meta http-equiv="Connection" content="Close"/><script>function YunSuoAutoJump() { self.location = "/yule/?yunsuo_session_verify=fba344a0c27ed0176017d50839f1dc82"; }</script><script>setTimeout("YunSuoAutoJump()", 300);</script></head></html>
应对方法就是解析出跳转地址,模拟浏览器再发一次http请求。
这种方式有挺多灵活的变化的,比如
(1)通过Cookie而不是ip地址来对应服务端的Sessionid,需要解析返回头里的Set-Cookie
,模拟再次请求的时候发送带上Cookie
(2)通过js跳转地址进行加密
比如http://we.sportscn.com/category-7.html
这个网站,第一次访问的时候会返回 521
,返回的是加密的js,每次刷新加密的js代码都会变。
应对这种反爬虫方式,先通过firebug观察2次请求http头有什么不同,直接发送第二次的http头是否能得到正常的网页内容。
可以费神、费力的去看js是怎么加密数据的,也可以简单粗暴地扔给nodejs或者PhantomJS之类的执行加密部分,得到加密结果,发送请求。
二、动态方式
1.通过对ip地址请求数来限制
比如,http://jandan.net
,这个网站的网页短时间内多刷新几次就会弹出人机验证的页面。这种方式会误伤部分用NAT方式上网的用户。
应对这种一般只能增加ip数量或者降低请求频次。
2.通过Cookie等其他id识别用户的方式
比如http://www.xiami.com/artist/index/c/1/type/0/class/1
,通过模拟浏览器行为,带上spm=XXX
、cookie
等发送http请求,抓几页之后总会出错。
应对这种方式和前面通过模拟浏览器行为完全相反了,直接把所有的cookie
,spm
等模仿浏览器行为的方式全都禁用,单纯发送http请求,就能获得正确的结果了。
3.对请求进行增减计数
通过web的请求记+1,通过js的请求记-1,结果在0附近的,就是正常的浏览器行为,离0很远的请求就是爬虫行为。
这种方式实时性好,用于对反爬虫要求较高的地方。
应对这种反爬虫,需要找出具体是哪个js请求会造成计数-1,-1计数的请求可以不止一个,相当于在服务端进行了一次加密,较难应对(我没处理过)。。。
动态方式应对方式主要是避免被发现,被发现之后往往会使用验证码之类的来进行人机区分。
也有比较简单的方式,比如http://jandan.net
,点一下中间的按钮就ok了,开始还是觉得很神奇的,难道这网站用了什么黑科技,通过一次鼠标点击就可以识别你是否是人类了。
! 3.png
再看一下网页源码,单纯的post了一个hash值而已,每次出现这种验证的时候模拟post一次之后,有可以欢快的继续爬数据了。
本文来自网易实践者社区,经作者沈高锋授权发布