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

Python的网络请求

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm=1001.2014.3001.5501

在上一节中多次提到了URL地址与下载网页,这两项是网络爬虫必备而又关键的功能,说到这两个功能必然会提到HTTP。本节将介绍在Python中实现HTTP网络请求常见的三种方式:urllib、urllib3以及requests。

1  urllib模块

urllib是python自带模块,该模块中提供了一个urlopen()方法,通过该方法指定URL发送网络请求来获取数据。urllib提供了多个子模块,具体的模块名称与含义如表1所示。

表1  urllib中的子模块

模 块 名 称

描    述

urllib.request

该模块定义了打开URL(主要是HTTP)的方法和类,例如,身份验证、重定向、cookie等等

urllib.error

该模块中主要包含异常类,基本的异常类是URLError

urllib.parse

该模块定义的功能分为两大类:URL解析和URL引用

urllib.robotparser

该模块用于解析robots.txt文件

通过urllib.request模块实现发送请求并读取网页内容的简单示例如下:

import urllib.request          # 导入模块

# 打开指定需要爬取的网页

response = urllib.request.urlopen('http://www.baidu.com')

html = response.read()          # 读取网页代码

print(html)                      # 打印读取内容

上面的示例中,是通过get请求方式获取百度的网页内容。下面通过使用urllib.request模块的post请求实现获取网页信息的内容,示例如下:

import urllib.parse

import urllib.request

# 将数据使用urlencode编码处理后,再使用encoding设置为utf-8编码

data = bytes(urllib.parse.urlencode({'word': 'hello'}), encoding='utf8')

# 打开指定需要爬取的网页

response = urllib.request.urlopen('http://httpbin.org/post', data=data)

html = response.read()          # 读取网页代码

print(html)                     # 打印读取内容

说明:这里通过http://httpbin.org/post网站进行演示,该网站可以作为练习使用urllib的一个站点使用,可以模拟各种请求操作。

注意:由于本章使用Scrapy爬虫框架和Crawley爬虫框架,代码部分与IDLE中的颜色有不一致的情况,这是考虑了与环境一致的原则。

2  Urllib3模块

Urllib3是一个功能强大,条理清晰,用于HTTP客户端的Python库,许多Python的原生系统已经开始使用Urllib3。Urllib3提供了很多Python标准库里所没有的重要特性:

Urllib3是一个功能强大,条理清晰的 HTTP客户端,适用于Python。Urllib3提供了很多Python标准库里所没有的重要特性:

l  线程安全。

l  连接池。

l  客户端SSL / TLS验证。

l  使用大部分编码上传文件。

l  Helpers用于重试请求并处理HTTP重定向。

l  支持gzip和deflate编码。

l  支持HTTP和SOCKS代理。

l  100%的测试覆盖率。

通过Urllib3模块实现发送网络请求的示例代码如下:

import urllib3

# 创建PoolManager对象,用于处理与线程池的连接以及线程安全的所有细节

http = urllib3.PoolManager()

# 对需要爬取的网页发送请求

response = http.request('GET','https://www.baidu.com/')

print(response.data)         # 打印读取内容

post请求实现获取网页信息的内容,关键代码如下:

# 对需要爬取的网页发送请求

response = http.request('POST','http://httpbin.org/post',fields={'word': 'hello'})

注意:在使用Urllib3模块前,需要在Python中通过pip install urllib3代码进行模块的安装。

3  requests模块

requests是Python中实现HTTP请求的一种方式,requests是第三方模块,该模块在实现HTTP请求时要比urllib模块简化很多,操作更加人性化。在使用requests模块时需要通过执行pip install requests代码进行该模块的安装。requests模块的功能特性如下:

以GET请求方式为例,打印多种请求信息的示例代码如下:

import requests                                 # 导入模块

response = requests.get('http://www.baidu.com')

print(response.status_code)                      # 打印状态码

print(response.url)                              # 打印请求url

print(response.headers)                          # 打印头部信息

print(response.cookies)                          # 打印cookie信息

print(response.text)                             # 以文本形式打印网页源码

print(response.content)                          # 以字节流形式打印网页源码

以POST请求方式,发送HTTP网络请求的示例代码如下:

import requests

data = {'word': 'hello'}                      # 表单参数

# 对需要爬取的网页发送请求

response = requests.post('http://httpbin.org/post', data=data)

print(response.content)                         # 以字节流形式打印网页源码

requests模块不仅提供了以上两种常用的请求方式,还提供以下多种网络请求的方式。代码如下:

requests.put('http://httpbin.org/put',data = {'key':'value'})    # PUT请求

requests.delete('http://httpbin.org/delete')         # DELETE请求

requests.head('http://httpbin.org/get')             # HEAD请求

requests.options('http://httpbin.org/get')             # OPTIONS请求

如果发现请求的URL地址中参数是跟在“?”的后面,例如“httpbin.org/get?key=val”。requests模块提供了传递参数的方法,允许使用params 关键字参数,以一个字符串字典来提供这些参数。例如,传递“key1=value1”和“key2=value2”到“httpbin.org/get”,可以使用如下代码:

