【小白必看】Python爬虫实战之批量下载女神图片并保存到本地

news2024/9/27 23:23:05

文章目录

    • 前言
    • 运行结果
    • 部分图片
    • 1. 引入所需库
    • 2. 发送请求获取网页内容
    • 3. 解析网页内容并提取图片地址和名称
    • 4. 下载并保存图片
    • 完整代码
      • 关键代码讲解
    • 结束语

在这里插入图片描述

前言

爬取网络上的图片是一种常见的需求,它可以帮助我们批量下载大量图片并进行后续处理。本文将介绍如何使用 Python 编写一个简单的爬虫,从指定网页中获取女神图片,并保存到本地。

运行结果

在这里插入图片描述

部分图片

在这里插入图片描述

在这里插入图片描述

1. 引入所需库

在这里插入图片描述

首先需要导入两个库:requests 用于发送网络请求,lxml 用于解析和提取数据。

import requests
from lxml import etree

2. 发送请求获取网页内容

在这里插入图片描述

使用 requests.get() 方法发送一个 GET 请求到指定的 URL,并设置了请求头中的 User-Agent,以模拟浏览器发送请求。然后,我们将响应结果的编码设置为 GBK,通过 resp.encoding = 'gbk' 来告诉软件要用中文显示。最后,将获取到的网页内容打印出来。

