Python爬虫实战:图片爬取与保存

引言:
        在本文中,我们将学习如何使用Python创建一个简单的图片爬虫

        我们将利用requests来发送HTTP请求,BeautifulSoup来解析HTML页面,以及osshutil库来下载和保存图片。通过这个教程,你将学会如何爬取网页上的图片并保存到本地。

目录

一、准备工作

在开始之前,请确保你已经安装了Python,并且安装了以下库:

你可以使用以下命令来安装这些库:

二、代码实现 

三、代码解析



一、准备工作

在开始之前,请确保你已经安装了Python,并且安装了以下库:
  • requests用于发送HTTP请求
  • beautifulsoup4用于解析HTML页面
你可以使用以下命令来安装这些库:
pip install requests beautifulsoup4

二、代码实现 

import os  
import requests  
from bs4 import BeautifulSoup  
from urllib.parse import urljoin  
from urllib.request import urlretrieve  def download_images(url, save_dir):  """  下载指定网页上的所有图片并保存到本地文件夹  :param url: 目标网页的URL  :param save_dir: 图片保存的目录  """  # 创建保存图片的目录  if not os.path.exists(save_dir):  os.makedirs(save_dir)  # 发送HTTP请求  response = requests.get(url)  response.raise_for_status()  # 如果请求失败,抛出异常  # 使用BeautifulSoup解析页面  soup = BeautifulSoup(response.text, 'html.parser')  # 查找所有的图片链接  image_links = soup.find_all('img')  # 下载并保存图片  for img in image_links:  img_url = img.get('src')  # 如果图片链接是相对路径,则将其转换为绝对路径  if not img_url.startswith(('http://', 'https://')):  img_url = urljoin(url, img_url)  # 下载图片  img_name = os.path.join(save_dir, img_url.split('/')[-1])  urlretrieve(img_url, img_name)  print(f"Downloaded: {img_name}")  # 使用示例  
url = "https://example.com"  # 替换为你要爬取的网页的URL  
save_dir = "images"  # 图片保存的目录  
download_images(url, save_dir)

三、代码解析

  • 导入库:首先,我们导入了所需的库,包括osrequestsBeautifulSoupurllib.parseurllib.request
  • 定义函数:我们定义了一个名为download_images的函数,它接受两个参数url(目标网页的URL)和save_dir(图片保存的目录)
  • 创建保存目录:如果指定的保存目录不存在,我们将创建它。
  • 发送HTTP请求:使用requests.get方法发送HTTP请求,并使用response.raise_for_status检查请求是否成功。
  • 解析页面:使用BeautifulSoup解析HTML页面,并查找所有的<img>标签,以获取图片链接。
  • 下载并保存图片:遍历每个图片链接,将其转换为绝对路径(如果需要),并使用urlretrieve方法下载图片然后,将图片保存到指定的目录,并打印出下载的文件名。
  • 使用示例:最后,我们提供了一个使用示例,包括目标网页的URL和图片保存的目录。

四、注意事项

  • 在使用爬虫时,请确保遵守目标网站的robots.txt文件和使用条款,并尊重他人的版权和隐私。
  • 不要对网站造成过大的压力或进行恶意爬取。
  • 可以根据需要进一步扩展此代码,例如增加错误处理、添加代理支持、限制并发请求数、使用异步IO等。

通过本文的学习,你已经掌握了如何使用Python创建一个简单的图片爬虫。你可以根据自己的需求进一步扩展和优化这个爬虫。记得在使用爬虫时要遵守相关规定和法律法规,尊重他人的权益。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

16.沙箱里的秩序——外观模式

然后&#xff0c;冯诺伊曼又用三名士兵构建了与非门、或非门、异或门、同或门和三态门&#xff0c;最后只用两名士兵构建了最简单的非门&#xff0c;出总是举与入颜色相反的旗。 冯:诺伊曼对皇帝鞠躬说:“现在&#xff0c;陛下&#xff0c;所有的门部件都已演示完毕&#xff0c…

【Java程序员面试专栏 算法思维】五 高频面试算法题:贪心算法