import requests

payload = {'key1': 'value1', 'key2': 'value2'}             # 传递的参数

# 对需要爬取的网页发送请求

response = requests.get("http://httpbin.org/get", params=payload)

print(response.content)                                  # 以字节流形式打印网页源码

相关文章:

Python的网络请求

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 在上一节中多次提到了URL地址与下载网页,这两项是网络爬虫必备而又关键的功能,说到这两个功能必然会提到HTTP。本节将介绍在P…...

[Shell编程学习路线]——探讨Shell中变量的作用范围(export)

🏡作者主页:点击! 🛠️Shell编程专栏:点击! ⏰️创作时间:2024年6月14日10点14分 🀄️文章质量:95分 文章目录 ————前言———— 定义变量: 输出变…...

AlertManager解析:构建高效告警系统

一、AlertManager简介 AlertManager是一个开源的告警管理工具,主要用于处理来自于监控系统(如Prometheus)的告警。它的设计目标是提供一个统一的告警处理平台,能够集中管理告警的路由、去重、分组和通知等操作。在现代云服务架构中…...

打造专属 Switch 模拟游戏机

文章目录 2种方案Switch版RetroArchLakka系统 整体性能对比:Lakka更优核心是否兼容:并不兼容整合2种方案:共享游戏ROM和配置、资源等文件夹临时修改Samba共享整个Lakka系统根目录 存储空间优化添加模拟器核心Switch版RetroArchLakka 添加游戏…...

如何使用Python中的type()函数和isinstance()函数

在Python中,type()函数和isinstance()函数都用于确定一个对象的类型,但它们在用法和目的上有所不同。 1. type()函数 type()函数返回对象的数据类型(或类)。它接受一个参数(即要检查的对象),并…...

【LeetCode刷题】前缀和解决问题:560.和为k的子数组

【LeetCode刷题】Day 16 题目1:560.和为k的子数组思路分析:思路1:前缀和 哈希表 题目1:560.和为k的子数组 思路分析: 问题1:怎样找到数组所有子数组? 方式一:暴力枚举出来&#x…...

DTU在城市智慧供热上的应用:引领供热行业的智能化革新

随着城市化的快速推进和人们对舒适生活需求的日益增长,供热系统作为城市基础设施的重要组成部分,其智能化、高效化的发展已成为必然趋势。在这一进程中,DTU(Data Transfer Unit,数据传输单元)以其独特的优势…...

LeetCode | 58.最后一个单词的长度

这道题要求最后一个单词的长度,第一个想到的就是反向遍历字符串,寻找最后一个单词并计算其长度。由于尾部可能会有’ ,所以我们从后往前遍历字符串,找到第一个非空格的字符,然后记录下到下一个空格前依次有多少个字母即…...

202479读书笔记|《你是人间的四月天》——谁又能参透这幻化的轮回, 谁又大胆的爱过这伟大的变幻?

202479读书笔记|《你是人间的四月天》——谁又能参透这幻化的轮回, 谁又大胆的爱过这伟大的变幻? 散文诗歌书信 《你是人间的四月天(果麦经典)》作者林徽因,才女的散文,诗歌,书信集选。很值得一…...

近期docker镜像加速器被封杀,需要的请看此内容 点赞加关注

