Chrome DevTools协议之Page.captureSnapshot

我的项目需求是这样的:在无headless的情况下实现保存mhtml格式的网页,假如允许有头的话我可以用ctrl+s模拟人工保存页面的方式加上selenium带的chromeOptions.add_argument(’–save-page-as-mhtml’) 功能即可实现,但是考虑到部署服务器以及效率等问题需要在无headless的模式下是最理想的,经过翻阅资料了解到了Chrome DevTools谷歌浏览器开发者工具远程调试协议中的Page.captureSnapshot方法来实现我的需求,代码如下(这里我只贴出demo)

# -*- coding: utf-8 -*-
import time
from selenium import webdriver
from urllib.parse import urljoin

class Spider(object):
    def __init__(self):
        self.chromeOptions = self.get_profile()
        self.browser = self.get_browser()

    def get_profile(self):
        chromeOptions = webdriver.ChromeOptions()
        chromeOptions.add_argument('--headless')         # 谷歌无头模式
        chromeOptions.add_argument('--disable-gpu')       # 禁用显卡
        chromeOptions.add_argument('window-size=1280,800')  # 指定浏览器分辨率
        chromeOptions.add_argument("--no-sandbox")
        return chromeOptions

    def get_browser(self):
        browser = webdriver.Chrome(chrome_options=self.chromeOptions)
        return browser

    def _get_page(self):
        initial_url = 'https://www.breakyizhan.com/chromeconsole/2285.html'
        self.browser.get(initial_url)
            # 执行 Chome 开发工具命令,得到mhtml内容
        res = self.browser.execute_cdp_cmd('Page.captureSnapshot', {})
        with open('{}.mhtml'.format(initial_url.split('/')[-1]), 'w',newline='') as f:
            f.write(res['data'])

if __name__ == '__main__':
    l = Spider()
    l._get_page()
    l.browser.quit()


版权声明:本文为weixin_42603784原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。