一轮的算法训练完成后,对相关的题目有了一个初步理解了,接下来进行专题训练,以下这些题目就是汇总的高频题目,本篇主要聊聊贪心算法,所以放到一篇Blog中集中练习 题目关键字解题思路时间空间买卖股票的最佳时机 II贪心算法遍历整个股票交易日价格列表 price,并执行贪心策…

力扣随笔之移除元素(简单27)

思路&#xff1a;定义一个指针left&#xff0c;使该指针及该指针左边的数全部都不等于val&#xff0c;定义一个遍历指针i&#xff0c;若nums[i] val&#xff0c;则i自加&#xff0c;若nums[i] ! val&#xff0c;则将left&#xff0c;并将nums[i]的值赋给nums[left]&#xff0c…

迅速了解Ascii、GBK、Unicode、UTF-8、BCD各种编码格式的由来及关系!

《嵌入式工程师自我修养/C语言》系列——迅速了解Ascii、GBK、Unicode、UTF-8、BCD各种编码格式的由来及关系 一、Ascii编码二、GBK编码三、Unicode编码四、UTF-8编码五、BCD编码六、其他网友的总结 快速学习嵌入式开发其他基础知识&#xff1f;>>>>>>>&g…

Redis实现滑动窗口限流

常见限流算法 固定窗口算法 在固定的时间窗口下进行计数&#xff0c;达到阈值就拒绝请求。固定窗口如果在窗口开始就打满阈值&#xff0c;窗口后半部分进入的请求都会拒绝。 滑动窗口算法 在固定窗口的基础上&#xff0c;窗口会随着时间向前推移&#xff0c;可以在时间内平滑控…

安装 WSL 报错 Error code: Wsl/WININET_E_NAME_NOT_RESOLVED 问题解决

问题描述 在执行 wsl --install 安装Windows子系统Linux WSL (Windows Subsystem for Linux) 时报错&#xff1a; 无法从“https://raw.githubusercontent.com/microsoft/WSL/master/distributions/DistributionInfo.json”中提取列表分发。无法解析服务器的名称或地址 Error…

为什么会员模式是一种明智的扩张方式

会员模式看起来是一种有趣、令人兴奋且很酷的业务发展方式&#xff0c;但当您真正深入研究时&#xff0c;您可能会惊讶地发现它远不止于此。 会员资格为我们提供了一条道德扩展的途径。我们可以就地为客户提供服务。 这就是为什么会员模式可能成为您企业的下一步&#xff0c;…

【监控】grafana图表使用快速上手

目录 1.前言 2.连接 3.图表 4.job和path 5.总结 1.前言 上一篇文章中&#xff0c;我们使用spring actuatorPrometheusgrafana实现了对一个spring boot应用的可视化监控。 【监控】Spring BootPrometheusGrafana实现可视化监控-CSDN博客 其中对grafana只是打开了一下&am…

Jmeter学习系列之七:并发线程组Concurrency Thread Group详解

一、Concurrency Thread Group的介绍 Concurrency Thread Group提供了用于配置多个线程计划的简化方法该线程组目的是为了保持并发水平,意味着如果并发线程不够,则在运行线程中启动额外的线程和Standard Thread Group不同,它不会预先创建所有线程,因此不会使用额外的内存对…

算法分析-面试1-字符串

文章目录 前言一、分类&#xff1a;看看就行了二、字符串API&#xff1a;创建和初始化&#xff1a;查询操作&#xff1a;比较操作&#xff1a;修改操作&#xff1a;截取操作&#xff1a;分割操作&#xff1a;格式化操作&#xff1a;连接操作&#xff08;Java 8 及以后&#xff…

【OneAPI】渣土车检测API

OneAPI新接口发布&#xff1a;渣土车检测 识别一张图中是否存在渣土车并返回渣土车位置。 API地址&#xff1a;POST https://oneapi.coderbox.cn/openapi/api/detect/mucktruck 请求参数 BODY参数 参数名类型必填含义说明imageUrlstring是图片地址- 响应参数 参数名类型…

day4:对话框与事件

使用qt搭建一个简易的闹钟系统 #include "second.h" #include "ui_second.h"second::second(QWidget *parent) :QWidget(parent),ui(new Ui::second) {ui->setupUi(this);this->setWindowFlag(Qt::FramelessWindowHint);this->setAttribute(Qt::…