在网络抓取社区里,有个问题隔三差五就会冒出来,问法都差不多:我喜欢用scrapy-playwright,但我想跑camoufox或其他Python浏览器库,不想用它自带的浏览器,到底怎么接进去?
很长一段时间里,诚实的回答都是某种版本的“可以,但不太好搞”。人们在GitHub issue里提,在论坛上讨论,所有存在的变通方案都要求你另外想办法运行那个浏览器,再通过CDP连上。
这个局面被scrapy-playwright的一个小更新打破了:PLAYWRIGHT_BROWSER_PROVIDER。它把浏览器生命周期交给你想用的任何Playwright兼容包去管。这是一个集成进Scrapy和scrapy-playwright的小型Python类,读起来像是更新日志里一行就能写完的条目,却悄悄抹掉了一大群人早已学会忍受的烦恼。
要理解这为什么重要,得先弄清楚人们为什么要换个浏览器。Playwright驱动浏览器的能力很强,scrapy-playwright把这个能力接入Scrapy的下载处理器,让渲染好的页面通过正常的请求响应循环回来,异步且快速。问题出在二进制文件上。Playwright附带的是标准的、广为人知的Chromium和Firefox构建版本,这意味着就连基础的反机器人系统都能几乎瞬间识别出它们,而你想访问的网站通常不会只跑基础的反机器人系统。这些浏览器是为自动化测试设计的,根本不是专门用来抓数据的。
过去绕开识别,靠的是运行时修补浏览器,但这招已经不够用了。现在更有效的项目是在源码层面修改浏览器,把改动编译进二进制文件本身,而不是等标准构建跑起来以后再去打补丁。运行时修补容易留下细微的不一致,现代指纹识别技术恰恰善于发现这些不一致。每处不匹配都会降低网站对你会话的信任分,增加触发验证的可能性,所以目标就是呈现一个毫无异常痕迹的浏览器。编译时修改更难被检测到,而Chromium和Firefox暴露的内容不同,各需要不同的修改。这是现代隐身浏览器运作机制的重要一环,不是全貌,但足以解释为什么换浏览器值得折腾,尤其是当下反机器人厂商更新节奏快,任何依赖手动调参的方案都会被惩罚。
scrapy-playwright之前已经有一个接入其他浏览器的好办法:连接到一个在别处运行的浏览器,通过PLAYWRIGHT_CDP_URL或Playwright自己的connect接口。但那个方案的问题在于,你得自己管理浏览器的启动、关闭和重启,scrapy-playwright不插手这些。如果浏览器挂了,爬虫就卡住。如果你想在浏览器上跑camoufox这类东西,你得先以正确的方式启动camoufox,再让playwright连上它,这意味着你得写一套完全独立的进程管理逻辑,和Scrapy的爬虫循环各跑各的。
PLAYWRIGHT_BROWSER_PROVIDER把这个中间地带填上了。现在你可以写一个Python类,把浏览器启动和关闭的逻辑放进去,scrapy-playwright会在需要的时候调用它,浏览器成为请求处理管线的一部分,而不是管线外的另一个东西。这意味着camoufox这类项目可以像一个普通的playwright浏览器那样使,打开方式、传参方式都保持一致,只是浏览器本身被换掉了。
对于已经习惯在Scrapy生态里干活的人来说,这少了一大块自己想维护的胶水代码。你不用再操心进程管理是不是写对了,不用再手动重启挂掉的浏览器实例,也不用再琢磨CDP端口会不会冲突。你只需要写一个提供浏览器实例的类,剩下的交给scrapy-playwright就好。
热门跟贴