Python爬虫爬取图片并存储到MongoDB(注意:仅尝试存储一条空的示例数据到MongoDB,验证MongoDB的联通性)
以下是一个使用Python爬取图片并存储到MongoDB的示例实现,包含详细步骤说明:
import requests
from bs4 import BeautifulSoup
from pymongo import MongoClient
from datetime import datetime
import os
import re# 配置信息
mongoIP = 'mongodb://root:123456@127.0.0.1:27017'
CONFIG = {"target_url": "https://example.com/images", # 替换为实际目标网站"headers": {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"},"mongodb": {"host": "127.0.0.1","port": 27017,"db_name": "image_database","username": "root","password": "123456","collection": "images"}
}def connect_mongodb():"""连接MongoDB数据库"""# client = MongoClient(# host=CONFIG["mongodb"]["host"],# port=CONFIG["mongodb"]["port"]# )client = MongoClient(mongoIP, connect=False)db = client[CONFIG["mongodb"]["db_name"]]return db[CONFIG["mongodb"]["collection"]]def sanitize_filename(filename):"""清理文件名中的非法字符"""return re.sub(r'[\\/*?:"<>|]', "", filename)def save_to_mongodb(image_data, filename, source_url):"""将图片保存到MongoDB"""collection = connect_mongodb()document = {"filename": filename,"image_data": image_data,"source_url": source_url,"created_at": datetime.now(),"metadata": {"file_size": len(image_data),"content_type": "image/jpeg" # 根据实际情况修改}}try:result = collection.insert_one(document)print(f"Saved {filename} to MongoDB, ID: {result.inserted_id}")return Trueexcept Exception as e:print(f"Error saving to MongoDB: {str(e)}")return Falsedef download_image(img_url):"""下载图片并返回二进制数据"""try:response = requests.get(img_url,headers=CONFIG["headers"],stream=True,timeout=10)if response.status_code == 200:return response.contentexcept Exception as e:print(f"Error downloading {img_url}: {str(e)}")return Nonedef extract_images(url):"""从网页中提取图片链接"""try:response = requests.get(url, headers=CONFIG["headers"], timeout=10)soup = BeautifulSoup(response.text, "html.parser")# 查找所有img标签img_tags = soup.find_all("img")# 提取图片URL(可能需要处理相对路径)image_urls = []for img in img_tags:src = img.get("src", "")if src.startswith("http"):image_urls.append(src)else:# 转换相对路径为绝对路径(根据网站结构可能需要调整)image_urls.append(f"{url}/{src}")return image_urlsexcept Exception as e:print(f"Error extracting images: {str(e)}")return []def main():# 获取目标网页中的图片链接image_urls = extract_images(CONFIG["target_url"])if not image_urls:print("No images found")returnprint(f"Found {len(image_urls)} images")for img_url in image_urls:# 下载图片image_data = download_image(img_url)if not image_data:continue# 生成文件名filename = sanitize_filename(os.path.basename(img_url))# 保存到MongoDBsave_to_mongodb(image_data, filename, img_url)if __name__ == "__main__":save_to_mongodb("", "1.png", "123") # 仅尝试存储数据到MongoDB# main() # 实际运行,需要网站可用
运行结果:
使用说明
-
准备工作:
- 安装依赖库:
pip install requests beautifulsoup4 pymongo
- 确保MongoDB服务正在运行(本地或远程)
- 安装依赖库:
-
配置修改:
- 修改
CONFIG
中的target_url
为目标网站地址 - 根据需要调整MongoDB连接参数
- 可能需要根据目标网站结构修改URL处理逻辑
- 修改
-
运行爬虫:
python image_crawler.py
-
验证结果:
- 使用MongoDB客户端工具查询数据:
use image_database db.images.find().limit(1)
- 使用MongoDB客户端工具查询数据:
重要注意事项
-
合法合规:
- 遵守目标网站的
robots.txt
规则 - 尊重版权和隐私政策
- 添加适当的请求延迟(示例中未包含)
- 遵守目标网站的
-
性能优化:
- 添加请求延迟(建议至少1-2秒/请求)
- 使用连接池
- 考虑异步处理(如
aiohttp
)
-
存储优化:
- 对于大文件建议使用GridFS
- 添加索引:
collection.create_index([("source_url", 1)], unique=True)
-
异常处理增强:
- 添加重试机制
- 记录错误日志
- 处理不同图片格式(PNG/WebP等)
-
扩展功能:
- 添加代理支持
- 实现分布式爬取
- 添加图片去重功能(如MD5校验)
可以根据具体需求调整代码结构和功能实现。建议在实际使用前进行小规模测试,确保符合目标网站的使用条款。
相关文章:

