使用Python实现网页中图片的批量下载和水印添加保存

news2024/11/26 19:23:37

u=1408047813,2376567744&fm=253&fmt=auto&app=138&f=JPEG.webp
数字时代,图片已经成为我们生活中的一部分。无论是社交媒体上的照片,还是网页中的图片元素,我们都希望能够方便地下载并进行个性化的处理。
假设你是一位设计师,你经常需要从网页上下载大量的图片素材,并为这些图片添加水印以保护你的作品。然而,手动下载和添加水印是一件繁琐的事情 ,这时就可以通过编写一个Python爬虫程序,自动化地完成这个任务,节省时间和精力。
我们的基本思路是通过发送HTTP请求获取网页内容,然后解析网页内容,提取出图片元素的URL。接下来,我们使用请求库下载这些图片,并使用Pillow库添加水印。最后,我们将处理后面的图片保存到本地。
在开始之前,我们需要准备以下工作:

  1. 安装Python:确保您的计算机上已经安装了Python Spark语言的最新版本。
  2. 安装所需的库:我们将使用requests库来发送HTTP请求,PIL库来处理图片。你可以使用以下命令来安装这些库:
pip install requests
pip install pillow

接下来,我们可以定义一个函数来发送HTTP请求并获取页面内容:

def fetch_page(url):
    proxies = {
        "http": f"http://{proxyUser}:{proxyPass}@{proxyHost}:{proxyPort}",
        "https": f"http://{proxyUser}:{proxyPass}@{proxyHost}:{proxyPort}"
    }
    response = requests.get(url, proxies=proxies)
    return response.content

然后,我们可以编写一个函数来解析页面内容并提取图片元素的URL:

from bs4 import BeautifulSoup

def extract_image_urls(page_content):
    soup = BeautifulSoup(page_content, "html.parser")
    image_urls = []
    for img in soup.find_all("img"):
        image_urls.append(img["src"])
    return image_urls

接下来,我们可以编写一个函数来下载图片并添加水印:

def download_and_add_watermark(image_url):
    response = requests.get(image_url)
    image = Image.open(BytesIO(response.content))
    watermark = Image.new("RGBA", image.size, (0, 0, 0, 0))
    draw = ImageDraw.Draw(watermark)
    font = ImageFont.truetype("arial.ttf", 36)
    draw.text((10, 10), "Watermark", font=font, fill=(255, 255, 255, 128))
    watermarked_image = Image.alpha_composite(image.convert("RGBA"), watermark)
    watermarked_image.save("watermarked_image.png")

实现完整代码
以下是完整的Python代码:

import requests
from bs4 import BeautifulSoup
from PIL import Image, ImageDraw, ImageFont
from io import BytesIO

proxyHost = "www.16yun.cn"
proxyPort = "5445"
proxyUser = "16QMSOML"
proxyPass = "280651"

def fetch_page(url):
    proxies = {
        "http": f"http://{proxyUser}:{proxyPass}@{proxyHost}:{proxyPort}",
        "https": f"http://{proxyUser}:{proxyPass}@{proxyHost}:{proxyPort}"
    }
    response = requests.get(url, proxies=proxies)
    return response.content

def extract_image_urls(page_content):
    soup = BeautifulSoup(page_content, "html.parser")
    image_urls = []
    for img in soup.find_all("img"):
        image_urls.append(img["src"])
    return image_urls

def download_and_add_watermark(image_url):
    response = requests.get(image_url)
    image = Image.open(BytesIO(response.content))
    watermark = Image.new("RGBA", image.size, (0, 0, 0, 0))
    draw = ImageDraw.Draw(watermark)
    font = ImageFont.truetype("arial.ttf", 36)
    draw.text((10, 10), "Watermark", font=font, fill=(255, 255, 255, 128))
    watermarked_image = Image.alpha_composite(image.convert("RGBA"), watermark)
    watermarked_image.save("watermarked_image.png")

def main():
    # 获取网页的页面内容
    page_content = fetch_page("https://www.58pic.com/")

    # 提取图片元素的URL
    image_urls = extract_image_urls(page_content)

    # 下载图片并添加水印
    for image_url in

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1089345.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深入了解基数排序:原理、性能分析与 Java 实现

基数排序(Radix Sort)是一种非比较性排序算法,它根据元素的每个位上的值来进行排序。基数排序适用于整数或字符串等数据类型的排序。本文将详细介绍基数排序的原理、性能分析及java实现。 基数排序原理 基数排序的基本原理是按照低位先排序&…

如何解决找不到msvcr100.dll问题,msvcr100.dll丢失的多种修复方案

当我的电脑出现MSVCR100.DLL丢失这个问题时,我感到非常困扰。我试图通过重新安装Visual C 2010 Redistributable Package来解决这个问题,但是这个方法并不总是有效。有些时候,即使我重新安装了整个软件包,MSVCR100.DLL文件仍然找不…

政策加码聚焦工业现代化发展,团队聚能驱动AI机器视觉高质量发展

随着智能制造进程的持续推进,新一代信息技术引领着第四次工业革命,机器视觉技术乘着东风实现高速发展,其视觉创新应用产品全面铺开,新应用、新模式不断涌现。深眸科技紧抓时代发展机遇,基于领先的图像算法和自主研究的…

Windows下DataGrip连接Hive

DataGrip连接Hive 1. 启动Hadoop2. 启动hiveserver2服务3. 启动元数据服务4. 启动DG 1. 启动Hadoop 在控制台中输入start-all.cmd后,弹出下图4个终端(注意终端的名字)2. 启动hiveserver2服务 单独开一个窗口启动hiveserver2服务,…

