Python pyppeteer 与playwright 模拟欣赏器哀求 摆设服务器遇到的坑 ...

打印 上一主题 下一主题

主题 1028|帖子 1028|积分 3084

在服务器摆设遇到的问题
在服务器上摆设后如果遇到代码执行卡主问题 通过debug 显示 代码到 browser = await launch(headless=False)卡主了 ,由于服务器没有欣赏器的图形化环境,所以只能将修改为无头欣赏器的模式启动 browser = await launch(headless=True)
  1. async def crawling_html(language, redis):
  2.     # 启动浏览器
  3.     browser = await launch(headless=True)
  4.     try:
  5.         logger.info(f"Crawling HTML for language {language}...")
  6.         page = await browser.newPage()
  7.         # 设置浏览器的语言
  8.         await page.setExtraHTTPHeaders({
  9.             'Accept-Language': language
  10.         })
  11.         # 打开 WhatsApp Web
  12.         await page.goto('https://web.whatsapp.com/')
  13.         await page.setViewport({'width': 1920, 'height': 960})
  14.         # 获取页面的 HTML 内容
  15.         html = await page.content()
  16.     except Exception as e:
  17.         logger.exception(e)
  18.     finally:
  19.         await browser.close()
  20.    
复制代码
利用了无头欣赏器的模式 步伐可以运行下去 ,但是在执行到 await page.goto('https://web.whatsapp.com/') 时候出现问题 由于利用了无头欣赏器模式 可能被检测到了是自动化工具访问, 访问超时不响应 , 然后通过修改 User-Agent,让 Pyppeteer 模拟成真实欣赏器,克制被网站检测到利用自动化工具
由于一开始利用的User-Agent参数与实际的参数设置有差异 ,所以哀求虽然没有卡住 但是哀求拿到的效果页面不是正常的页面,提示出现了错误,或者拿到的页面时提示欣赏器版本过低,或者不绝在加载出不来页面,乱码,总之不能正确地处理。
分析是被检测到为异常访问,这里我们可以检察服务器安装的路径 查到安装路径后 设置上启动欣赏器的路径,并且检察当前欣赏器版本google-chrome --version ,设置正确的 User-Agent防止被检测到为自动化访问
手动设置欣赏器的位置
  1. browser = await launch({
  2.     'headless': True,
  3.     'executablePath': '/path/to/your/chrome'  # 替换为你本地 Chrome 或 Chromium 的安装路径
  4. })
复制代码
沙盒模式 解决可能导致卡主问题 可能有些权限不足问题

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

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



  • 无头欣赏器在服务器上运行时可能遇到权限不足的问题。在某些环境中,特别是 Docker 容器、虚拟机或无特权的 Linux 环境中,沙盒模式可能会由于权限问题而导致 Chromium 或 Chrome 无法正常启动。
  • 解决权限辩论:沙盒模式要求欣赏器历程有肯定的权限(例如能够修改历程的用户 ID),在一些受限环境(如 Docker)中无法提供这些权限。因此,禁用沙盒可以绕过这些权限问题。
性能问题



  • 在某些场景下,沙盒模式可能会增加系统的负载或低落性能,尤其是在资源有限的服务器或虚拟环境中。禁用沙盒模式可以进步性能,减少系统开销。
克制欣赏器崩溃



  • 在某些环境中,启用沙盒模式可能导致欣赏器崩溃或卡死。禁用沙盒模式可以克制欣赏器由于沙盒限定而启动失败或崩溃。
什么时候禁用沙盒模式?



  • 在无图形界面的服务器、Docker 容器、虚拟机、CI/CD 系统中,常常必要禁用沙盒模式,尤其是当你运行无头欣赏器时(如利用 headless: true 模式的 Pyppeteer、Playwright 或 Selenium)。
  • 在开辟、自动化测试或爬虫中,如果遇到欣赏器启动失败、权限不足等问题,禁用沙盒模式可能是解决方案之一。
禁用沙盒模式示例代码:
1. Pyppeteer

  1. browser = await launch({
  2.     'headless': True,
  3.     'args': ['--no-sandbox', '--disable-setuid-sandbox']
  4. })
复制代码
2. Playwright

  1. async with async_playwright() as p:
  2.     browser = await p.chromium.launch(
  3.         headless=True,
  4.         args=['--no-sandbox', '--disable-setuid-sandbox']
  5.     )
复制代码
所以,终极代码:
  1. async def crawling_html(language, redis):
  2.     logger.info(f'Start crawling HTML for language {language}...')
  3.     is_prod = os.getenv('PROJECT_ENV') == 'prod'
  4.     logger.info(f'is_prod: {is_prod}')
  5.     # 启动浏览器
  6.     browser = await launch({
  7.         'headless': True,  # 无头模式,不需要显示界面
  8.         'executablePath': '/usr/bin/google-chrome' if is_prod else 'C:/Program Files/Google/Chrome/Application/chrome.exe', # 配置浏览器位置不适用默认安装的浏览器防止安装问题
  9.         'args': ['--no-sandbox', '--disable-setuid-sandbox', '--disable-features=IsolateOrigins,site-per-process']
  10.         # 禁用沙盒模式,避免权限问题
  11.     })
  12.     version_info = await browser.version()
  13.     try:
  14.         page = await browser.newPage()
  15.         #删除之前的缓存
  16.         await page.deleteCookie(*await page.cookies())
  17.         #模拟用户响应
  18.         await page.mouse.move(100, 100)
  19.         await page.mouse.click(100, 100)
  20.         # 打开 WhatsApp Web,并等待页面加载完成
  21.         await page.setExtraHTTPHeaders({'Accept-Language': language})
  22.         #模拟UserAgent
  23.         await page.setUserAgent(
  24.             "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36")
  25.         #配置超时时间
  26.         await page.goto('https://web.whatsapp.com/', timeout=120000)
  27.         await page.setViewport({'width': 1920, 'height': 960})
  28.         # 获取页面的 HTML 内容
  29.         html = await page.content()
  30.         # 从html中解析出版本号
  31.         version = ''
  32.         $...一些其他的操作...
  33.     except Exception as e:
  34.         logger.exception(e)
  35.     finally:
  36.         await browser.close()
复制代码
别的一种可能解决问题的方案 Xvfb(虚拟显示) 不保举 淹灭资源 无头模式后台运行更高效 未采用

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

  • 安装 Xvfb:
  1. sudo apt-get install -y xvfb
复制代码

  • 在 Xvfb 中运行你的脚本:
  1. xvfb-run python your_script.py
复制代码
模拟欣赏器的哀求框架pyppeteer 与playwright 对比
Pyppeteer 和 Playwright 都是用于控制无头欣赏器的库,但它们在计划和功能上有一些关键区别:
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:

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


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

西河刘卡车医

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表