Python爬虫爬取图片并存储到MongoDB(注意:仅尝试存储一条空的示例数据到MongoDB,验证MongoDB的联通性)
以下是一个使用Python爬取图片并存储到MongoDB的示例实现,包含详细步骤说明: import requests from bs4 import BeautifulSoup from pymongo import MongoClient from datetime import datetime import os import re# 配置信息 mongoIP mongodb://root…...
Unocss 类名基操, tailwindcss 类名
这里只列出 unocss 的可实现类名,tailwindcss 可以拿去试试用 1. 父元素移入,子元素改样式 <!-- 必须是 group 类名 --> <div class"group"><div class"group-hover:color-red">Text</div> </div>2…...
Sharding-JDBC 系列专题 - 第七篇:Spring Boot 集成与 Sharding-Proxy 简介
Sharding-JDBC 系列专题 - 第七篇:Spring Boot 集成与 Sharding-Proxy 简介 本系列专题旨在帮助开发者全面掌握 Sharding-JDBC,一个轻量级的分布式数据库中间件。本篇作为系列的第七篇文章,将重点探讨 Sharding-JDBC 与 Spring Boot 的集成,以及 Sharding-Proxy 的基本概念…...
微服务划分的思考
为什么 微服务不是十全十美的,不是银弹,是什么原因导致必须要做微服务划分,是否有足够的动机支撑,是项目需要,还是领导的想法,公司层面是否有相应的规划。 拆分后的服务谁来维护,研发同学是否愿意参与 为什么,思考清楚了,接下来看还需要考虑怎么做 单体应用的不足…...

