当前位置: 首页 > 后端技术 > Node.js

Puppeteer系列踩坑日志—2—去掉自动化提示

时间:2023-04-04 01:31:06 Node.js

在使用puppeteer自动化的过程中,经常会出现自动化提示:正在自动化测试中。而这个提醒不仅有这个作用,还可以让很多网站识别出你是在使用爬虫访问,从而采取相应的应对措施。你知道如何反制。今天就来讨论这个问题吧!基础知识:chrome启动参数的理解关于启动参数,网上已经有很多罗列了。我也推荐一个大家觉得比较全面的列表:https://peter.sh/experiments/...拿去列表吧,现在我们来了解一下,chrome的启动参数是什么?(如果你已经看懂了,或者急着想看解法,可以跳过这一段,直接看后面。这里原理不要太啰嗦,我会照顾有问题的同学不懂。)不知道大家在使用chrome浏览器的时候有没有注意到右上角的“User”选项,当我们新建一个用户的时候,其实桌面会自动生成一个快捷方式我们。所谓用户:理解为谷歌的clone,又开了一个和现在完全无关的chrome。比如开更多的账户等等。我们打开这个快捷方式,看看里面是怎么回事,属性,查看目标栏,我们可以看到一堆这样的东西:"C:ProgramFiles(x86)GoogleChromeApplicationchrome.exe"--profile-directory="Profile5"--profile-directory?选择与第一个启动的浏览器关联的配置文件目录。?配置文件目录选择与第一个启动的浏览器相关联的配置文件目录。其实前面的路径可以省略,就是大家的chrome的安装路径,主要是后半部分是什么鬼?其实这就是我们说的命令行参数。我们打开之前Peter给出的chrome启动参数列表,搜索这一行的解释:Selectsdirectoryofprofiletoassociatewiththefirstbrowserlaunched。与浏览器相关的配置文件目录。然后我明白了,其实chrome的命令行参数就是做一些类似改变chrome启动操作的事情,比如:配置用户目录,改变浏览器窗口大小,关闭浏览器跨域,改变浏览器渲染过程等等。所以我们关心删除自动化提示。其实我们可以在这里找到答案。我们继续回头看Peter给出的列表,转到这个参数:--enable-automation?启用指示浏览器被自动化控制。?Automation测试提示参数启用浏览器由自动化控制的指示。好家伙,我们现在看到的就是罪魁祸首,那你可能会有疑问:我的代码里什么都没加,怎么还有呢?别着急,我们再想想npm包本身?问题出在这里吗?由此,我们介绍了第一个解决方法。方案一:修改puppeteernpm包源码(不推荐)。当您第一次看到标题时,您就会知道。不推荐这种方式,因为源码损坏,以后包升级还是会出问题。但是还是要说一下,因为明白了原理就可以举一反三了。我们在查看源码的时候,首先要到project\node_modules\puppeteer目录下查看。我们发现下面的目录是这样的:解释几个很有意思的目录:.local-chromium:刚出来的时候大家不得不用puppeteer拿XX因为gadget下载不了,很多人放弃了。事实上,它里面有铬。通常,启动puppeteer时,默认会调用此浏览器。这个浏览器的优点是免安装,随时可用,更新快,有激进的功能(没发现激进的,偶尔存到U盘用chrome浏览网页在一些不太年轻的计算机上)index.jslib首先在index.js中,我们看到这个constPuppeteer=require('./lib/Puppeteer');,我们就根据这个找出puppeteer是从哪里来的?打开puppeteer.js并继续阅读。第一行constLauncher=require('./Launcher');引起了我们的怀疑,因为下面的代码有与其密切相关的选项,我们不会放过一个灵性,我们打开查看,粗略的看了一下。好像没什么问题?不过不用担心,继续往下看,我们发现了一堆有趣的东西:NetworkServiceInProcess','--disable-background-timer-throttling','--disable-backgrounding-occluded-windows','--disable-breakpad','--disable-client-side-phishing-detection','--disable-component-extensions-with-background-pages','--disable-default-apps','--disable-dev-shm-usage','--disable-extensions','--disable-features=TranslateUI','--disable-hang-monitor','--disable-ipc-flooding-protection','--disable-popup-blocking','--disable-prompt-on-repost','--disable-renderer-backgrounding','--disable-sync','--force-color-profile=srgb','--metrics-仅记录','--no-first-run','--enable-automation','--password-store=basic','--use-mock-keychain',];const{devtools=false,headless=!devtools,args=[],userDataDir=null}=options;如果(userDataDir)chromeArguments.push(`--user-data-dir=${userDataDir}`);如果(devtools)chromeArguments.push('--auto-open-devtools-for-tabs');如果(无头){chromeArguments。push('--headless','--hide-scrollbars','--mute-audio');}if(args.every(arg=>arg.startsWith('-')))chromeArguments.push('about:blank');chromeArguments.push(...args);返回chromeArguments;}你是惊讶还是惊奇?可以看到名字:defaultArgs,也就是当你启动puppeteer的时候,不管怎样,它都会给你一个这样的参数列表来添加进去,所以我们在使用puppeteer的时候,在这里试试:--e删除nable-automation,重新运行puppeteer,烦人的提示就没有了(这时候试试登录那些反爬虫网站,soeasy!)注:我遇到过一个让我汗颜的问题,我曾经自信地告诉我的同事:这个方法肯定没问题,但是当去掉并进行上面的操作时,提示没有了,但还是被反爬虫网站发现了!我真的看到了恶魔!这一巴掌来得太快了!解决坑:最后经过不断的排查,发现是chromium的问题,换成chrome或者其他版本的chromium是没有问题的,所以遇到类似问题可以尝试换下一个版本或铬。这也印证了为什么谷歌官网chromium提示我们不稳定。官方boss说的每一句话,你还真不能小看!解决方案二:官方解决方案(推荐)这里我们对解决方案进行说明。有一句名言:遇到问题,先看官方文档。看完了,是不是还不知道怎么解决呢?请阅读并记住文档!其实官方文档已经给出了解决方案(但是官方文档不喜欢直截了当地告诉你),大家回忆一下文档里面是怎么说的,启动的时候有个参数:ignoreDefaultArgs官方原文在这里:https://github.com/puppeteer/...这个属性可以过滤掉默认提供给你的参数。接收到的类型:>我们要把过滤后的参数写成['参数1','参数2','参数3'...],加上这个,问题就完美解决了!照顾一下连代码都懒得敲的同学:puppeteer.launch({...ignoreDefaultArgs:['--enable-automation']...})然后测试一下,不会有测试提示.如果遇到其他问题,可以在评论底部联系我,我们一起学习如何解决这个坑。