【网络爬虫】(2) requests模块,案例:网络图片爬取,附Python代码

1. 基本原理

1.1 requests 模块

requests 是 Python 中一个非常流行的 HTTP 客户端库,用于发送所有的 HTTP 请求类型。它基于 urllib,但比 urllib 更易用。

中文文档地址:Requests: 让 HTTP 服务人类 — Requests 2.18.1 文档

(1)requests.get(url, **kwargs)

requests.get() 函数是 requests 库中用于发送 HTTP GET 请求的主要函数GET 请求通常用于从服务器请求数据,而不发送任何数据到服务器(尽管可以通过查询参数发送少量数据)。下面我将介绍 requests.get 函数的参数、用法,并给出一个简短的例子。

参数:

url (str): 请求的 URL。这是 requests.get 必须的参数,想要请求的网页或资源的地址

params (dict, optional): 一个字典或字节序列,作为查询参数增加到 url 中。例如,params={'key1': 'value1', 'key2': 'value2'} 将会以 key1=value1&key2=value2 的形式附加到 URL 上。

headers (dict, optional): 自定义 HTTP 头。例如,可以通过 headers={'User-Agent': 'my-app/0.0.1'} 来设置用户代理。

cookies (dict, optional): 字典或 CookieJar,包含要发送的 cookie。

timeout (float or tuple, optional): 以秒为单位的请求超时时间。可以是单个浮点数(连接超时和读取超时相同),或者是一个元组,分别指定连接超时和读取超时。

allow_redirects (bool, optional): 是否允许重定向。默认为 True。

proxies (dict, optional): 字典映射协议或协议和主机名到 URL。

verify (bool or str, optional): 是否验证 SSL 证书。默认为 True。可以提供一个 CA_BUNDLE 文件的路径。

stream (bool, optional): 是否立即下载响应内容。默认为 False。如果想逐渐下载大型响应,可以设置为 True。

返回值:

requests.get 函数返回一个 Response 对象该对象包含服务器响应的所有信息,如状态码、响应头、响应体等。

例子:
import requests  # 定义请求的 URL  
url = 'http://www.umeituku.com/bizhitupian/fengjingbizhi/'  # 发送 GET 请求  
response = requests.get(url)  # 检查请求是否成功  
if response.status_code == 200:  # 读取响应内容  data = response.text  print("请求成功,响应内容为:")  print(data)  
else:  # 请求失败,打印错误信息  print(f"请求失败,状态码:{response.status_code}")  print(response.text)  # 你也可以直接使用 response.json() 方法解析 JSON 响应  
if response.headers.get('content-type') == 'application/json':  data = response.json()  print("解析 JSON 响应成功:")  print(data)

(2)requests.post(url, data=None, json=None, **kwargs)

requests.post() 函数是 requests 库中用于发送 HTTP POST 请求的函数POST 请求通常用于向服务器提交数据,例如提交表单或上传文件与 GET 请求不同,POST 请求会将数据包含在请求体中发送给服务器。下面我将详细介绍 requests.post 函数的参数、用法,并给出一个简短的例子。

参数:

url (str): 请求的 URL。这是 requests.post 函数必须的参数,代表你想要发送 POST 请求的网页或资源的地址。

data (dict, bytes, or file-like object, optional): 要发送的表单数据。如果是字典,它将被转换为表单编码格式。

json (dict, optional): 要发送的 JSON 数据。如果提供此参数,content-type 头将自动设置为 application/json。

headers (dict, optional): 自定义 HTTP 头。

cookies (dict, optional): 字典或 CookieJar,包含要发送的 cookie。

files (dict, optional): 要上传的文件。字典中的键是表单字段名,值是文件元组 (filename, fileobj, content_type, content_encoding)。

auth (tuple, optional): 用于身份验证的元组,如 ('user', 'pass')。

timeout (float or tuple, optional): 以秒为单位的请求超时时间。

proxies (dict, optional): 字典映射协议或协议和主机名到 URL。

verify (bool or str, optional): 是否验证 SSL 证书。