url = 'http://www.netbian.com/mei/'
resp = requests.get(url, headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36'})
resp.encoding = 'gbk'
print(resp.text)

3. 解析网页内容并提取图片地址和名称

在这里插入图片描述

使用 etree.HTML() 方法将网页内容转换成 XPath 可解析的对象。然后,使用 XPath 表达式提取所有图片的 URL 和名称,并将结果存储在 img_urlsimg_names 列表中。

xp = etree.HTML(resp.text)
img_urls = xp.xpath('//ul/li/a/img/@src')
img_names = xp.xpath('//ul/li/a/img/@alt')

4. 下载并保存图片

在这里插入图片描述

使用 zip() 函数将每个图片的 URL 和名称配对,并进行迭代。在迭代过程中,我们发送一个 GET 请求到图片的 URL,并将响应内容保存为图片文件。这里使用了 with open 语句来自动关闭文件。最后,我们将图片保存在 ./图片合成/img_f/ 目录下以图片名称命名。

for u, n in zip(img_urls, img_names):
    print(f'正在下载: 图片名:{n}')
    img_resp = requests.get(u, headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36'})
    with open(f'./图片合成/img_f/{n}.jpg', 'wb') as f:
        f.write(img_resp.content)

完整代码

# 地址
url = 'http://www.netbian.com/mei/'

import requests
from lxml import etree

# 发送请求获取网页内容
resp = requests.get(url,headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36'})
resp.encoding = 'gbk'  # 告诉软件,要用中文给我显示
print(resp.text)  # 打印文本结果

# 使用lxml解析HTML内容
xp = etree.HTML(resp.text)

# 提取图片URL和名称
img_urls = xp.xpath('//ul/li/a/img/@src')
img_names = xp.xpath('//ul/li/a/img/@alt')

# 遍历图片URL和名称,并下载保存到本地
for u, n in zip(img_urls, img_names):
    print(f'正在下载:图片名:{n}')
    img_resp = requests.get(u, headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36'})
    with open(f'./图片合成/img_f/{n}.jpg', 'wb') as f:
        f.write(img_resp.content)

关键代码讲解

 
# 地址
url = 'http://www.netbian.com/mei/'

这里定义了要爬取的网页地址。

import requests
from lxml import etree

导入所需的库:requests 用于发送网络请求,lxml 用于解析和提取数据。

resp = requests.get(url,headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36'})
resp.encoding = 'gbk' # 告诉软件,要用中文给我显示
print(resp.text) # 打印文本结果

通过发送 GET 请求获取指定网页的内容,并指定请求头中的 User-Agent 为浏览器的标识,以模拟浏览器访问。使用 resp.encoding 设置编码为 GBK,以便正确显示中文字符。最后打印响应结果的文本内容。

xp = etree.HTML(resp.text)

使用 lxml 库的 etree.HTML 方法将网页内容转换为可解析的对象。

img_urls = xp.xpath('//ul/li/a/img/@src')
img_names = xp.xpath('//ul/li/a/img/@alt')

使用 XPath 表达式提取图片的 URL 和名称。xpath 函数返回一个列表,其中的元素是按照表达式提取的结果。

for u,n in zip(img_urls,img_names):
    print(f'正在下载: 图片名:{n}')
    img_resp = requests.get(u,headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36'})
    with open(f'./图片合成/img_f/{n}.jpg','wb') as f:
        f.write(img_resp.content)

通过迭代 img_urlsimg_names 列表,使用 zip 函数将图片的 URL 和名称配对。在迭代的过程中,发送 GET 请求获取图片的响应内容。然后使用 with open 语句打开文件,并将图片内容写入文件中,保存到本地。这里使用了 wb 模式以二进制方式写入文件。

注意:在运行代码之前需要创建一个名为 图片合成/img_f 的文件夹,用于保存下载的图片。

关键点讲解说明:

  • 爬虫是一种自动化获取网页内容的技术,可以用于从指定网页上获取数据。
  • 通过发送 HTTP 请求,可以获取网页的 HTML 内容。
  • 使用 requests 库可以方便地发送请求并获取响应。
  • 使用 XPath 表达式可以方便地从 HTML 中提取所需的数据。
  • 在爬虫过程中,需要模拟浏览器访问,以防止被网站阻止或误判为恶意行为。
  • 下载文件时,可以使用 requests 库的 get 方法获取文件的内容,并使用 open 函数将内容写入文件。

结束语

本文介绍了如何使用 Python 编写一个简单的爬虫,从指定网页中获取女神图片,并保存到本地。通过学习本文,你可以了解基本的网络请求和数据提取技巧,为你未来的爬虫项目打下基础。当使用爬虫进行图片下载时,请确保遵守相关法律法规和网站的使用规定,尊重他人的版权和隐私。同时,注意合理使用爬虫,避免给目标网站和服务器造成过大负担。谨慎、高效地开展爬虫工作,更好地应用于实际开发中。

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

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

相关文章

如何选择台式还是便携式多参数水质检测仪呢

选择台式还是便携式多参数水质检测仪主要取决于具体的使用需求和场景。 1.便携式多参数水质检测仪适用于需要在不同地点进行水质检测的情况,例如户外采样、实地调查等。它具有小巧轻便的特点,方便携带和操作,适合需要频繁移动或需要灵活使用的…

深入解析Linux进程内存:VSS、RSS、PSS、USS及查看方式

VSS 虚拟耗用内存大小,是进程可以访问的所有虚拟内存的总量,包括进程独自占用的物理内存、和其他进程共享的内存、分配但未使用的内存。 RSS 驻留内存大小,是进程当前实际占用的物理内存大小,包括进程独自占用的物理内存、和其…

bootstrap入门到精通

官网:列表组 - Bootstrap框架 (bootstrapdoc.com) 菜鸟教程:Bootstrap 列表组 | 菜鸟教程 (runoob.com) 1.什么是bootstrap bootstrap是一个用于快速开发web应用程序和网站的前端框架。基于HTML、CSS和JavaScript封装 响应式 ElementUI 更适合用于企…

WIZnet W5500-EVB-Pico DHCP 配置教程(三)

DHCP协议介绍 什么是DHCP? 动态主机配置协议DHCP(Dynamic Host Configuration Protocol)是一种网络管理协议,用于集中对用户IP地址进行动态管理和配置。 DHCP于1993年10月成为标准协议,其前身是BOOTP协议。DHCP协议由R…

Spring源码(五)— 解析XML配置文件(一) bean标签解析流程

前面几章的内容已经介绍了BeanFactory创建前的准备工作,以及加载XML配置文件前的准备的步骤。本章会着重介绍解析XML的步骤。 registerBeanDefinitions 前几个方法不做过多的赘述,着重看registerBeanDefinitions方法中解析XML的步骤。 public int regi…

C++ 多进程学习总结

C多进程 进程间通信 消息队列 消息队列:提供一个种进程间发送/接收数据块(常为结构体数据)的方法。 函数接口 ftok():获取消息队列键值msgget():创建和访问消息队列msgsnd():向消息队列发送数据msgrcv…

罗布乐思Roblox学习笔记

罗布乐思 文章目录 罗布乐思基本操作CFrameGUIModule script呼吸灯商店imageChangetag标签知识答题showTips 基本操作 缩放按shift 等比例缩放 ctrl 双向缩放 复制对象 ctrlD (如果选择多个对象,按住ctrl) F 聚焦 Workspace ​ Terrain…

看完这篇文章,你还会用再用AUTOMATIC1111 WebUI吗?

​说起 AUTOMATIC1111 的 Stable diffusion-wbui 这个项目,使用过Stable diffusion的人应该无人不知吧,网络上基本一边倒的在使用他家的项目,而且fork量和star量还不小: 但是AUTOMATIC1111 这个名字总给我一些不靠谱的感觉&#x…

【C++】多态、黑马程序员案例— —电脑组装、Visual Studio开发人员工具查看内部结构,cl /d1 reportSingleClassLayout

author:&Carlton tag:C topic:【C】多态、黑马程序员案例— —电脑组装、Visual Studio开发人员工具查看内部结构,cl /d1 reportSingleClassLayout website:黑马程序员C date:2023年7月24日 目录 纯虚函数、抽…

map的初始化、erase()、写入与写出

运行代码&#xff1a; //map的初始化、erase()、写入与写出 #include"std_lib_facilities.h"istream& operator>>(istream& is, map<string, int>&mm) {string ss"";int ii0;is >> ss;if(is>>ii)mm[ss] ii;return i…

【数据集】3小时尺度降水数据集-MSWEPV2

1 MSWEP V2 precipitation product 官网-MSWEP V2降水产品 参考

《向量数据库指南》:向量数据库Pinecone如何集成LangChain (一)

目录 LangChain中的检索增强 建立知识库 欢迎使用Pinecone和LangChain的集成指南。本文档涵盖了将高性能向量数据库Pinecone与基于大型语言模型(LLMs)构建应用程序的框架LangChain集成的步骤。 Pinecone使开发人员能够基于向量相似性搜索构建可扩展的实时推荐和搜索系统…

redis之Bitmap

位图数据结构其实并不是一个全新的玩意&#xff0c;我们可以简单的认为就是个数组&#xff0c;只是里面的内容只能为0或1而已(二进制位数组)。 GETBIT用于返回位数组在偏移量上的二进制位的值。值得我们注意的是&#xff0c;GETBIT的时间复杂度是O(1)。 GETBIT命令的执行过程如…

LeetCode 75 第十三题(1679)K和数对的最大数目

题目: 示例: 分析: 给一个数组&#xff0c;两个和为K的数为一组&#xff0c;问能凑成几组。 既然一组是两个数&#xff0c;那么我们可以使用双指针分别指向数组首尾&#xff0c;然后再判断能否凑成和为K的组. 在使用双指针寻找之前,我们应当先将数组排序(升序降序都无所谓),…

[SSM]Spring面向切面编程AOP

目录 十五、面向切面编程AOP 15.1AOP介绍 15.2AOP的七大术语 15.3切点表达式 15.4使用Spring的AOP 15.4.1准备工作 15.4.2基于AspectJ的AOP注解式开发 15.4.3基于XML配置方式的AOP&#xff08;了解&#xff09; 15.5AOP的实际案例&#xff1a;事务处理 15.6AOP的实际…

flask用DBUtils实现数据库连接池

flask用DBUtils实现数据库连接池 在 Flask 中&#xff0c;DBUtils 是一种实现数据库连接池的方案。DBUtils 提供了持久性&#xff08;persistent&#xff09;和透明的&#xff08;transient&#xff09;两种连接池类型。 首先你需要安装 DBUtils 和你需要的数据库驱动。例如&…

关于c++中虚函数和虚函数表的创建时机问题

以这段代码为例。 #include <iostream>using namespace std;class Parent { public:Parent(){}virtual void func1() {};virtual void func2() {}; };class Child :public Parent { public:Child():n(0),Parent(){cout << "Child()" << endl;}vir…

【机器学习】西瓜书学习心得及课后习题参考答案—第4章决策树

这一章学起来较为简单&#xff0c;也比较好理解。 4.1基本流程——介绍了决策树的一个基本的流程。叶结点对应于决策结果&#xff0c;其他每个结点则对应于一个属性测试&#xff1b;每个结点包含的样本集合根据属性测试的结果被划分到子结点中&#xff1b;根结点包含样本全集&a…

js中的遍历方法比较:map、for...in、for...of、reduce和forEach的特点与适用场景

&#x1f60a;博主&#xff1a;小猫娃来啦 &#x1f60a;文章核心&#xff1a;JavaScript中的遍历方法比较&#xff1a;map、for…in、for…of和forEach的特点与适用场景 文章目录 map 方法概述用法返回值特点 for...in 循环概述用法注意事项 for...of 循环概述用法可迭代对象…

苍穹外卖day09——历史订单模块(用户端)+订单管理模块(管理端)

查询历史订单——需求分析与设计 产品原型 业务规则 分页查询历史订单 可以根据订单状态查询 展示订单数据时&#xff0c;需要展示的数据包括&#xff1a;下单时间、订单状态、订单金额、订单明细&#xff08;商品名称、图片&#xff09; 接口设计 查询历史订单——代码开…