前言
最近面试了不少爬虫工程师,发现selenium是最多的反爬技术之一(不得不说用的多的应聘者基本没过面试)。大部分人应对比较麻烦的反爬第一想到了就是这个工具,反爬实现原理则一问三不知,不得不说selenium是个很简单的工具,基本会python的都能用,但是性能是否太差了?爬虫工程师的技术壁垒呢?字体库反爬呢?最核心的一个问题:被识别到使用selenium呢???爬虫:日益增强的对抗
首先不得不赞同selenium的简单from selenium.webdriver import Chrome
driver = Chrome()
两行代码实现驱动chrome浏览器,只需要在后面控制打开的url,做一些常规的渲染等待即能完成一个页面的爬取,中间不需要做太多的反爬(异步加载等等)。反爬的不断迭代
随着大量的selenium的使用,反爬工程师也慢慢开始了对抗selenium类的渲染工具(我偶尔偷懒用的splash都在内),下面一行代码就能知道一个是否为selenium。window.navigator.webdriver
开发者工具执行js
如果手动打开浏览器,执行相同的命令,可以发现这行代码的返回值为undefined,这里就不赘述了。
由此网站只要在页面加载的时候运行这个js代码,就可以识别访问者是不是用的Selenium模拟浏览器。如果是,就禁止访问或者触发其他反爬虫的机制。我们可以用过JS来绕过去,如下面Object.defineProperties(navigator, {webdriver:{get:()=>undefined}});
但是如果网页每次都需要检验selenium,则可能绕不过去这层校验反反爬思路
反爬使用过识别chrome的配置实现的,我们解决问题的思路大致有两种:
我们可以通过更改chrome的配置实现,让这段JS拿不到真实的数据
让这段JS执行成我们想要的
第一种:代码如下:from selenium.webdriver import Chrome
from selenium.webdriver import ChromeOptions
option = ChromeOptions()
option.add_experimental_option('excludeSwitches', ['enable-automation'])
driver = Chrome(options=option)
第二种:举个小例子:mitmproxy中间人攻击,找到该文件名,对识别selenium的脚本做个更改。(虽然有点杀鸡用牛刀的感觉。)selenium之死
如果你觉得只有上面一种方法识别到使用selenium等渲染工具那就大错特错了,其实类似的特征还很多。后面有机会再做个分享。最后
“selenium之死”更多在与一个惰性的爬虫工具GG了,对爬虫工程师的要求也在不断地提高,不再是会用一个工具就能说我爬过多少个牛逼的网站了,每天几十万数据的爬取。其实类似selenium的工具不断地被开发,也会不断地被识别。我想这就是我做爬虫的乐趣吧!
日常看美女
留言与评论(共有 0 条评论) |