当前位置: 首页 > backend >正文

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() # 实际运行,需要网站可用

运行结果:
在这里插入图片描述

使用说明

  1. 准备工作

    • 安装依赖库:
      pip install requests beautifulsoup4 pymongo
      
    • 确保MongoDB服务正在运行(本地或远程)
  2. 配置修改

    • 修改CONFIG中的target_url为目标网站地址
    • 根据需要调整MongoDB连接参数
    • 可能需要根据目标网站结构修改URL处理逻辑
  3. 运行爬虫

    python image_crawler.py
    
  4. 验证结果

    • 使用MongoDB客户端工具查询数据:
      use image_database
      db.images.find().limit(1)
      

重要注意事项

  1. 合法合规

    • 遵守目标网站的robots.txt规则
    • 尊重版权和隐私政策
    • 添加适当的请求延迟(示例中未包含)
  2. 性能优化

    • 添加请求延迟(建议至少1-2秒/请求)
    • 使用连接池
    • 考虑异步处理(如aiohttp
  3. 存储优化

    • 对于大文件建议使用GridFS
    • 添加索引:
      collection.create_index([("source_url", 1)], unique=True)
      
  4. 异常处理增强

    • 添加重试机制
    • 记录错误日志
    • 处理不同图片格式(PNG/WebP等)
  5. 扩展功能

    • 添加代理支持
    • 实现分布式爬取
    • 添加图片去重功能(如MD5校验)

可以根据具体需求调整代码结构和功能实现。建议在实际使用前进行小规模测试,确保符合目标网站的使用条款。

http://www.xdnf.cn/news/1623.html

相关文章:

  • 220V转18V600mA非隔离芯片WT5110
  • 【防火墙 pfsense】1简介
  • Freerots----任务通知
  • Qt本地化 - installTranslator不生效
  • Atlas 800I A2 离线部署 DeepSeek-R1-Distill-Llama-70B
  • 2025年土建施工员考试题库及答案
  • Control Center安卓版:自定义控制中心,提升手机操作体验
  • PostgreSQL 分区表——范围分区SQL实践
  • 【金仓数据库征文】——金仓数据库:国产数据库的卓越之选
  • Docker-高级使用
  • 反射,枚举,lambda表达式
  • 网页版 deepseek 对话问答内容导出为 PDF 文件和 Word 文件的浏览器插件下载安装和使用说明
  • 【axios取消请求】如何在token过期后取消未响应的请求
  • 针对密码学的 EM 侧信道攻击
  • git 操作
  • Golang编程拒绝类型不安全
  • 嵌入式人工智能应用-第三章 opencv操作8 图像特征之 Haar 特征
  • springboot整合redis实现缓存
  • 协作开发攻略:Git全面使用指南 — 第二部分 高级技巧与最佳实践
  • 无标注文本的行业划分(行业分类)算法 —— 无监督或自监督学习
  • 【TensorFlow深度学习框架】从数学原理到工业级应用
  • 硬件工程师面试常见问题(7)
  • 【GIT】github中的仓库如何删除?
  • Trae+DeepSeek学习Python开发MVC框架程序笔记(四):使用sqlite验收用户名和密码
  • 从指标定义到可视化:基于衡石指标平台的全链路数据治理实战
  • 4.1.1 类的序列化与反序列化(XmlSerializer)
  • 一文走进GpuGeek | 模型调用
  • Python 面向对象练习
  • 探秘 FFmpeg 版本发展时间简史
  • SpringMVC处理请求映射路径和接收参数