stream (bool, optional): 是否立即下载响应内容。

cert (tuple, optional): 客户端证书和其密钥的元组。

返回值:

requests.post 函数返回一个 Response 对象与 requests.get 函数的返回值类似,该对象包含服务器响应的所有信息,如状态码、响应头、响应体等

例子:
import requests  # 定义请求的 URL  
url = 'http://www.umeituku.com/bizhitupian/fengjingbizhi/'  # 准备要发送的数据  
data = {  'username': 'my_username',  'password': 'my_password'  
}  # 发送 POST 请求  
response = requests.post(url, data=data)  # 检查请求是否成功  
if response.status_code == 200:  # 读取响应内容  print("登录成功,响应内容为:")  print(response.text)  
else:  # 请求失败,打印错误信息  print(f"登录失败,状态码:{response.status_code}")  print(response.text)

(2)requests.put(url, data=None, **kwargs)

requests.put() 函数requests 库中用于发送 HTTP PUT 请求的函数PUT 请求通常用于更新服务器上的资源与 POST 请求不同,PUT 请求的意图是替换服务器上指定资源的内容。下面我将详细介绍 requests.put 函数的参数、用法,并给出一个简短的例子。

参数:

url (str): 请求的 URL。这是 requests.put 函数必须的参数,代表你想要发送 PUT 请求的资源的地址。

data (dict, bytes, or file-like object, optional): 要发送的数据。如果是字典,它将被转换为表单编码格式。这通常用于更新资源的内容。

json (dict, optional): 要发送的 JSON 数据。如果提供此参数,content-type 头将自动设置为 application/json。

headers (dict, optional): 自定义 HTTP 头。

cookies (dict, optional): 字典或 CookieJar,包含要发送的 cookie。

auth (tuple, optional): 用于身份验证的元组,如 ('user', 'pass')。

timeout (float or tuple, optional): 以秒为单位的请求超时时间。

proxies (dict, optional): 字典映射协议或协议和主机名到 URL。

verify (bool or str, optional): 是否验证 SSL 证书。

stream (bool, optional): 是否立即下载响应内容。

cert (tuple, optional): 客户端证书和其密钥的元组。

返回值:

requests.put 函数返回一个 Response 对象与 requests.get 和 requests.post 函数的返回值类似。这个对象包含了服务器的响应信息,比如状态码、响应头、响应体等

例子:
import requests  
import json  # 定义请求的 URL  
url = 'http://www.umeituku.com/bizhitupian/fengjingbizhi/'  # 准备要更新的数据  
data = {  'name': 'Updated Name',  'description': 'This resource has been updated.'  
}  # 将数据转换为 JSON 格式  
data_json = json.dumps(data)  # 发送 PUT 请求  
response = requests.put(url, data=data_json, headers={'Content-Type': 'application/json'})  # 检查请求是否成功  
if response.status_code == 200:  # 读取响应内容  print("资源更新成功,响应内容为:")  print(response.text)  
else:  # 请求失败,打印错误信息  print(f"资源更新失败,状态码:{response.status_code}")  print(response.text)

2. 图片爬取案例

2.1 案例介绍

这个案例通过发送HTTP请求、解析HTML页面、提取图片链接、下载图片并保存到本地等步骤,实现从指定网页爬取图片的功能。

案例使用的爬取网址:http://www.umeituku.com/bizhitupian/fengjingbizhi/

2.2 Python代码

代码如下:

