用Python + Playwright调试时,发现不用无头浏览器(即headless=False
)代码能够运行成功,但是一用无头浏览器时(即headless=True
)就会报错,提示找不到元素。
排错方法
插入以下代码,在找不到元素的那个地方前面截一张图,看看那个找不到的元素在截图中是存在还是不存在
page.screenshot(path="screenshot.png")
如果是白屏的话,大概率是被反爬了
原因一:页面有反爬手段
①user-agent反爬
其中一种常见的反爬虫手段是通过检测当前user-agent是否为真实浏览器来区分当前请求是否来自真实用户。爬虫使用的常见user-agent类型为:
user-agent为空。没有设置user-agent。
user-agent中包含特殊字符。如:python,java,bot,spider,headless等。
而使用Playwright的Chrome无头浏览器访问网站时,user-agent中会自动添加Headless字段。当网站检测到user-agent包含Headless时判定为非真实请求时,可能会返回空页面,所以导致无头浏览器找不到元素。
因此我们需要添加user-agent来进行浏览器伪装,用浏览器到
这个网站可以查看当前浏览器使用的User Agent String,例如我的浏览器的User Agent String是Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36
随后参考以下示例,添加浏览器启动参数即可
def run(playwright: Playwright) -> None:
browser = playwright.chromium.launch(headless=True, args=['--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36'])
出现这个问题时,有时候换成Firefox浏览器的无头模式又不会有这个问题。所以如果大家使用playwright codegen
时遇到机器人检测的网站过不去的,也可以尝试加上-b firefox
参数去指定使用Firefox浏览器去录制脚本,亲测对某些机器人检测的网站友好很多
②webdriver反爬
请参考此博主的文章:《使用playwright防止被网站检测的方法》
原因二:页面元素是动态加载的
动态加载的元素会让元素只有滚动到某个地方才会加载出来,可以使用playwright来滚动页面
原因三:浏览器语言问题
playwright默认的无头浏览器默认语言是英文,因此有的网页可能就是自动使用的英文来加载页面,这点可以通过上面的截图排错方法来得到验证。在new_context的方法中加上locale="zh-CN"
就可以将语言切换为中文
context = browser.new_context(locale="zh-CN")