{ “registry-mirrors”: [“https://docker.m.daocloud.io”], “insecure-registries”: [“harbor.sunya.com”], “exec-opts”: [“native.cgroupdriversystemd”], “data-root”: “/data/docker”, “log-driver”: “json-file”, “log-opts”: {“max-size”:“500m…...

开源大模型的新星:ChatGPT-Next-Web 项目解析与推荐

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

【区块链】记账的千年演化:从泥板到区块链

🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 ​💫个人格言: "如无必要,勿增实体" 文章目录 记账的千年演化:从泥板到区块链引言一、古代记账:泥板与…...

MySQL的索引类型,以及各自的作用

MySQL的索引类型,以及各自的作用 常见的索引类型 主键索引(Primary Key Index): 唯一标识表中的记录,确保索引列的值在整个表中是唯一的主键索引通常是唯一索引的一种特例作用:加速查询,并自动…...

数组中的map方法

JavaScript中的map()方法详解 map()方法经常拿来遍历数组,但是不改变原数组,但是会返回一个新的数组,并且这个新的数组不会改变原数组的长度 注意:有时候会出现这种现象,出现几个undefined const array [1, 4,9, 16…...

使用Python生成并上传文档

这是一个简单的 Python 程序,用于生成文本文件并上传至 FTP 服务器; 通过输入文件名和内容,你可以将文档上传至指定的 FTP 服务器目录中; 在上传成功后,程序会自动关闭窗口。 使用方法 输入文件名和内容。 点击“生…...

LAMP部署及应用

在Web开发和应用程序部署中,LAMP(Linux、Apache、MySQL/MariaDB、PHP/Python/Perl)环境是一个经典的选择。本文将详细介绍如何在Linux系统上部署和配置LAMP环境,并展示一个简单的应用示例。 --- 目录 1. 简介 2. 准备工作 3. 步…...

【STM32进阶笔记】GPIO端口

前段时间由于其他原因,专栏暂停更新了较长一段时间,现在恢复更新,争取继续为大家创造有价值的内容,期待大家的订阅关注,欢迎互相学习交流。 在STM32速成笔记系列专栏中其实已经对GPIO的一些必要知识进行了介绍&#xf…...

探索HTML5 Geolocation:精准定位网页的新纪元

在互联网技术日新月异的今天,地理定位已经成为众多Web应用不可或缺的一部分,而HTML5 Geolocation API正是这一领域的关键技术。本文将深入剖析HTML5 Geolocation API的工作原理、使用方法,并通过实战代码示例,带你领略其在现代网页…...

C++程序打开EXCEL2010失败,提示:远程过程调用失败

前两天将Foxit福昕PDF阅览器升级到了最新版本,导致了这个问题,参照这篇文章才知道是升级了福昕阅读器引起的: c#调用excel报错(异常来自HRESULT:0X80010105(RPC_SERVERFAULT)) 这个问题折腾了很久才搞定,网上的很多办法都不靠谱…...

错题记录(小测)

单选 错题1 错题2 错题3 代码题 反转链表 链表的回文结构...

ChromeOS 逐渐靠近安卓

ChromeOS 逐渐 “安卓化” 谷歌在博客中透露,将在ChromeOS底层更广泛地使用和Android相同的技术栈。一个具体的例子是,ChromeOS现在已经开始使用Android的蓝牙协议栈,取代了之前使用的自己的协议栈。这次改变不仅提高了蓝牙配对速度&#xf…...

vector模拟实现

目录 vector介绍 vector示意图 关于vector扩容的问题 vector框架 构造函数 析构函数 vector有关空间容量函数 insert和erase pop_back和push_back 其它构造函数 拷贝构造 迭代器区间构造 运算符重载 关于迭代器失效问题【重点】 有关insert发生迭代器失效 有关…...

RV32F\RV32D指令集

RV32F\RV32D指令集 F扩展1、浮点控制状态寄存器2、指令类型F扩展 F扩展增加了32个浮点寄存器f0-f31,每个32位宽,以及一个浮点控制和状态寄存器fcsr,其中包含浮点单元的工作模式和异常状态。FLEN=32表示F单精度浮点扩展,大多数浮点指令对浮点寄存器中的值进行操作。浮点加载…...

安卓VirtualDisplay虚拟屏幕如何实现没有内容显示mirror内容(aosp14版本)

背景: 上一篇blog已经对mirror模式显示镜像屏幕内容进行了详细讲解: 安卓VirtualDisplay虚拟屏幕如何实现没有内容显示mirror屏幕内容 不过这个分析版本是基于aosp13,在这个发布后,有学员在aosp14上进行验证,发现还…...

YOLOv10在RK3588上的测试(进行中...)

1.代码源 国内镜像站在gitcode。这个镜像站也基本上包含了github上常用项目的镜像。然后它的主发布源在这里: GitCode - 全球开发者的开源社区,开源代码托管平台 yolov10是清华主导做的... 然后,在维护列表里看到了这个: 2024年05月31日&am…...

git的ssh安装,windows通过rsa生成密钥认证问题解决

1 windows下载 官网下载可能出现下载太慢的情况,Git官网下载地址为:官网,推荐官网下载,如无法下载,可移步至CSDN,csdn下载地址:https://download.csdn.net/download/m0_46309087/12428308 2 Gi…...

果园预售系统的设计

管理员账户功能包括:系统首页,个人中心,管理员管理,用户管理,果树管理,果园管理,果园预约管理 前台账户功能包括:系统首页,个人中心,论坛,公告&a…...

学了这篇面试经,轻松收割网络安全的offer

网络安全面试库 吉祥学安全知识星球🔗除了包含技术干货:Java代码审计、web安全、应急响应等,还包含了安全中常见的售前护网案例、售前方案、ppt等,同时也有面向学生的网络安全面试、护网面试等。 0x1 应届生面试指南 网络安全面…...

双向转发检测BFD(学习笔记)

定义 双向转发检测BFD(Bidirectional Forwarding Detection)是一种全网统一的检测机制,用于快速检测、监控网络中链路或者IP路由的转发连通状况 BFD检测机制 BFD的检测机制是两个系统建立BFD会话,并沿它们之间的路径周期性发送B…...

Spring Boot:Java 应用开发高效之道

Spring Boot 是一种革命性的框架,旨在简化 Java 应用的创建和部署过程。通过自动化配置和简化项目搭建流程,Spring Boot 大大加速了开发周期,让 Java 应用开发变得更加高效和便捷。 核心优势: 快速启动和简化配置:Spr…...