L1-1、Prompt 是什么?为什么它能“控制 AI”?
*Prompt 入门 L1-1 想象一下,你只需输入一句话,AI 就能自动为你写一篇文案、生成一份报告、甚至规划你的创业计划。这种“对话即编程”的背后魔法,就是 Prompt 的力量。 🔍 一、Prompt 的定义与由来 Prompt(提示词&am…...

TIM输入捕获知识部分
越往左,频率越高;越往右,频率越低。【越紧凑,相同时间,次数越多】 计算频率的方法:测评法、测周法、中界频率。 频率的定义:1s内出现了多少个重复的周期 测评法就是从频率的定义出发的&#…...
Ubuntu使用war包部署Jenkins并通过systemcl管理
目录 一、当前系统环境 二、安装Java 二、安装Jenkins 三、使用systemctl管理 一、当前系统环境 操作系统:ubuntu 24.04 Jenkins版本:2.506 格式:war JDK版本:OpenJDK_17 二、安装Java 1.下载jdk安装包 # wget下载 wget …...

PCB常见封装类型
1. 电阻、电容、电感封装 2. 二极管、三极管封 3. 排阻类器件(8脚、16脚)封装 4. SO类器件(间距有1.27、2.54mm等)封装 5. QFP类器件封装(四方扁平封装) 结构:引脚分布在封装的四个侧面&#…...
济南国网数字化培训班学习笔记-第二组-3节-电网工程建设项目部门
电网工程建设项目部 组成 监理项目部 履行监理合同,监理单位派驻:负责合同管理,审查,见证,旁站,巡视,验收,控制进度,安全,质量,协调各方 造价…...

【Linux】调试工具gdb的认识和使用指令介绍(图文详解)
目录 1、debug和release的知识 2、gdb的使用和常用指令介绍: (1)、windows下调试的功能: (2)、进入和退出: (3)、调试过程中的相关指令: 3、调试究竟是在…...
Vue3 ref与props
ref 属性 与 props 一、核心概念对比 特性ref (标签属性)props作用对象DOM 元素/组件实例组件间数据传递数据流向父组件访问子组件/DOM父组件 → 子组件响应性直接操作对象单向数据流(只读)使用场景获取 DOM/调用子组件方法组件参数传递Vue3 变化不再自…...

UML设计系列(9):开发过程中如何应用UML
传送门 UML设计系列(1):状态机图 UML设计系列(2):类图 UML设计系列(3):时序图 UML设计系列(4):用例图 UML设计系列(5):系统依赖图 UML设计系列(6):活动图 UML设计系列(7):UML设计阶段性总…...
Linux之安装配置Nginx
Linux系统下安装配置Nginx的详细步骤如下: 一、准备工作 系统环境:确保Linux系统已安装,并且具有网络连接(以便在线安装依赖或下载Nginx)。 安装依赖:Nginx依赖于一些开发库和工具,如gcc、pcr…...
【C++】STL之deque
deque Deque 的底层既不直接依赖 vector 也不依赖 list,而是结合了两者的思想,采用了一种分块(chunk)存储与动态指针数组(map)结合的结构。以下是详细分析: 1. 底层结构设计 Deque 的核心设计…...

模板方法模式:定义算法骨架的设计模式
模板方法模式:定义算法骨架的设计模式 一、模式核心:模板方法定义算法骨架,具体步骤延迟到子类实现 在软件开发中,经常会遇到这样的情况:某个算法的步骤是固定的,但具体步骤的实现可能因不同情况而有所不…...

通付盾入选苏州市网络和数据安全免费体验目录,引领企业安全能力跃升
近日,苏州市网络安全主管部门正式发布《苏州市网络和数据安全免费体验产品和服务目录》,通付盾凭借其在数据安全、区块链、AI领域的创新实践和前沿技术实力,成功入选该目录。 作为苏州市网络安全技术支撑单位,通付盾将通过 “免费…...

【金仓数据库征文】加速数字化转型:金仓数据库在金融与能源领域强势崛起
目录 一、引言 二、金仓数据库(KingbaseES)概述 1. 发展历程与市场地位 2. 核心技术架构 3. 金仓数据库的特点 三、金仓数据库在金融行业的应用 1. 金融行业的挑战与需求 2. 金仓数据库在金融行业的优势 3. 金仓数据库在金融行业的实际应用案例 …...
音频base64
音频 Base64 是一种将二进制音频数据(如 MP3、WAV 等格式)编码为 ASCII 字符串的方法。通过 Base64 编码,音频文件可以转换为纯文本形式,便于在文本协议(如 JSON、XML、HTML 或电子邮件)中传输或存储&#…...
Qt C++/Go/Python 面试题(持续更新)
目录 1、封装、继承、多态是什么? 2、final标识符的作用是什么? 3、介绍一下虚函数 4、介绍一下智能指针 5、介绍一下左值、右值、左值引用、右值引用 6、指针和引用有什么区别? 7、define和const的区别是什么? 8、C程序的…...
VMware 虚拟机镜像资源网站
常见的 VMware 虚拟机镜像资源网站 网站名称链接地址特点OSBoxes.orgOSBoxes - Virtual Machines for VirtualBox & VMware 提供 .vmx .vmdk,适合 VMware 和 VirtualBox,更新频率高,界面清晰LinuxVMImages.comLinux VM Images - Downlo…...

C++智能指针上
一、裸指针 “裸指针”是最基础的,直接存储内存地址的指针类型。特点:①它本身没有自动的内存管理机制:如它不会自动释放内存,也不会检查是否指向有效的内存区域;②直接操作内存地址,不进行任何的边界检查&…...

低代码平台开发串口调试助手
项目介绍 串口调试助手是一款用于串口通信调试的工具,它可以帮助开发人员发送和接收串口数据,主要用于嵌入式开发、工业控制、物联网设备开发等领域。 主要功能包括: 数据收发:可以实时发送和接收串口数据,并显示在界…...

怎么配置一个kubectl客户端访问多个k8s集群
怎么配置一个kubectl客户端访问多个k8s集群 为什么有的客户端用token也访问不了k8s集群,因为有的是把~/.kube/config文件,改为了~/.kube/.config文件,文件设置成隐藏文件了。 按照kubectl的寻找配置的逻辑,kubectl找不到要访问集群…...
C语言分支结构详解
一、引言 在 C 语言中,分支结构是程序控制流的重要组成部分。它允许程序根据不同的条件执行不同的代码块,从而实现更灵活和复杂的逻辑。分支结构使得程序能够根据输入、变量的值或其他条件来做出决策,决定程序的执行路径。 二、if 语句 基…...
Redisson实战:分布式系统中的五大典型应用场景
引言 在分布式系统架构中,数据一致性、高并发控制和资源协调是开发者面临的核心挑战。Redisson作为基于Redis的Java客户端,不仅提供了丰富的分布式对象和服务,还简化了分布式场景下的编程模型。本文将通过实际代码示例,解析Redis…...

12N60-ASEMI无人机专用功率器件12N60
编辑:LL 12N60-ASEMI无人机专用功率器件12N60 型号:12N60 品牌:ASEMI 封装:TO-220F 最大漏源电流:12A 漏源击穿电压:600V 批号:最新 RDS(ON)Max:0.68…...

长城智驾重复造轮子
左手新能源,右手智驾,这是长城当下最在意的两块业务。 从去年8月首款具备高阶智能驾驶功能SUV全新蓝山上市之后,长城在传播端的重点就是围绕智驾、无图方案打造智驾标签。 先是在广州国际车展上,整个展厅只展出全新蓝山…...
云原生之认识DDD
一、DDD是什么? 领域驱动设计(DDD) 做为一种软件工程的方法论,它可以帮助我们设计高质量的软件,或者说任何工程的设计都需要方法论,不论是城市设计、建筑设计、室内设计。 比如没有方法论的情况下楼是可以盖起来的,或许整个楼道和窗户上挂满了电话线、闭路线、电线?下水…...

continue插件实现IDEA接入本地离线部署的deepseek等大模型
文章目录 前言一、IDEA安装continue二、continue部署本地大模型三、continue聊天窗口使用deepseek R1四、continue批量接入硅基流动的模型API 前言 亲爱的家人们,创作很不容易,若对您有帮助的话,请点赞收藏加关注哦,您的关注是我…...
代码随想录算法训练营第一天:数组part1
今日学习的文章链接和视频链接 ● 自己看到题目的第一想法 ● 看完代码随想录之后的想法 ● 自己实现过程中遇到哪些困难 ● 今日收获,记录一下自己的学习时长 状态 思路理解完成 30% 代码debug完成 60% 代码模板总结并抽象出来 100% 题目 704 二分查找 题目链接…...