import requests  # 发送请求,从服务器获取数据
from bs4 import BeautifulSoup  # 解析页面的源代码
n = 1  # 保存图片的计数器# 发送请求到服务器
url = 'http://www.umeituku.com/bizhitupian/fengjingbizhi/'  # 图片网站地址
resp = requests.get(url)  # 从服务器拿到网址, 返回响应
resp.encoding = 'utf-8'  # 重新编码utf-8
# 解析html--返回页面
main_page = BeautifulSoup(resp.text, 'html.parser')
# 在页面中找标签'div'的TypeList属性
typelist = main_page.find('div', attrs={'class':'TypeList'})
alst = typelist.find_all('a', attrs={'class':'TypeBigPics'})  # 所有的图片链接
# 从标签中获取每张图片的链接
for a in alst:href = a.get('href') # 发送请求到子页面,进入图片页面resp1 = requests.get(href) # 从服务器拿到网址resp1.encoding = 'utf-8'  # 重新编码utf-8child_page = BeautifulSoup(resp1.text, 'html.parser')  # 源代码解析,获取子页面# 获取所有图片路径src_att = child_page.find('div', attrs={'class':'ImageBody'})  # 找到子页面中图片属性src = src_att.find('img').get('src')  # 子页面中找到src图片路径# 创建文件f = open('tu%s.jpg'%n, mode='wb')  # 写入文件,内容是非文本文件,保存的文件名# 发送请求到服务器,把图片保存到本地f.write(requests.get(src).content)print('完成一次')n += 1  # 图片计数器

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

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

相关文章

cookie、localStorage、sessionStorage 详解

目录 cookie 是什么? cookie 不可以跨域请求 cookie 的属性 会话cookie & 永久性cookie cookie 禁用 cookie 的应用 sessionStorage 是什么? 失效时间 存储内容的类型 存储的大小 存储的位置 sessionStorage 的应用 localStorage 是什么…

GTC 2024 火线评论:DPU 重构文件存储访问

编者按:英伟达2024 GTC 大会上周在美国加州召开,星辰天合 CTO 王豪迈在大会现场参与了 GPU 与存储相关的最新技术讨论,继上一篇《GTC 2024 火线评论:GPU 的高效存储利用》之后,这是他发回的第二篇评论文章。 上一篇文章…

【ZZULI数据结构实验一】多项式的三则运算

【ZZULI数据结构实验一】多项式的四则运算 ♋ 结构设计♋ 方法声明♋ 方法实现🐇 定义一个多项式类型并初始化---CreateDataList🐇 增加节点---Getnewnode🐇 打印多项式类型的数据-- PrintPoly🐇 单链表的尾插--Listpush_back&…

Java多线程实战-从零手搓一个简易线程池(一)定义任务等待队列

🏷️个人主页:牵着猫散步的鼠鼠 🏷️系列专栏:Java全栈-专栏 🏷️本系列源码仓库:多线程并发编程学习的多个代码片段(github) 🏷️个人学习笔记,若有缺误,欢迎评论区指正…

【C语言】结构体

个人主页点这里~ 结构体 一、结构体类型的声明1、结构的声明2、结构体变量的创建和初始化3、声明时的特殊情况4、自引用 二、结构体内存对齐1、对齐规则2、存在内存对齐的原因3、修改默认对齐数 三、结构体传参四、结构体实现位段 一、结构体类型的声明 我们在指针终篇中提到过…

从零自制docker-5-【USER Namespace NETWORK Namespace】

文章目录 USER Namespace代码NETWORK Namespace代码块 USER Namespace 即进程运行在一个新的namespace中,且该namespace中的User ID和Group IDA在该namespace内外可以不同,可以实现在namspace的用户是root但是对应到宿主机并不是root Cloneflags增加一…

3款免费甘特图制作工具的比较和选择指南

GanntProject GanttProject https://www.ganttproject.biz/ 是一款项目管理和调度应用,适用于 Windows、macOS 和 Linux。它易于使用,无需任何设置,适用于个人用户和小型团队。该应用提供任务层次结构和依存关系、里程碑、基准行、Gantt 图表…

AI论文速读 | 具有时间动态的路网语义增强表示学习

论文标题: Semantic-Enhanced Representation Learning for Road Networks with Temporal Dynamics 作者: Yile Chen(陈亦乐) ; Xiucheng Li(李修成); Gao Cong(丛高) ; Zhifeng Ba…

卓健易控zj-v8.0设备智能控费系统

卓健易控zj-v8.0设备智能控费系统 详细可联系:19138173009 在现今医疗技术日新月异、突飞猛进的时代,我院服务患者的实力与日俱增。随着先进辅助检查设备的不断完善和引进,医生们如同得到了得力助手,能够为患者做出更加精确的诊断…

