【网络爬虫】(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-8
    child_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  # 图片计数器

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

FTP 文件传输服务

FTP连接 控制连接:TCP 21,用于发送FTP命令信息 数据连接:TCP 20,用于上传、下载数据 数据连接的建立类型: 主动模式:服务端从 20 端口主动向客户端发起连接 被动模式:服务端在指定范围…

【Linux】 centos7安装卸载SQL server(2017、2019)

一、安装配置 准备一个基础Linux配置: 内存为20GB 运行内存为2GB的系统(数据库小于2GB安装不了) 1、网络配置 我们需要进行网络的连接 进入 cd /ect/sysconfig/network-script/ 编辑文件ifcfg-ens33 vi ifcfg-ens33 Insert键进行编辑 把ONBOO…

flask_restful规范返回值

使用方法 导入 flask_restful.marshal_with 装饰器 定义一个字典变量来指定需要返回的标准化字段,以及该字段的数据类型 在请求方法中,返回自定义对象的时候, flask_restful 会自动的读 取对象模型上的所有属性。 组装成一个符合标准化参…

k8s的单pod单ip网络模型

背景 在k8s中,不再是每个docker容器一个ip地址,而是每个pod一个ip地址,docker容器只是pod里面的其中一个进程,可能拥有对外的端口号,但是不在为docker容器单独分配ip地址,pod里面的容器共享pod的ip地址 单…

Learn OpenGL 25 法线贴图

为什么要引入法线贴图 我们的场景中已经充满了多边形物体,其中每个都可能由成百上千平坦的三角形组成。我们以向三角形上附加纹理的方式来增加额外细节,提升真实感,隐藏多边形几何体是由无数三角形组成的事实。纹理确有助益,然而…

【数据分享】1929-2023年全球站点的逐月平均海平面压力(Shp\Excel\免费获取)

气象数据是在各项研究中都经常使用的数据,气象指标包括气温、风速、降水、能见度等指标,说到气象数据,最详细的气象数据是具体到气象监测站点的数据! 有关气象指标的监测站点数据,之前我们分享过1929-2023年全球气象站…

搭建 canal 监控mysql数据到RabbitMQ

项目需求: 使用canal监控mysql某个库某个表,或者多个库,多个表---- update/inster/create 操作, 系统版本mysql版本java版本canal版本rabbitMQ版本Rocky 9.2MySQL 8.0.26openjdk 11.0.221.1.6rabbitmq-server 3.12.4 mysql 配置…

基于nodejs+vue“共享书角”图书借还管理系统python-flask-django-php

同时还能为借阅者提供一个方便实用的“共享书角”图书借还管理系统,使得借阅者能够及时地找到合适自己的图书借还信息。管理员在使用本系统时,可以通过后台管理员界面管理借阅者的信息,也可以发布系统公告,让借阅者及时了解图书借…

[flask]cookie的基本使用/

彻底理解 Cookie - 知乎 (zhihu.com) 是什么 cookie是当你浏览某个网站的时候,由web服务器存储在你的机器硬盘上的一个小的文本文件。它其中记录了你的用户名、密码、浏览的网页、停留的时间等等信息。当你再次来到这个网站时,web服务器会先看看有没有…

Tomcat下载安装以及配置

一、Tomcat介绍 二、Tomcat下载安装 进入tomcat官网,https://tomcat.apache.org/ 1、选择需要下载的版本,点击下载 下载路径一定要记住,并且路径中尽量不要有中文 8、9、10都可以,本博文以8为例 2、将下载后的安装包解压到指定位…

『Apisix入门篇』从零到一掌握Apache APISIX:架构解析与实战指南

📣读完这篇文章里你能收获到: 🌐 深入Apache APISIX架构: 从Nginx到OpenResty,再到etcd,一站式掌握云原生API网关的构建精髓,领略其层次化设计的魅力。 🔌 核心组件全解析&#xff…

学习笔记Day15:Shell脚本编程

Shell脚本编程 Linux系统环境 Linux系统的4个主要部分:内核、shell、文件系统和应用程序。 内核是操作系统的核心,决定系统性能和稳定性shell :一种应用程序,是用户和内核交互操作的接口,是套在内核外的壳&#xff…

Acer宏碁暗影骑士擎AN515-58笔记本电脑工厂模式原厂Win11系统ISO镜像安装包下载

宏基AN515-58原装出厂OEM预装Windows11系统工厂包,恢复出厂时开箱状态一模一样,带恢复还原功能 链接:https://pan.baidu.com/s/1iCVSYtList-hPqbyTyaRqQ?pwdt2gw 提取码:t2gw 宏基原装系统自带所有驱动、NITROSENSE风扇键盘灯…

WSL2 Ubuntu装ESP-IDF以及USB使用

一、前言 小编一开始是使用 Windows 开发ESP的芯片,但是 espidf 在Windows 环境下的编译速度是真的慢,想使用Ubuntu的环境,又不想使用装虚拟机,觉得虚拟机太麻烦了。就想到了 WSL 微软的子系统,介绍一下怎么在 WSL的子…

STL标准模板库(C++

在C里面有已经写好的标准模板库〈Standard Template Library),就是我们常说的STL库,实现了集合、映射表、栈、队列等数据结构和排序、查找等算法。我们可以很方便地调用标准库来减少我们的代码量。 size/empty 所有的STL容器都支持这两个方法&#xff0c…

影视文件数字指纹签名检验系统的用户操作安全大多数

国内网盘服务大规模出现版权问题。 一些个人或团体会通过云存储客户端将主要由电影、电视、音乐组成的文件上传到网盘,然后在圈子里分享。 可供下载。 大量受版权保护的视频音乐就是通过这种特殊的盗版方式传播的,而这种传播方式暂时不受监管。 一些云存…

建模杂谈系列93 增量TF-IDF

说明 简单就是美 说起来这个项目很早之前做过,最近用到,再梳理一次。 这篇文章草稿是在2021年的,现在是2024年,继续写完它。 内容 1 TF-IDF 来自百度的解释:TF-IDF是一种统计方法,用以评估一字词对于一个…

网络安全笔记-day8,DHCP部署

DHCP部署与安全 全称(Dynamic Host Configura Protocol)动态主机配置协议 DHCP原理 DHCP协议_科来测试dhcp网络包-CSDN博客🔍 注意的是利用广播地址发送包 ACK(确认) 如果DHCP服务器损坏,则在87.5%时…

Python Flask框架 -- flask-migrate迁移ORM模型

# 之前使用的这个db.create_all()很有局限性,它不能把在class里修改的东西同步上数据库,所以不用了 # with app.app_context(): # 请求应用上下文 # db.create_all() # 把所有的表同步到数据库中去 例如,在User类中增加一个email字段&…

2.6 IDE(集成开发环境)是什么

IDE(集成开发环境)是什么 IDE 是 Integrated Development Environment 的缩写,中文称为集成开发环境,用来表示辅助程序员开发的应用软件,是它们的一个总称。 通过前面章节的学习我们知道,运行 C 语言&…