我是怎樣把反反爬蟲把數據爬下來的
阿新 • • 發佈:2017-11-03
ie 6 nav 解決 讓我 tom safari 判斷 head 5.0
最近看到公司的商務一條一條的從某個網站上復制數據到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導出,想存到數據庫隨便啦~
我是怎樣把反反爬蟲把數據爬下來的