最近看到公司的商务一条一条的从某个网站上复制数据到excel里,于是乎就打算写个爬虫把那个网站的数据都爬下来.一般的流程是模拟用户访问->获取数据->解析页面元素->balabala想干啥干啥.但这个网站大概是知道自己对爬虫很有吸引力,于是做了反爬虫的处理.查看返回的数据有一段这样的代码:
void(function fuckie6(){if(location.hash && /MSIE 6/.test(navigator.userAgent) && !/jsl_sec/.test(location.href)){location.href = location.href.split(‘#‘)[0] + ‘&jsl_sec‘ + location.hash}})(); var content = _.template(document.getElementById(‘content_tpl‘).innerHTML)({ error_403: ‘当前访问因疑似CC攻击,已被云防御拦截‘ || ‘当前访问疑似黑客攻击,已被网站管理员设置为拦截‘, url: document.URL.replace(/\</g,"%3C").replace(/\>/g,"%3E"), user_agent: navigator.userAgent, now: new Date(new Date() - -8 * 3600000).toISOString().substr(0, 19).replace(‘T‘, ‘ ‘), rule_id: parseInt(‘<!--RULE_ID-->‘.replace(/\[|\]/g, ‘‘)) || ‘‘, from: encodeURIComponent(document.referrer.substr(0, 1024)), client_ip: ‘183.14.132.72‘, ref: encodeURIComponent(document.URL.substr(0, 1024)) }); document.getElementById(‘content_rendered‘).innerHTML = content;
不是很明白为什么要把拦截情况用js来处理,也有可能是通过js来拦截爬虫.总之让我感觉他是通过判断访问的客户端类型(userAgent)来反爬虫,这样就很好解决了.curl代码如下:
//欺骗服务端,隐藏自己的客户端 public function liar($url) { $curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_URL => $url, CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => "", CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 30, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => "GET" )); //伪造ip以及客户端 curl_setopt($curl, CURLOPT_HTTPHEADER, array(‘X-FORWARDED-FOR:111.222.333.4‘, ‘CLIENT-IP:111.222.333.4‘)); curl_setopt($curl, CURLOPT_REFERER, "http://www.test.com"); curl_setopt($curl, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11"); $response = curl_exec($curl); curl_close($curl); return $response; }
CURLOPT_USERAGENT这个值可以伪造客户端类型,这次程序中我把自己伪造成了Mozilla,同时怕对方拦截到我的ip而设置黑名单所以也设置了访问ip以及来路页面.这些应该是初级反反爬虫技术,不过可以爬下大部分的网站了.拿到数据后,用simple_html_dom类来解析数据,具体就不放出啦~跟jq很相似的使用方法.爬下的数据,想用phpexcel导出,想存到数据库随便啦~
时间: 2024-11-13 08:09:16