Python + Playwright 无头浏览器Chrome找不到元素

用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来进行浏览器伪装,用浏览器到

https://www.useragentstring.com/index.php

这个网站可以查看当前浏览器使用的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")
### 无头浏览器的使用方法与实现技术 #### 使用方法 无头浏览器可以通过多种编程库和框架进行配置和操作。常见的工具有 Puppeteer 和 Playwright,这些工具提供了高级 API 来控制主流浏览器Chrome/Chromium、Firefox 和 WebKit 的实例[^1]。开发者可以利用这些工具创建脚本,在后台运行自动化任务。 以下是基于 Node.js 平台的一个简单示例,展示如何使用 Puppeteer 启动一个无头浏览器并抓取网页内容: ```javascript const puppeteer = require('puppeteer'); (async () => { const browser = await puppeteer.launch(); // 默认启动无头模式 const page = await browser.newPage(); await page.goto('https://example.com'); const content = await page.content(); // 获取整个 HTML 页面的内容 console.log(content); await browser.close(); })(); ``` 此代码片段展示了如何加载目标网站,并提取其完整的 HTML 结构[^1]。 对于 Python 用户来说,Playwright 是一种强大的替代方案。下面是一个简单的例子,演示了如何用 Python 控制无头浏览器访问特定 URL 并截屏保存图像文件: ```python from playwright.sync_api import sync_playwright with sync_playwright() as p: browser = p.chromium.launch(headless=True) # 设置 headless 参数为 True 表明启用无头模式 page = browser.new_page() page.goto("http://whatsmyuseragent.org/") page.screenshot(path="screenshot.png") # 截图功能 browser.close() ``` 这段代码说明了通过 Playwright 库轻松完成截图的功能[^1]。 #### 实现技术 无头浏览器的核心原理在于模拟真实用户的浏览行为,但在不显示任何 GUI 的前提下工作。具体而言,这类软件会在内存中渲染页面并将最终结果返回给调用者而不是呈现到显示器上[^2]。这种机制允许开发人员专注于数据获取或者功能性验证而不必关心视觉效果。 例如 QtWebKit 提供了一个名为 QWebEngineView 的组件用于常规有界窗口中的 web 显示;然而当需要构建无头版本时,则会采用另一种途径——即直接依赖于底层引擎处理所有的 DOM 解析以及 CSS 渲染等工作流程,只是省去了最后一步即将画面绘制至屏幕上的过程[^2]。 因此无论是哪种具体的实现形式,都离不开以下几个关键技术点: - **DOM 解析**: 将接收到的 HTML 文档转换成内部结构表示以便进一步分析。 - **CSS 渲染**: 计算样式规则应用后的布局信息。 - **JavaScript 执行环境**: 支持动态生成内容所需的 JS 脚本解析器及解释器。 以上就是关于无头浏览器的一些基本概念及其实际运用的例子介绍。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值