Python pyppeteer 与playwright 模拟浏览器请求 部署服务器遇到的坑

在服务器部署遇到的问题

在服务器上部署后如果遇到代码执行卡主问题 通过debug 显示 代码到 browser = await launch(headless=False)卡主了 ,由于服务器没有浏览器的图形化环境,所以只能将修改为无头浏览器的模式启动 browser = await launch(headless=True)

async def crawling_html(language, redis):# 启动浏览器browser = await launch(headless=True)try:logger.info(f"Crawling HTML for language {language}...")page = await browser.newPage()# 设置浏览器的语言await page.setExtraHTTPHeaders({'Accept-Language': language})# 打开 WhatsApp Webawait page.goto('https://web.whatsapp.com/')await page.setViewport({'width': 1920, 'height': 960})# 获取页面的 HTML 内容html = await page.content()except Exception as e:logger.exception(e)finally:await browser.close()

使用了无头浏览器的模式 程序可以运行下去 ,但是在执行到 await page.goto('https://web.whatsapp.com/') 时候出现问题 由于使用了无头浏览器模式 可能被检测到了是自动化工具访问, 访问超时不响应 , 然后通过修改 User-Agent,让 Pyppeteer 模拟成真实浏览器,避免被网站检测到使用自动化工具

由于一开始使用的User-Agent参数与实际的参数设置有差异 ,所以请求虽然没有卡住 但是请求拿到的结果页面不是正常的页面,提示出现了错误,或者拿到的页面时提示浏览器版本过低,或者一直在加载出不来页面,乱码,总之不能正确地处理。

分析是被检测到为异常访问,这里我们可以查看服务器安装的路径 查到安装路径后 配置上启动浏览器的路径,并且查看当前浏览器版本google-chrome --version ,配置正确的 User-Agent防止被检测到为自动化访问

手动配置浏览器的位置

browser = await launch({'headless': True,'executablePath': '/path/to/your/chrome'  # 替换为你本地 Chrome 或 Chromium 的安装路径
})

沙盒模式 解决可能导致卡主问题 可能有些权限不足问题

为什么在服务器上要禁用沙盒模式?

在服务器环境中,启用沙盒模式有时会导致权限或性能问题,因此禁用沙盒模式可以避免这些问题。

权限问题
  • 无头浏览器在服务器上运行时可能遇到权限不足的问题。在某些环境中,特别是 Docker 容器、虚拟机或无特权的 Linux 环境中,沙盒模式可能会因为权限问题而导致 Chromium 或 Chrome 无法正常启动。

  • 解决权限冲突:沙盒模式要求浏览器进程有一定的权限(例如能够修改进程的用户 ID),在一些受限环境(如 Docker)中无法提供这些权限。因此,禁用沙盒可以绕过这些权限问题。

性能问题
  • 在某些场景下,沙盒模式可能会增加系统的负载或降低性能,尤其是在资源有限的服务器或虚拟环境中。禁用沙盒模式可以提高性能,减少系统开销。

避免浏览器崩溃
  • 在某些环境中,启用沙盒模式可能导致浏览器崩溃或卡死。禁用沙盒模式可以避免浏览器因为沙盒限制而启动失败或崩溃。

什么时候禁用沙盒模式?

  • 在无图形界面的服务器、Docker 容器、虚拟机、CI/CD 系统中,常常需要禁用沙盒模式,尤其是当你运行无头浏览器时(如使用 headless: true 模式的 Pyppeteer、Playwright 或 Selenium)。

  • 在开发、自动化测试或爬虫中,如果遇到浏览器启动失败、权限不足等问题,禁用沙盒模式可能是解决方案之一。

禁用沙盒模式示例代码:

1. Pyppeteer
browser = await launch({'headless': True,'args': ['--no-sandbox', '--disable-setuid-sandbox']
})
2. Playwright
async with async_playwright() as p:browser = await p.chromium.launch(headless=True,args=['--no-sandbox', '--disable-setuid-sandbox'])

所以,最终代码:

async def crawling_html(language, redis):logger.info(f'Start crawling HTML for language {language}...')is_prod = os.getenv('PROJECT_ENV') == 'prod'logger.info(f'is_prod: {is_prod}')# 启动浏览器browser = await launch({'headless': True,  # 无头模式,不需要显示界面'executablePath': '/usr/bin/google-chrome' if is_prod else 'C:/Program Files/Google/Chrome/Application/chrome.exe', # 配置浏览器位置不适用默认安装的浏览器防止安装问题'args': ['--no-sandbox', '--disable-setuid-sandbox', '--disable-features=IsolateOrigins,site-per-process']# 禁用沙盒模式,避免权限问题})version_info = await browser.version()try:page = await browser.newPage()#删除之前的缓存await page.deleteCookie(*await page.cookies())#模拟用户响应await page.mouse.move(100, 100)await page.mouse.click(100, 100) # 打开 WhatsApp Web,并等待页面加载完成await page.setExtraHTTPHeaders({'Accept-Language': language})#模拟UserAgentawait page.setUserAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36")#配置超时时间await page.goto('https://web.whatsapp.com/', timeout=120000)await page.setViewport({'width': 1920, 'height': 960})# 获取页面的 HTML 内容html = await page.content()# 从html中解析出版本号version = ''$...一些其他的操作...except Exception as e:logger.exception(e)finally:await browser.close()
另外一种可能解决问题的方案 Xvfb(虚拟显示) 不推荐 耗费资源 无头模式后台运行更高效 未采用

