网页抓取解密(爬虫破解基础的js解析能力限制破解采用nodisplay来随机化)
优采云 发布时间: 2022-02-22 07:15网页抓取解密(爬虫破解基础的js解析能力限制破解采用nodisplay来随机化)
在与反爬虫的对抗中,我们的爬虫有两个大招,其中之一就是多种ip替换方式(例如adsl|proxy|tor等,请参考前面的文章)。二是无头浏览器,采用自动化技术自动抓取数据,模拟鼠标键盘事件,可用于破解验证码,js解析,怪异模糊数据。存于github开源项目欢迎star /luyishisi/Anti-Anti-Spider
0 内容:phantomjs原理讲解牛刀小试破解基本js解析能力限制破解使用nodisplay随机网页源码破解简单图文相互替换破解拖拽验证码1phantomjs原理讲解:
无头浏览器不是闹鬼的东西。它也被称为无界面浏览器。它本身是用于自动化测试的,但它似乎更适合爬行。他的官网是:/quick-start.html 如果你想看他的中文api,我编译了一个文档在:/2016/08/phantomjs-api-%E4%B8%AD%E6%96%87% E7 %89%88-%E6%97%A0%E7%95%8C%E9%9D%A2%E6%B5%8F%E8%A7%88%E5%99%A8-js%E5%A4%84 % E7%90%86%E7%9A%84%E7%88%AC%E8%99%AB/
下载后会得到一个exe文件,linux下也一样。在命令行,在文件目录下输入phantomjs,用浏览器启动你的爬虫代码。
2小试
运行phantomg需要以下js代码
另存为 request.js 文件。然后在当前目录下运行命令行:会返回整个网页的源码,然后爬虫稍微分析一下就可以提取xici代理的空闲ip了。
phantomjs request.js http://www.xicidaili.com/
/***********************************
code:javascript
system:win || linux
auther:
mail : **@qq.com
github:
blog: https://www.urlteam.org
date:2016.9.12
逻辑说明:使用phantomjs无界面浏览器作为操作平台,破解对方针对js解析的反爬虫辨别
************************************/
var page = require('webpage').create(),
system = require('system'),
address;
address = system.args[1];
//init and settings
page.settings.resourceTimeout = 30000 ;
page.settings.XSSAuditingEnabled = true ;
//page.viewportSize = { width: 1000, height: 1000 };
page.settings.userAgent = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.120 Safari/537.36';
page.customHeaders = {
"Connection" : "keep-alive",
"Cache-Control" : "max-age=0",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
"Accept-Language": "zh-CN,zh;q=0.8,en;q=0.6",
};
page.open(address, function() {
console.log(address);
console.log('begin');
});
//加载页面完毕运行
page.onLoadFinished = function(status) {
console.log('Status: ' + status);
console.log(page.content);
phantom.exit();
};
如图所示:
3 破解基本js解析能力限制
我遇到的两个之一是网站故意用js延迟返回真实数据,先返回一个part,几秒js能力验证后才加载。另一种是检测到没有js处理能力,立即给出拒绝码。这种类型是xici代理的方式。如果用python直接发送请求,不管是scrapy还是requests,都会返回500错误(后来发现需要做好sufficient request header伪造也是可以的,但是phantomjs本身自带,所以可以到达)。如下:
但是如果使用上面的代码,在python中使用系统命令调用这行命令,就相当于使用phantomjs进行请求操作,源代码直接返回。您可以将python与以下内容一起使用
common = 'c://phantomjs/phantomjs' + ' requests.js '+ temp_url
str_body = str(os.popen(common).read())
print str_body
之后就是字符串处理,非常简单,不废话。
4 破解使用display:none随机化网页源代码
众所周知,如果我们想在爬虫中选择某个数据,可以使用xpath或者常规的字符串操作。但是对方的网站需要有一定的规则才能合理的提取数据。因此,也使用了nodisplay属性,这使得显示的后台代码非常混乱,但在前台呈现给用户的数据不会混乱。例如:/
如图,当我用chrome检测这个ip部分的源码时,后台会出现乱七八糟的显示,而且会有网站随机的类名,更加难以捕捉.
那么破解之道也是弯道救国。
破解思路:(避免查水表不放源码)
使用phantomjs的截图功能。(详情查看官方api,难度不大,示例代码中的rasterize.js文章也是实现截图的功能)例如:
page.evaluate(function() { document.body.bgColor = 'white';});//背景色设定为白。方便二值化处理
page.clipRect = { top: 441, left: 364, width: 300, height: 210 };//指定截图区域。坐标使用第四象限
然后分别取出ip和port部分的图片。使用python进行图文转换。大致如下:
在PIL中安装图像库,遍历每个像素,做一个锐化,增强对比度,去噪和二值化,保存改进后的图像。调用pytesseract运行函数: print pytesseract.image_to_string(Image.open('end.png')) 如果你的图片处理清晰,可以轻松识别图片和文字。
注意切图,不要一次识别整张图,最好单独切出一个ip。然后以高精度识别。主要难点其实是安装环境和镜像优化比较麻烦。
5 破解简单图文相互替换
这部分也和上一个问题有重叠:相当于对方把一些数据变成了图片,我们下载这些图片然后优化图片,然后解析例如:/
爬他的页面的时候,ip好抢,但是端口号就是图片。下载图片后,还需要进行上诉转换。识别准确率也是95%+
识别出的源码可见github:/luyishisi/Anti-Anti-Anti-Spider/tree/master/1.%E9%AA%8C%E8%AF%81%E7%A0%81
对此,让三个门户自学:
6 破解拖动验证码
破解只是一种兴趣,不能毁了别人的工作。只是一个想法:
在触发之前和之后捕获验证码图像。使用变化点作为二值化可以得到需要偏移的像素点。phantomjs控制鼠标拖动的唯一难点就是拖动轨迹不能太机器人,否则你的验证码会被吃掉。其他的使用ajax等skip请求,也是一种方式,但是难度也很大。请不要在私信中索要代码。没有留下。
7 总结:
对抗反爬虫,如果能掌握上号技巧,基本没有劣势。
使用adsl | 托| 代理 | 可以防止对方封禁ip,使用header字段进行伪造,是防止对方识别返回虚假数据的入口。使用幻影基本上对方无法阻止您的访问。毕竟是真实浏览器发起的请求。仍然存在的漏洞是你可以通过一些特征检测来识别你正在使用幻影浏览器并对其进行屏蔽,而能够做到这一点的网站并不多。另一个难点是复杂的验证码被破解,只有机器学习才能走。
本文仅用于技术分享,不发布破解源码。希望读者能互相学习,提高自己的技能。