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

news/2024/12/22 20:47:07/

服务器部署遇到的问题

服务器上部署后如果遇到代码执行卡主问题 通过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 模式的 PyppeteerPlaywright 或 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.ppmy.cn/news/1530686.html

相关文章

linux常见指令与权限【第四课】

19.tar指令(重要):打包/解包,不打开它,直接看内容 tar [-cxtzjvf] : -c :建立一个压缩文件的参数指令 (create 的意思 ) ; -x :解开一个压缩文件的参数指令&#xff…

Elasticsearch实战应用

Elasticsearch作为一个强大的分布式搜索引擎,因其高性能、灵活性和易扩展性,广泛应用于多个领域。本文将探讨几个实际应用中的Elasticsearch,并分享如何高效地利用这一工具来提升系统性能和用户体验。 一、前言 在现代应用中,数…

【吊打面试官系列-MySQL面试题】MySQL 数据库作发布系统的存储,一天五万条以上的增量,预计运维三年,怎么优化?

大家好,我是锋哥。今天分享关于【MySQL 数据库作发布系统的存储,一天五万条以上的增量,预计运维三年,怎么优化?】面试题,希望对大家有帮助; MySQL 数据库作发布系统的存储,一天五万条以上的增量…

17121 求二叉树各种节点数

### 思路 1. 使用先序遍历的方式构造二叉树。 2. 使用递归函数 CreateBiTree 来构造二叉树。 3. 使用递归函数 CountNodes 来统计度为2、度为1和度为0的节点数。 ### 伪代码 1. 定义二叉树节点结构 BiTNode 和二叉树指针 BiTree。 2. 定义 CreateBiTree 函数: -…

【第二十二章:Sentosa_DSML社区版-扩展编程】

【第二十二章:Sentosa_DSML社区版-扩展编程】 扩展编程类算子是算子里支持sql语句编写及脚本编程,用户可以根据自己的需要在算子中编写自己需要执行的sql语句或者脚本对数据进行处理。扩展编程类算子数据算子流中的中间算子。 22.1 Sql 1.算子介绍 SQL…

【计网】从零开始学习http协议 --- http的请求与应答

如果你不能飞,那就跑; 如果跑不动,那就走; 实在走不了,那就爬。 无论做什么,你都要勇往直前。 --- 马丁路德金 --- 从零开始学习http协议 1 什么是http协议2 认识URL3 http的请求和应答3.1 服务端设计…

网络通信——DHCP

目录 一.DHCP应用场景 二.通信过程 三.DHCP报文 四.DHCP通信原理 (1)租借过程 (2)DHCP 租期更新 (3)DHCP重绑定 五.一般路由器的DHCP支持两种地址池 (1)接口地址池 &…

nlp大语言模型原理

NLP(自然语言处理)的主要任务可以分为以下几个方面‌: ‌词法分析(Lexical Analysis)‌:这是NLP的基础,包括分词(Tokenization)、词性标注(Part-of-Speech Ta…