如果你需要 headless=False 但服务器没有显示环境,你可以使用 Xvfb(虚拟显示帧缓冲)模拟图形环境。安装和使用 Xvfb

  1. 安装 Xvfb

sudo apt-get install -y xvfb
  1. Xvfb 中运行你的脚本:

xvfb-run python your_script.py

模拟浏览器的请求框架pyppeteer 与playwright 对比

PyppeteerPlaywright 都是用于控制无头浏览器的库,但它们在设计和功能上有一些关键区别:

1. 基础和支持

  • Pyppeteer:

    • Puppeteer Python 的端口,主要针对 Chromium。

    • 只支持 Chrome/Chromium,缺乏对其他浏览器的支持。

  • Playwright:

    • 由 Microsoft 开发,支持多种浏览器(Chromium、Firefox 和 WebKit)。

    • 更加现代化,设计用于跨浏览器测试和自动化。

2. 功能

  • Pyppeteer:

    • 功能较为基础,适合简单的自动化任务。

    • 提供常见的浏览器操作,如导航、截屏、填表等。

  • Playwright:

    • 功能更为强大,支持浏览器上下文、多个标签页、网络拦截和模拟设备等。

    • 提供更丰富的 API,支持等待元素、操作事件、运行脚本等高级功能。

3. 异步支持

  • Pyppeteer:

    • 使用 Python 的 asyncio 进行异步操作,语法相对简单,但可能在某些情况下不够灵活。

  • Playwright:

    • 也使用 asyncio库,并且在异步操作上表现更好,支持更复杂的用例。

4. 文档和社区支持

  • Pyppeteer:

    • 文档相对简单,社区支持较少。

  • Playwright:

    • 拥有更完善的文档和活跃的社区,问题和新特性更新频繁。

5. 安装和使用

  • Pyppeteer:

    • 安装简单,但需要注意 Chromium 的下载和管理。

  • Playwright:

    • 安装更方便,会自动下载所需的浏览器,并且支持多个浏览器的安装。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/54971.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

FPGA IP 和 开源 HDL 一般去哪找?

在FPGA开发的世界中,IP核和HDL模块是构建复杂数字系统的基石。它们如同乐高积木,让开发者能够快速搭建和重用经过验证的电路功能。但你是否曾感到迷茫,不知道从哪里寻找这些宝贵的资源?本文将为你揭开寻找FPGA IP核和HDL模块资源的…

Tesla T4 P2P测试

Tesla T4 P2P测试 一.测试环境二.测试步骤1.获取设备信息2.查看PCIE拓扑结构3.选择9B、9E这二张4.查看逻辑设备ID5.设置环境变量(需要用逻辑设备ID,通过UUID跟smi看到的物理ID关联)6.不同地址的原子操作2.P2P与非P2P的性能差异3.GPU带宽测试 Tesla T4 P2P测试 通过物理ID找到逻…

2024PT展,现场精华

9月25-27日,2024年国际信息通信展(简称PT展)在北京国家会议中心召开。 小枣君去了现场,也拍了一些照片,特此分享给大家。 会场离“奥林匹克公园”地铁站很近: Logo设计得还是挺好看的: 熟悉的场…

一区黏菌算法+双向深度学习+注意力机制!SMA-BiTCN-BiGRU-Attention黏菌算法优化双向时间卷积双向门控循环单元融合注意力机制多变量回归预测

一区黏菌算法双向深度学习注意力机制!SMA-BiTCN-BiGRU-Attention黏菌算法优化双向时间卷积双向门控循环单元融合注意力机制多变量回归预测 目录 一区黏菌算法双向深度学习注意力机制!SMA-BiTCN-BiGRU-Attention黏菌算法优化双向时间卷积双向门控循环单元…

探索机器人快换盘技术的未来之路:智能化与协作的革新

在当今快速发展的科技时代,机器人已成为众多领域不可或缺的得力助手。其中,机器人快换盘技术作为提升机器人灵活性和应用广度的重要技术,正经历着前所未有的变革与创新。下面请随我们一起深入探讨这一技术的未来发展趋势。 一、人工智能&…

<<迷雾>> 第 4 章 电子计算机发明的前夜 示例电路

莫尔斯电报示意图 info::操作说明 鼠标单击开关切换开合状态 通电后, 线圈产生磁力从而将铁片开关(衔铁臂)吸引下来 primary::在线交互操作链接 https://cc.xiaogd.net/?startCircuitLinkhttps://book.xiaogd.net/cyjsjdmw-examples/assets/circuit/cyjsjdmw-ch04-01-morse-te…

Shopline对接需要注意的问题

