1.为什么自动化爬取数据?自动化爬取有什么困境?
Tips:为什么要用自动化来爬取数据?直接走协议不香吗?
网络爬虫要获取数据,最好最快的方法,自然是使用协议来进行模拟登录,获取数据等行为。但是现如今的网页端反爬虫措施越来越完善,爬虫和反爬虫的对抗已经进入了白热化,甚至可以说一天不学习就会落后很多。
相比于协议的反爬虫力度来说,自动化的压力要小很多,自动化来爬取数据速度只是比人手动快一些,比协议要慢的多。这也说明自动化爬虫对网站的伤害比较小。如果网络爬虫的要求仅仅是完成一些重复性工作,或者说只是爬取到数据就好,爬慢一点也无妨,使用自动化确实是一个好的方案(虽然爬虫界各大佬对自动化的鄙视是表露在外的)。
Python爬虫在进行自动化的时候,最常用的是selenium,因为不少网站会检测selenium的一些特征。更进一步,如果不使用selenium,而使用其他的自动化工具,也可以检测webdriver之类的自动化特征,或者干脆就看看你的JS操作的isTrust,如果是手动出发的就是True,JS触发的就是False。
此外,还有浏览器的指纹检测,将一台机器上相对稳定不变的参数作为指纹搜集,比如canvas,webgl,webAudio,SSL/TLS指纹等等,举一个浏览器指纹检测的例子https://gongjux.com/fingerprint/。
面对自动化反爬,许多人的处理方案就是使用油猴脚本,通过Hook来对一些参数获取进行劫持替换,我们接下来采取一种更底层的方式,直接取修改chromium浏览器的C++层代码。
当编译好一个自己修改过的chromium浏览器,并随机了指纹,可以采用两种方案进行数据爬取:
-
使用playwright进行浏览器驱动和自动化。
-
使用Windows的API进行浏览器的自动化,借助Fiddler之类的工具转发数据到本地服务。
但今天讲的文章里,我们主要探究如何自己定制修改chromium浏览器。
2.chromium浏览器的源码该如何编译?
Tips:由于chromium的源码在不停地更新换代,所以如果按照网上的经验贴通常是无法编译成功的,所以最好的方式就是通过谷歌的官方文档进行编译。
官方文档地址:chromium编译官方文档 。
记住,你现在可以编译,不代表你以后也可以用这套环境编译最新的源码。别人可以编译,不代表你也能够编译。 一切以官方文档为标准 。
编译chromium源码的系统要求:
-
64位的电脑,而且至少有8G的内存,16G以上更好,多多益善。
-
只编译chrome,需要至少100G的NTFS格式的磁盘存储空间,如果要整体编译,需要至少200G以上的存储空间。
-
比较新的版本的visual studio,至少vs2017以及之后的版本。
-
Windows 10或者更新的操作系统。
满足以上条件就可以愉快地开始编译了。
(1)visual studio的配置
Chromium 需要Visual Studio 2017 (>=15.7.2) 才能构建,但最好使用Visual Studio 2019 (>=16.0.0)。本次编译示范使用的是vs2019的社区版。
这里必须要勾选<span class="ne-text">使用C++的桌面开发</span>
其中的<span class="ne-text">MFC/ATL</span>
组件。
此外,需要额外安装SDK10.0.20348.0。下载链接在这里:SDK下载地址。
安装SDK的时候,Debugging Tools是必须的,保险起见,还是全部勾选吧:
(2)安装depot_tools
下载depot_tools压缩包并解压,并将其配置到环境变量的开头,由于其中会涉及到Python环境变量,所以务必将它移动到最开始,以防Python环境变量配置错误。
配置环境变量的方式:控制面板→系统和安全→系统→高级系统设置:
配置成功后,到对应的depot_tools的目录之下,使用管理员方式打开CMD,运行命令**<span class="ne-text">gclient</span>
,这一步可能需要科学上网,务必保证你可以科学上网。
(3)环境变量
接下来,需要在环境变量中新增以下键值对,其中的GYP_MSVS_OVERRIDE_PATH和vs2019_install填写你自己的vs路径,GYP_MSVS_VERSION是对应的vs版本,WINDOWSSDKDIR是你的SDK安装的路径。
http_proxy和https_proxy是你的科学上网相关的代理。
(4)chromium源码拉取和编译
配置了这么多,终于到了源码拉取的部分,但是这也是最耗费时间的部分。
mkdir chromium && cd chromium # 任意创建一个目录接收源码 fetch chromium --no-history # 拉取最新源码,不带--no-history则拉取完整源码 gclient sync --no-history # 因为网络缘故断开,使用这一句重新同步源码
源码拉取完毕之后,当前目录下会多出一个src目录,源码就位于其中。
cd src #进入目录 gn gen --ide=vs out\Default #在out\Default目录下生成工程文件 autoninja -C out\build mini_installer #编译源码,编译后生成chrome.exe和一个chrome.7z压缩文件 #如果不带mini_installer将会进行整体编译,将近10w个文件,非常耗时
编译完成后,进入out\Default目录下:
到此为止,chromium最新版源码编译成功。
3.如何抹除自动化特征
Tips:对于小白来说,修改chromium底层源码最简单的方式就是善用搜索。**
总体来说,要定位修改的源码,一共分三步走。
-
知晓自己要修改的东西是什么。
-
定位源码中需要修改的地方。
-
修改源代码并回编译(回编译速度会很快,因为是增量的,不是重头开始编译)。
如果要绕过一般的自动化检测网站,最迫切的就是要抹除webdriver这一特征检测,因为检测一般都是检测window.navigator.webdriver 属性,明白了要抹除的是webdriver,第一步就已经完成了。
第二步,定位要修改的源码。如果是使用vs2019打开chromium项目,将会被数以万计的解决方案所淹没。面对这一庞大的工程,小白肯定是目瞪口呆的。因为我们采取在线浏览定位的方式。
chromium在线源码浏览:源码浏览。在这个网站上可以轻松快捷地查看最新版的chromium的源代码,而且有强大的搜索跳转功能,已经能够满足我们修改chromium源码的需求了,因为我们仅仅是要抹除一些特征用于自动化,而非进行浏览器的二次开发。
接着,进入chromium/src当中,切换到third_party/blink目录之下,搜索<span class="ne-text">Navigator::webdriver</span>
,之所以在blink目录之下,是因为chromium使用的是blink内核,在blink之下可以缩小范围,减少搜索量。
许多人可能想问,我为什么知道是搜**<span class="ne-text">Navigator::webdriver</span>
?事实上,我也不知道要搜的是这个,我是先搜索了<span class="ne-text">webdriver</span>
,之后又把navigator相关的文件查看完毕,才知道是这个,这里只是为了让各位更快定位。
chromium中的原始代码如下所示:
bool Navigator::webdriver() const { if (RuntimeEnabledFeatures::AutomationControlledEnabled()) return true; bool automation_enabled = false; probe::ApplyAutomationOverride(GetExecutionContext(), automation_enabled); return automation_enabled; }
我们稍作修改,可以让它永远返回false,或者按照你的需求让它返回其他东西。
bool Navigator::webdriver() const { return false; }
修改完毕之后,我们返回src目录之下,在cmd中输入<span class="ne-text">autoninja -C out\build mini_installer</span>
这次的更新会非常迅速,回编译成功之后,我们就可以看到webdriver已经被修改了。
如果要修改<span class="ne-text">isTrust</span>
也是同理的,直接搜索修改就好了:
bool isTrusted() const { return is_trusted_; }
4.如何随机浏览器指纹
Tips:随机指纹使用的是一样的方法。**
随机指纹使用的方法和上边一般无二。
但是有一个很重要的点需要各位看官明白,浏览器指纹并非是有一个固定的参数或者方法,修改之后就可以过一切网站的指纹检测,不是这样的。
永远要根据你要攻克的网站来动态地确定,不排除大多数网站采取一样的指纹检测策略,比如知名的FP指纹检测:**fingerprint。
说白了,和JS逆向一样,你要随机哪个网站的指纹,先要查看一下该网站的JS代码,看看它计算指纹的时候使用的是哪个方法。
5.浏览器固定指纹
Tips:上边讲的方法是定位,或者说可以做到随机,但是遇到了新的需求.....**
在随机浏览器指纹的过程中,慢慢遇到了一种新的需求,那就是固定指纹。也就是我事先本地写好一套指纹,然后浏览器开启后就用我这一套指纹,什么时候我想更改了,再替换本地文件就可以了。
这种需求常用于跨境电商,指纹不能纯随机,而且如果每次都写死,每次再回编译,再运行,这样也太麻烦了,浪费了许多时间,那么这种需求怎么解决呢?
非常简单,通过命令行传参的形式来实现,命令行指定使用我们的文件,然后在chromium源码中进行读取即可。
4A评测 - 免责申明
本站提供的一切软件、教程和内容信息仅限用于学习和研究目的。
不得将上述内容用于商业或者非法用途,否则一切后果请用户自负。
本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑或手机中彻底删除上述内容。
如果您喜欢该程序,请支持正版,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。敬请谅解!
程序来源网络,不确保不包含木马病毒等危险内容,请在确保安全的情况下或使用虚拟机使用。
侵权违规投诉邮箱:4ablog168#gmail.com(#换成@)