转载自:http://blog.csdn.net/china1000/article/details/39157387
另外解密恶意广告主识别的文章,据说涉密了,因为担心公司的保密协议,先删除了安全第一。
本文讲述了一种使用浏览器内核进行伪装的新爬虫,它可以轻易的欺骗CNZZ的数据统计,抓取动态内容。我首先介绍了常见的浏览器内核、浏览器内核的UserAgent,网站代码加载执行过程,随后又具体介绍了该动态爬虫的实现方法。
其实讲到爬虫的伪装,我们就要首先讲一下网站站长和爬虫的对抗之路。具体的可以参考参考文献 一---互联网网站的反爬虫策略浅析。
总的来讲互联网网站的反爬虫的策略可以通过检测爬取频率、并发连接数目、http请求header包括referer和UserAgent、js统计的网站日志和访问日志比对、js判定User Agent,IP访问次数来甄别一个请求是不是爬虫。那么这些策略我们应该如何应对呢?我们可以把爬虫完全伪装成为网民的浏览行为,从而躲避大部分的反爬虫策略么?答案是肯定的,我们可以通过操作浏览器内核来控制对一个网站的访问,并且伪造以上提到的检测数据。当然访问频率,并发数目这些是无法逃避的,如果你有足够的耐心和足够多的机器、足够多的代理,总是可以抓取到足够多的信息的么。
一、浏览器内核介绍
首先介绍一下浏览器内核的信息,目前网民们用的浏览器有很多qq浏览器,360浏览器,猎豹浏览器、搜狗浏览器、海豚浏览器、百度浏览器等等,可是这些都是基于国外的浏览器内核做了后续的开发,加上外壳进行界面美化后得到的。其实主流的浏览器内核主要有一下5种:
1. Trident内核:IE内核,IE 8 9 10 都在使用,它是闭源的。qq浏览器,猎豹浏览器,360浏览器。。。。其实大多数国内的浏览器都会支持的,不过微软的东西一般会比较慢,所以很多国内的浏览器都是双内核的,一般基于webkit+trideng或者webkit+blink。
2. webkit内核:Safari浏览器内核,qq浏览器,猎豹浏览器等等。
3. Gecko内核:Firefox浏览器内核。
4. Presto内核:Opera内核,据称已经废弃。
5.Blink内核:Chrome内核,360极速浏览器也在使用。其实也就是基于webkit的,但是某一段时间后谷歌做了很多优化,突然觉得webkit很不爽就把webkit的大部分代码都替换了,于是就出现了Blink内核。就是据说的chromium内核,好像现在很多浏览器用的也已经是blink内核了。
二、常见浏览器内核的User Agent:
然后我们在讲一下常见的浏览器的User Agent:
1. QQ浏览器: Mozilla/5.0 (compatible; MSIE 10.0; WindowsNT 6.1; WOW64; Trident/6.0; QQBrowser/7.7.24962.400)
2. IE浏览器:Mozilla/5.0 (compatible; MSIE 10.0;Windows NT 6.1; WOW64; Trident/6.0)
3.猎豹浏览器: Mozilla/5.0 (compatible; MSIE 10.0;Windows NT 6.1; WOW64; Trident/6.0) LBBROWSER
然后呢,讲了这么多浏览器内核,也有很多基于这些内核的开源项目或者js解释引擎。如phantomjs、capherjs、node.js、还有基于谷歌的V8 js解释引擎。
三、网站加载过程中不同的代码执行位置和顺序:
后面我们再介绍一下网站的代码执行,首先我们向服务器发送请求,这时服务器的后台php java代码都会执行,然后网站代码被发送到本地,在本地时js、ajax会在浏览器内核中之行。了解这个很重要,这样我们就知道我们的爬虫不仅要欺骗php java代码还要欺骗js和ajax代码。
我们可以就以phantomjs为例子吧,phatomjs是一个对webkit浏览器内核做的javascrpit封装,它支持丰富的API,并且效率也不错(对比微软的webbrowser封装)。那么我们下面就会讲一下,我们对基于phantomjs的爬虫的伪装吧:
1.伪装http header,我们可以使用phanomjs的API来实现:
1. "font-family:SimSun;font-size:18px;">page.customHeaders = {
2. "Referer" : referrer,
3. "User-Agent" : "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.137 Safari/537.36 LBBROWSER 1.1"
4. };
2.伪造referer欺骗js,这一点其实就要麻烦一些:我们需要首先打开referer页面,然后再模拟点击消息转到目的网站,具体方法如下:
1. "font-family:SimSun;font-size:18px;">page.onLoadFinished = function(status){
2.
3. // Only once do
4. if ( page.firstLoad ) {
5. page.firstLoad = false;
6. // Inject and Click a Link to our target
7. page.evaluate(function (href) {
8. // Create and append the link
9. var link = document.createElement('a');
10. link.setAttribute('href', href);
11. document.body.appendChild(link);
12.
13. // Dispatch Click Event on the link
14. var evt = document.createEvent('MouseEvents');
15. evt.initMouseEvent('click', true, true, window, 1, 1, 1, 1, 1, false, false, false, false, 0, link);
16. link.dispatchEvent(evt);
17. }, targetUrl);
18. } else {
19. // 此处我们已经成功伪造referer信息,并且打开Target url页面
20. console.log(targetUrl+"\t"+page.url);
21.
22. };
23. };
3.伪造User Agent欺骗js,这一点其实就要麻烦一些,但是我们也可以通过phantomjs的API来实现:
1. "font-family:SimSun;font-size:18px;">page.settings.userAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.137 Safari/537.36 LBBROWSER";
4. 使用代理,这个phantomjs支持的就更好啦,调用的时候加入代理的参数即可:
1. "font-family:SimSun;font-size:18px;">phantomjs --proxy=ip:port
5.添加cookies(我知道phantomjs设置cookies可行,目前还没有验证,据称有以下三种方法):
page.customHeaders = {Cookie: xxx}
phantom.addCookie({
'name': 'yandexuid',
'value': '21611441383258191',
'domain': '.yandex.ru'))
});
phantomjs --cookies-file=cookies.txt
说到这里其实我们已经得到了一个动态的爬虫,它可以之行js代码,可以抓取到网页的动态内容,具有浏览器的header并且无法被js、ajax、java、php代码识别,甚至也无法被后台的日志分析识别。目前为止该方法的qps并不高,因为加载js和phantomjs并发性能不高。
其实这个爬虫有很多的用处:
1.伪造点击信息,最近CNZZ公布了中小网站的流量来源中30%是来自奇虎360的,众所周知CNZZ是植入js代码统计网站的访问量和来源的。这些完全可以用我们的代码伪造访问量,并且伪造访问来源呀。
2. 爬取网站动态内容,有很多网站是基于ajax和js设计的,现在我们就可以爬取到这些代码执行得到的数据。
3.逃避反爬虫策略,这个就太明显了。
4.可以用来做作弊器么?其实完全可以的,我们可以操作phantomjs,伪造所有的数据,操纵这个爬虫使用代理在互联网上到处浏览,并且传出所有我们想伪造的参数,甚至包括鼠标行为、浏览行为。目前据我所知不止可否伪造移动端的屏幕大小等信息。
另外博主做了一些数据挖掘的工作,最近在研究补习机器学习和最优化、和统计的知识,后面也会写一些心得,希望有人可以一起讨论。我也在寻找数据挖掘和机器学习的工作机会,希望做数据挖掘机器学习相关,你有好机会么,博主会非常感谢你的,如索要简历,请联系:[email protected]
另外解密广告反欺诈文章,据说涉密了,因为担心公司的保密协议。所以先删除了。
参考文献:
[1] 互联网网站反爬虫策略: http://robbinfan.com/blog/11/anti-crawler-strategy
[2] phantomjs官网: http://phantomjs.org/
[3] 反爬虫策略开源代码:https://github.com/csdn-dev/limiter
[4] HTTP HEADER详解:http://www.open-open.com/lib/view/open1342064478859.html