Shopline对接是一项复杂而细致的工作,为了确保对接的顺利进行,并保证系统的稳定性和可靠性,需要注意以下几个方面。 1.API文档的详细阅读 功能理解: 仔细阅读Shopline提供的API文档,全面了解每个接口的功能、参数、返…

初始docker以及docker的基本使用!!!

文章目录 虚拟化技术Docker/podman 命令通用命令查看docker 当前版本管理docker运行 镜像操作[image]列出本地所有镜像拉取镜像删除镜像把docker中的镜像打包成文件把镜像文件加载到docker中上传镜像 容器操作[container]创建容器docker run的参数选项列出所有容器启动容器停止…

安防区域保护:无线电干扰设备技术详解

在安防区域保护中,无线电干扰设备技术扮演着重要角色,它主要用于通过发射特定频率的无线电波来干扰无人机或其他无线电设备的通信链路、导航信号或控制信号,以达到削弱、阻断甚至控制这些设备运行的目的。以下是对无线电干扰设备技术的详细解…

【GAN】生成对抗网络Generative Adversarial Networks理解摘要

【Pytorch】生成对抗网络实战_pytorch生成对抗网络-CSDN博客 【损失函数】KL散度与交叉熵理解-CSDN博客 [1406.2661] Generative Adversarial Networks (arxiv.org) GAN本质是对抗或者说竞争,通过生成器和鉴别器的竞争获取有效地结果,换句话说&#xff0…

每日一练 2024.9.29(2)

目录 解题思路与代码实现 题目分析 一、解题策略 关键步骤: 二、代码实现 三、代码解析 四、复杂度分析 五、运行示例 示例1: 示例2: 六、总结 解题思路与代码实现 题目分析 这道题目要求我们找到字符串列表 strs 中的相似字符组…

C++——vector

1.简介 2.成员函数 2.1构造函数 void test_vector1() {//1.无参构造vector<int> v1;cout << v1.capacity() << endl;//2.传参构造vector<int> v2(10,1);//3.迭代器构造vector<int> v3(v2.begin(), v2.end());//也可以使用其它容器的迭代器区间来…

scrapy快速上手

安装 除了scrapy本身还要安装两个库 pip install scrapy pip install pywin32 pip install wheel 创建项目 在要创建项目的地方打开powershell scrapy startproject 项目名 我们得到这样的项目结构&#xff0c;功能如下 scrapy.cfg 项目的主配置信息 …

LeetCode[中等] 17. 电话号码的字母组合

给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下&#xff08;与电话按键相同&#xff09;。注意 1 不对应任何字母。 思路 回溯法 log&#xff1a;当前结果数组&#xff1b;level&#xff1a…

第五届计算机科学与管理科技国际学术会议(ICCSMT 2024)

梁哲&#xff0c;同济大学长聘特聘教授&#xff0c;国家杰青、首届国家杰青延续项目获得者、上海市曙光学者、上海市优秀学术带头人。本科毕业于新加坡国立大计算机工程系、硕士毕业于新加坡国立大学工业与系统工程系、博士毕业于美国新泽西州立大学工业工程系。理论研究主要集…

修改Opcenter EXFN 页面超时时间(Adjust UI Session Extend Token)

如果你想修改Opcenter EXFN中页面Session的超时时间&#xff0c;你可以按照如下步骤修改SessionAge 这个参数&#xff1a; 管理员运行CMD执行以下命令 umconf -getconfig -file C:\temp\config.json如果第2步有报错&#xff0c;则执行步骤4;如果没有报错则执行第5步如果第2步…

探索光耦:光耦在电脑电源中的应用及其重要性

随着计算机技术的飞速发展&#xff0c;电脑已成为现代生活和工作中不可或缺的工具。无论是日常办公、游戏娱乐还是复杂的图像处理&#xff0c;电脑电源的稳定性和安全性都至关重要。作为电脑电源的核心部件之一&#xff0c;光耦&#xff08;光电耦合器&#xff09;在提升电源性…

JavaScript网页设计案例:互动式简历网站

JavaScript网页设计案例&#xff1a;互动式简历网站 在现代网页设计中&#xff0c;JavaScript 是实现交互和动态效果的关键技术。本文将通过一个完整的案例&#xff0c;展示如何使用 JavaScript 构建一个交互式的个人简历网页。本文不仅会涵盖 HTML 和 CSS 的使用&#xff0c;…

android和ios双端应用性能的测试工具

1.工具介绍 基于日常工作的需要&#xff0c;开发了一款新的android和ios端应用性能测试工具&#xff0c;本工具在数据测试方面与所流行的工具没有区别。欢迎下载使用体验。 本工具为筋斗云&#xff0c;工具说明 本工具无侵入&#xff0c;不需要root&#xff0c;低延迟…

(十七)、Mac 安装k8s

文章目录 1、Enable Kubernetes2、查看k8s运行状态3、启用 kubernetes-dashboard3.1、如果启动成功&#xff0c;可以在浏览器访问3.2、如果没有跳转&#xff0c;需要单独安装 kubernetes-dashboard3.2.1、方式一&#xff1a;一步到位3.2.2、方式二&#xff1a;逐步进行 1、Enab…