clone()方法使用时遇到的问题解决方法(JAVA)

我们平时在自定义类型中使用这个方法时会连续遇到 4 个问题。 基础代码如下: class A {int[] a {1,2,3}; }public class Test {public static void main(String[] args) {} } 第一个: 当我们直接调用时报错原因是Object类中的clone方法是被protecte…

什么叫AI自动直播?

AI自动直播是一种使用人工智能技术进行自动直播的程序或系统。 它可以自动录制视频,并在直播平台上进行展示,以吸引观众并提高品牌知名度。AI自动直播通常需要使用特定的软件或平台来实现,并且需要具备一定的编程和人工智能知识。 AI自动直…

win10搭建gtest测试环境+vs2019

首先是下载gtest,这个我已经放在了博客上方资源绑定处,这个适用于win10vs版本,关于liunx版本的不能用这个。 或者百度网盘链接: 链接:https://pan.baidu.com/s/15m62KAJ29vNe1mrmAcmehA 提取码:vfxz 下…

苹果CMS海螺模版V20修复版/加广告代码 ​适合视频影视类网站使用​

最新苹果CMS海螺模版V20修复版,增加广告代码,适合视频影视类网站使用,有兴趣的可以研究研究。 修复说明: 修复多线路时播放页列表点其他线路还是播放默认线路的问题 修复前台黑白切换和字体颜色切换失效 修复微信二维码没有对…

《进化优化》第4章 遗传算法的数学模型

文章目录 4.1 图式理论4.2 马尔可夫链4.3 进化算法的马尔可夫模型的符号4.4 遗传算法的马尔可夫模型4.4.1 选择4.4.2 变异4.4.3 交叉 4.5 遗传算法的动态系统模型4.5.1 选择4.5.2 变异4.5.3 交叉 4.1 图式理论 图式是描述一组个体的位模式,其中用*来表示不在乎的位…

基于PLC的机械手控制系统设计

目录 摘 要......................................................................................................................... 1 第一章 绪论.............................................................................................................…

什么是promise?如何使用?应用场景?

什么是Promise? Promise是一种用于处理异步操作的JavaScript编程模式。它允许你更优雅地处理异步代码,避免了回调地狱(Callback Hell)的问题,使代码更易于理解和维护。Promise是ES6(ECMAScript 2015&#…

云表:MES系统是工业4.0数字化转型的核心

随着信息技术与工业技术的深度融合,网络、计算机技术、信息技术、软件与自动化技术相互交织,产生了全新的价值模式。在制造领域,这种资源、信息、物品和人相互关联的模式被德国人定义为“工业4.0”,也就是第四次工业革命。工业4.0…

力扣每日一题36:有效的数独

题目描述: 请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。 数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考…

GEE:基于GLDAS数据集分析土壤湿度的时间序列变化

作者:CSDN @ _养乐多_ 本篇博客将介绍如何使用Google Earth Engine(GEE)进行土壤湿度数据的分析。我们将使用NASA GLDAS(Global Land Data Assimilation System)数据集,其中包括了关于土壤湿度的信息。通过该数据集,我们将了解土壤湿度在特定区域和时间段内的变化,并生…

Excel 插入和提取超链接

构造超链接 HYPERLINK(D1,C1)提取超链接 Sheet页→右键→查看代码Sub link()Dim hl As HyperlinkFor Each hl In ActiveSheet.Hyperlinkshl.Range.Offset(0, 1).Value hl.AddressNext End Sub工具栏→运行→运行子过程→提取所有超链接地址参考: https://blog.cs…

虚拟现实VR技术在医疗行业的应用介绍

虚拟现实 (VR) 虽然经常与游戏联系在一起,但不可否认,未来科技少不了虚拟现实,其应用可以彻底改变许多行业。在医疗领域,无数人正在探索 VR 可以帮助患者和医疗从业者实现更好的治疗结果治疗方式,比如在手术、疼痛管理…

《UnityShader入门精要》学习3

笛卡尔坐标系(Cartesian Coordinate System) 二维笛卡儿坐标系 一个二维的笛卡儿坐标系包含了两个部分的信息: 一个特殊的位置,即原点,它是整个坐标系的中心。两条过原点的互相垂直的矢量,即x轴和y轴。这…

网工内推 | 运维专场,厂商、软考证书优先,五险一金,节日福利

01 中安网脉 招聘岗位:运维工程师 职责描述: 1、负责驻场单位内网日常运维工作; 2、负责驻场单位网络设备、安全设备、服务器、存储设备、主机等的日常运维工作,按照运维流程要求进行日常运维、巡检、故障处理等运维服务工作。 3…

论文导读|八月下旬Operations Research文章精选:定价问题专题

编者按: ​ ​在“ Operations Research论文精选”中,我们有主题、有针对性地选择了Operations Research中一些有趣的文章,不仅对文章的内容进行了概括与点评,而且也对文章的结构进行了梳理,旨在激发广大读者的阅读兴…

C++编程基础|多级指针

C编程基础|多级指针 一级指针二级指针三级指针多级指针的意义一维数组与数组指针二维数组与数组指针 在看代码时发现下面的内容 GridNodePtr *** GridNodeMap;struct GridNode; typedef GridNode* GridNodePtr;显而GridNodePtr是结构体GridNode首地址指针 那么GridNodeMap是什…