使用selenium将网页保存网页截图,长截图,html文件,mhtml文件

最近在做网页分析需要爬取很多的网页,然后就使用selenium进行了一系列的操作,最后可以保存网页的首页截图,整体截图(包含所有滚动区域),HTML源文件和MHTML源文件,整理后的代码如下:

邮箱,qq邮箱,https://mail.qq.com/
邮箱,阿里邮箱,https://mail.aliyun.com/alimail/auth/login
邮箱,163邮箱,https://mail.163.com/
邮箱,新浪邮箱,https://mail.sina.com.cn/
搜索引擎,百度,https://www.baidu.com/
搜索引擎,搜狗,https://www.sogou.com/
搜索引擎,bing,https://www.bing.com/
商城,淘宝,https://world.taobao.com/
商城,小米商城,https://www.mi.com/shop
商城,京东,https://www.jd.com/
商城,唯品会,https://www.vip.com/

整体代码如下,可以根据自己的功能留下需要的部分

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import csv

# 构造webdriver
driver_path = r"C:\Program Files\Google\Chrome\Application\chromedriver.exe"
options = Options()
options.add_argument('--headless')
driver = webdriver.Chrome(driver_path, options=options)


def save_page(kind, name, url):
    driver.get(url)
    save_path = f"../source/{kind}/{name}/{name}"
    dir_name = os.path.dirname(path)
    if not os.path.exists(dir_name):
        os.makedirs(dir_name)

    # 仅首页图片(未滚动) 1920x1080
    driver.set_window_size(1920, 1680)
    driver.get_screenshot_as_file(save_path + "_short.png")

    # 整体截图(带滚动)
    width = driver.execute_script("return document.documentElement.scrollWidth")
    height = driver.execute_script("return document.documentElement.scrollHeight")
    driver.set_window_size(width, height)
    driver.get_screenshot_as_file(save_path + "_full.png")

    # 保存为html
    source_code = driver.page_source
    with open(save_path + ".html", mode='w', encoding='utf-8') as html_file:
        html_file.write(source_code)

    # 保存为mhtml
    res = driver.execute_cdp_cmd('Page.captureSnapshot', {})
    # 2. write file locally
    with open(save_path + ".mhtml", 'w', newline='') as sf:
        sf.write(res['data'])


if __name__ == '__main__':
    # 打开所有网页列表
    with open("pagelist.txt", mode='r', encoding='utf-8') as f:
        csv_reader = csv.reader(f)
        for line in csv_reader:
            print(line)
            save_page(line[0], line[1], line[2])

    driver.quit()

### 使用 Python 生成网页快照 为了使用 Python 创建网页快照,可以选择多种方法和技术栈。以下是几种常见的方案: #### 方法一:基于 Selenium 的解决方案 Selenium 是一个强大的工具,能够模拟浏览器行为并执行复杂的 Web 自动化操作。通过 WebDriver 接口控制 Chrome 浏览器实例,可以轻松获取指定 URL 页面的屏幕截图。 ```python from selenium import webdriver def capture_webpage_screenshot(url, output_file): options = webdriver.ChromeOptions() options.add_argument('--headless') # 运行无头模式 driver = webdriver.Chrome(options=options) try: driver.get(url) driver.save_screenshot(output_file) finally: driver.quit() if __name__ == "__main__": capture_webpage_screenshot('http://example.com', './screenshot.png') ``` 此代码片段展示了如何定义 `capture_webpage_screenshot` 函数来接收目标网址和输出文件路径作为参数,并最终调用该函数以捕获给定网站的画面[^3]。 #### 方法二:借助 Snappy 库封装 WKHTMLTOPDF/WKHTMLTOIMAGE 工具 Snappy 提供了一个简洁易用的接口来处理 HTML 到图像或 PDF 文件转换的任务。这种方法依赖于底层命令行工具 wkhtmltoimage 来渲染页面内容为静态图片。 安装必要的软件包之后,可以通过以下方式快速设置环境并编写相应逻辑: ```bash pip install python-snappy apt-get install wkhtmltopdf wkhtmltoimage # 或者 yum 安装对于 RedHat/CentOS 用户 ``` 接着,在 Python 中应用如下代码即可完成任务: ```python from weasyprint import HTML import os def generate_thumbnail_from_url(webpage_link, destination_folder="./thumbnails"): if not os.path.exists(destination_folder): os.makedirs(destination_folder) filename = f"{destination_folder}/{hash(webpage_link)}.png" html_doc = HTML(string=requests.get(webpage_link).text) html_doc.write_png(filename) return filename generate_thumbnail_from_url("https://www.example.org/") ``` 请注意这里假设已经正确配置好了 WeasyPrint 和其他所需组件;实际部署时可能还需要调整某些细节配置项[^1]。 #### 方法三:利用 DrissionPage 实现更灵活的功能扩展 DrissionPage 是另一个专注于简化 Web 开发人员日常工作的库,支持保存整个网页的内容至 MHTML、PDF 格式以及截取完整的视窗大小范围内的画面等功能特性。其内部集成了 Chromium 引擎,因此无需额外安装第三方应用程序就能满足大部分需求场景下的要求。 下面是采用这种方式的一个简单例子: ```python from drission.page import PageSession with PageSession() as session: page = session.new_page() page.goto('https://github.com/') screenshot_data = page.screenshot(full=True) with open('./full-page-snapshot.jpg', mode='wb') as imgfile: imgfile.write(screenshot_data.getvalue()) ``` 这段程序说明了怎样启动一个新的浏览会话对象 (`PageSession`) 并导航到特定位置加载资源,随后请求整页长度的抓图数据流并通过二进制形式存储下来形成 JPEG 图像文件[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hydrion-Qlz

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值