在服务器摆设遇到的问题
在服务器上摆设后如果遇到代码执行卡主问题 通过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 Web
- await 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})
- #模拟UserAgent
- await 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:
- sudo apt-get install -y xvfb
复制代码- 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企服之家,中国第一个企服评测及商务社交产业平台。 |