TCP重传机制详解——04FACK

文章目录 TCP重传机制详解——04FACK什么是FACKFACK的发展为什么要引入FACK实战抓包讲解开启FACK场景,且达到dup ACK门限值开启FACK场景,未达到dup ACK门限值 为什么要淘汰FACK总结REF TCP重传机制详解——04FACK 什么是FACK FACK的全称是forward ackn…

JVM(二)——垃圾回收

三、垃圾回收 1、如何判断对象可以回收 1)引用计数法 定义: 在对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加一;当引用失效时,计数器值就减一;任何时刻计数器为零的对象就是…

Java面试篇:Redis使用场景问题(缓存穿透,缓存击穿,缓存雪崩,双写一致性,Redis持久化,数据过期策略,数据淘汰策略)

目录 1.缓存穿透解决方案一:缓存空数据解决方案二:布隆过滤器 2.缓存击穿解决方案一:互斥锁解决方案二:设置当前key逻辑过期 3.缓存雪崩1.给不同的Key的TTL添加随机值2.利用Redis集群提高服务的可用性3.给缓存业务添加降级限流策略4.给业务添加多级缓存 4.双写一致性…

MySQL substr函数使用详解

博主猫头虎的技术世界 🌟 欢迎来到猫头虎的博客 — 探索技术的无限可能! 专栏链接: 🔗 精选专栏: 《面试题大全》 — 面试准备的宝典!《IDEA开发秘籍》 — 提升你的IDEA技能!《100天精通鸿蒙》 …

景联文科技上新高质量大模型训练数据!

在过去的一年中,人工智能领域呈现出了风起云涌的态势,其中模型架构、训练数据、多模态技术、超长上下文处理以及智能体发展等方面均取得了突飞猛进的发展。 在3月24日举办的2024全球开发者先锋大会的大模型前沿论坛上,上海人工智能实验室的领…

c语言--内存函数的使用(memcpy、memcmp、memset、memmove)

目录 一、memcpy()1.1声明1.2参数1.3返回值1.4memcpy的使用1.5memcpy模拟使用1.6注意 二、memmove()2.1声明2.2参数2.3返回值2.4使用2.5memmove()模拟实现 三、memset3.1声明3.2参数3.3返回值3.4使用 四、memcmp()4.1声明4.2参数4.3返回值4.4使用 五、注…

MySQL-extra常见的额外信息

本文为大家介绍MySQL查看执行计划时,extra常见的额外信息 Using index 表示使用了覆盖索引,即通过索引树可以直接获取数据,不需要回表。 表结构: CREATE TABLE t1 (id int(11) NOT NULL AUTO_INCREMENT,name varchar(255) DEFAULT NULL,ag…

IP SSL证书注册流程

使用IP地址申请SSL证书,需要用公网IP地址申请,申请之前确保直接的IP地址可以开放80或者443端口两者选择1个就好,端口不需要一直开放,只要认证的几分钟内开放就可以了,然后IP地址根目录可以上传txt文件。 IP SSL证书认…

vue3+vite - 报错 import.meta.glob() can only accept string literals.(详细解决方案)

报错说明 在vue3+vite项目中,解决报错: [plugin:vite:import-analysis] import.meta.glob() can only accept string literals. 如果我们报错差不多,就可以完美搞定这个错误。 解决教程 这个错误,是因为

【STM32嵌入式系统设计与开发】——9Timer(定时器中断实验)

这里写目录标题 一、任务描述二、任务实施1、ActiveBeep工程文件夹创建2、函数编辑(1)主函数编辑(2)USART1初始化函数(usart1_init())(3)USART数据发送函数( USART1_Send_Data(&…

蓝桥杯学习笔记(贪心)

在很久很久以前,有几个部落居住在平原上,依次编号为1到n。第之个部落的人数为 t 有一年发生了灾荒,年轻的政治家小蓝想要说服所有部落一同应对灾荒,他能通过谈判来说服部落进行联台。 每次谈判,小蓝只能邀请两个部落参…