python requests Python用Requests发请求,简直爽到飞起,urllib哭晕在厕所

发布时间:2026/9/12 8:03:11

python requests Python用Requests发请求,简直爽到飞起,urllib哭晕在厕所 介绍首先让我们来看 官方的介绍Requests is an elegant and simple HTTP library for Python, built for human beings.翻成过来意思是: 是给人类所撰写的一个具备优雅特性且呈现简单状态的 HTTP 库。如今这段介绍已经足够直白明显 , 那就让我们首先率先去领略一番其威势力量。import requests # 发送请求 response requests.get(urlhttp://www.baidu.com/s, params{wd:python}) # 处理响应 print(response.status_code) # 输出结果 200这个请求如果用 来实现代码如下import urllib.parse import urllib.request url http://www.baidu.com/s params urllib.parse.urlencode({wd:python}) # 发送请求 response urllib.request.urlopen(?.join([url, params])) # 处理响应 print(response.getcode()) # 输出结果 200就从感官方面而言, 是能够瞧出来的, 运用起来, 于URL、参数等层面会繁杂一些。这仅仅只是冰山一角罢了, 在实际运用进程当中, 还存有好多层面超出, 它并非是徒有虚名, 在接下来的学习期间, 你便会体会到。安装使用pip命令$ pip3 install requests或者也可以使用 命令安装$ easy_install requests发送请求使用 发送网络请求非常简单。我们首先需要导入 模块import requests而后, 我们能够试着去获取某一网页。在这个例子当中, 我们要把那公共时间线来进行获取标点符号:r requests.get(https://api.github.com/events)当下, 存在一个名为r的对象, 凭借这个对象, 能够获取一切我们所期望的信息。容易操作的 API 表明所有 HTTP 请求种类都是一目了然的, 比如说, 你能够像这样去发送一个 HTTP POST 请求:r requests.post(http://httpbin.org/post, data {key:value})轻易, 是不是? 那另外的HTTP请求类别, 为PUT, , HEAD以及 又是咋办? 全都是同样的简便:r requests.put(http://httpbin.org/put, data {key:value}) r requests.delete(http://httpbin.org/delete) r requests.head(http://httpbin.org/get) r requests.options(http://httpbin.org/get)传递参数在我们发送请求之际, 常常得向服务端发送请求参数, 一般而言参数都是以键与值相对的那种形式放置到URL里头, 是跟于一个问号过后的。比如, /get?keyval。 准许你运用关键字参数, 借由一个字符串字典去提供这些参数。举个例子, 要是你想把key1及key2传递到 /get , 那么你能够采用像下面这样的代码: 。payload {key1: value1, key2: value2} r requests.get(http://httpbin.org/get, paramspayload) print(r.url) # 输出结果 http://httpbin.org/get?key1value1key2value2通过打印输出该 URL你能看到 URL 已被正确编码。需留意, 字典之中, 那些值为 None 的键, 皆不会被增添至 URL 的查询字符串之内。你还可以将一个列表作为值传入payload {key1: value1, key2: [value2, value3]} r requests.get(http://httpbin.org/get, paramspayload) # 输出结果 http://httpbin.org/get?key1value1key2value2key2value3响应内容举个例子, 就比如说以请求百度首页为例子来讲在这种情况下, 我们能够凭借返回去读取服务器响应的内容来达成某些事情。import requests r requests.get(http://www.baidu.com) print(r.text) #返回太多只显示一部分它能够自动进行解码, 针对来自服务器的内容来开展, 大多数字符集是可以被它无缝地予以解码的。在请求被发出之后, 会依据HTTP头部针对响应的编码得出有凭借的推测。当你去访问r.text的时候, 会运用其所推测出的文本编码。你能够借助r.去获取所使用的编码:r.encoding # 输出结果 utf-8并且能够使用 r. 属性来改变它r.encoding ISO-8859-1假设存在这样一种情况, 即要是你把编码进行了改变, 那么在每一次你去访问 r.text 的时候, 就都会去使用 r 的新值。二进制响应内容就非文本请求而言, 比如说那种图片请求, 你同样能够以字节这一形式去访问请求响应体。并且, 它还会自动地为你去解码gzip以及传输编码的响应数据。比如, 凭借要求回报的二进制数据去构建一幅图片, 你能够运用像下面这样的代码:import requests from PIL import Image from io import BytesIO r requests.get(http://img.sccnn.com/bimg/326/203.jpg) print(r.content) bi BytesIO(r.content) print(bi) i Image.open(bi) print(i) # 输出结果 b\xff\xd8\xff\xe0\x00\x10JFIF\x00\... _io.BytesIO object at 0x1112fdbf8JSON 响应内容里头存在着一个被设立于内部的JSON解码器装置在里边, 它能够给予援手帮你去处理那与JSON有关的数据材料:r requests.get(https://api.github.com/events) print(r.json()) # 输出结果 [{urepository: {uopen_issues: 0, uurl: https://github.com/...要是 JSON 解码遭遇失败这种情形, 那么 r.json() 便会抛出一个异常。r requests.get(https://www.baidu.com) print(r.json()) # 输出结果 json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)要留意的是, 成功调用 r.json() 并不表明响应是成功的 , 有的服务器会在失败的响应里包含一个 JSON 对象 , 像是 HTTP 500 的错误细节 , 这种 JSON 会被解码返回 , 要检查请求是否成功 , 请使用 r.() 或者检查 r. 是否与你的期望一致 , 标点符号请确保。原始响应内容在极少的情形之下, 你或许会打算去获取源于服务器的原始套接字回应, 那么你能够去访问r.raw。在这个时候要保证在初始请求当中设置了 True。具体而言你能够如此去做: 。r requests.get(https://api.github.com/events, streamTrue) print(r.raw) print(r.raw.read(10)) # 输出结果 \x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x03设置请求头要是你在开展爬取某一页面内容的行为之际, 发觉所获取的数据呈现为空的状态, 然而经由浏览器直接去访问URL却并无问题, 在这种时候极有可能是你被服务器认定为爬虫用户了, 该怎么办才好呢? 我们理应去模拟浏览器进行请求, 在这个时候你需要针对请求增添HTTP头部信息, 仅仅只需简单地把一个dict传递给参数便可以达成了。例如我们设置一下 User-Agent url http://www.baidu.com headers {User-Agent: myagent/2.21.0} r requests.get(url, headersheaders) print(r.request.headers) # 输出结果 {User-Agent: myagent/2.21.0, Accept-Encoding: gzip, deflate, Accept: */*, Connection: keep-alive}能够瞧见, 所请求的 User - Agent, 已然转变成为所设置的 /2.21.0 了。复杂的 POST 请求每当我们运用那种 POST 请求之际, 去打印一回 r.text 的话, 就会发觉每一回都会呈现出几个关键字: 。{ args: {}, data: , files: {}, form: {}, headers: {}, json: null, origin: 221.232.172.222, 221.232.172.222, url: https://httpbin.org/post }在POST的参数里头能够设置这些关键字, 其中, 和args先前我们已然讲过, 它们分别代表请求头以及参数信息, 是指请求的路由ip, url是我们所请求的url, 其馀几个我们是能够进行设置的, 接下来我们就要瞧瞧其他几个关键字如何展开设置。设置data参数要是你于POST请求之际打算提交表单, 同样仅仅只需简便地递送一个字典给data参数就行。你那个数据字典在发起请求之时会自行编码成为表单样式:payload {key1: value1, key2: value2} r requests.post(http://httpbin.org/post, datapayload) print(r.text) # 输出结果 { ... form: { key1: value1, key2: value2 }, ... }对于那 data 参数, 你同样能够去传入一个元组所构成的列表, 它就将会被自动地转换为一个列表。payload ((key1, value1), (key1, value2)) r requests.post(http://httpbin.org/post, datapayload) print(r.text) # 输出结果 { ... form: { key1: [ value1, value2 ] }, ... }设置 json 参数许可你运用json径直传送参数, 接着它便会被自行编码。payload {some: data} r requests.post(http://httpbin.org/post, jsonpayload) print(r.text) # 输出结果 { args: {}, data: {\some\: \data\}, files: {}, form: {}, headers: { Accept: */*, Accept-Encoding: gzip, deflate, Content-Length: 16, Content-Type: application/json, Host: httpbin.org, User-Agent: python-requests/2.21.0 }, json: { some: data }, origin: 221.232.172.222, 221.232.172.222, url: https://httpbin.org/post }留意, 在此处, 不但对json进行了赋值操作, 并且还自动给予data赋值, json内部的键值对也被自动编码到data里了。设置文件参数上传文件很简单files {file: open(test.txt, rb)} r requests.post(http://httpbin.org/post, filesfiles) print(r.text) # 输出结果 { ... files: { file: this is a file test }, ... }你也可以增加一个参数把字符串发送到上传的文件中例如files {file: (test.txt, some,data,to,send\nanother,row,to,send\n)} r requests.post(http://httpbin.org/post, filesfiles) print(r.text) # 输出结果 { ... files: { file: some,data,to,send\nanother,row,to,send\n }, ... }响应状态码和响应头我们能够从服务器回应的成果里面取得状态码以及响应头的资讯, 举例来说:r requests.get(http://httpbin.org/get) print(r.status_code) # 输出结果 200为方便引用还附带了一个内置的状态码查询对象print(r.status_code requests.codes.ok) # 输出结果 True我们还可以查看响应的响应头信息r requests.get(http://httpbin.org/get) print(r.headers) # 输出结果 {Access-Control-Allow-Credentials: true, Access-Control-Allow-Origin: *, Content-Encoding: gzip, Content-Type: application/json, Date: Wed, 18 Sep 2019 12:22:06 GMT, Referrer-Policy: no-referrer-when-downgrade, Server: nginx, X-Content-Type-Options: nosniff, X-Frame-Options: DENY, X-XSS-Protection: 1; modeblock, Content-Length: 183, Connection: keep-alive}要获取响应头的某个字段值我们可以这样print(r.headers[Content-Encoding]) # 输出结果 gzip如果一个响应中包含了 那么我们可以利用 变量来拿到:url http://example.com/some/cookie/setting/url r requests.get(url) r.cookies[example_cookie_name] # 输出结果 example_cookie_value以上所呈现出的程序, 仅仅只是属于样例范畴, 于运行该程序的情况下并不将会收获所得下文之反馈返回内容, 是需要包含着何种具体内容的响应才能够得以收获到的呢。另外可以利用 变量来向服务器发送 信息cookies dict(cookies_areworking) r requests.get(http://httpbin.org/cookies, cookiescookies) print(r.text) # 输出结果 { cookies: { cookies_are: working } }可以看到我们设置 参数后返回中就包含了我们设置的信息。为其设置不同的那些, 此所涉返回对象是这样一种情况, 它跟字典相仿具有那种适用性特质, 适宜于跨越域名以及跨越路径去运用的, 这就表明, 我们能够针对不一样的域名或者路径来进行相关设置的。你还能够将Jar传送至其中去呀:jar requests.cookies.RequestsCookieJar() #为路径/cookies设置cookie jar.set(tasty_cookie, yum, domainhttpbin.org, path/cookies) #为路径/elsewhere设置cookie jar.set(gross_cookie, blech, domainhttpbin.org, path/elsewhere) #请求路径为/cookies的URL url http://httpbin.org/cookies r requests.get(url, cookiesjar) print(r.text) # 输出结果 { cookies: { tasty_cookie: yum } }重定向与请求历史在默认情形之下, 除去 HEAD 请求之外, 会对所有重定向进行自动处理。可以使用响应对象的 方法来追踪重定向。它是一个对象的列表, 此对象列表依据从最老到最近的请求开展排序。例如 将所有的 HTTP 请求重定向到 HTTPSr requests.get(http://github.com) print(r.url) print(r.status_code) print(r.history) # 输出结果 https://github.com/ 200 []要是你运用的电脑是Mac, 当运行这段代码时出现报错, 即“: reset by peer”, 那你就得对你系统进行升级, 具体办法自行去百度搜索关键词“mac 更新”, 在更新好后就不会再呈现报错的情况了。我们还可以通过 参数禁用重定向处理r requests.get(http://github.com, allow_redirectsFalse) print(r.status_code) print(r.history) # 输出结果 301 []超时你能够借由进行设置, 把参数予以确定, 从而去告知, 在历经了借助该参数所设定的秒数时间过后, 停下用于等待回应所用的行为。requests.get(http://github.com, timeout0.001) # 输出结果 requests.exceptions.ConnectTimeout: HTTPConnectionPool(hostgithub.com, port80): Max retries exceeded with url: / (Caused by ConnectTimeoutError(, Connection to github.com timed out. (connect timeout0.001)))这里因设置极短超时时间致使请求停下等待响应, 进而引发报错, 要注意, 这仅对连接过程起作用, 和响应体的下载并无关联, 并非是整个下载响应的时间限定, 而是倘若服务器在特定秒数内未作出应答, 便会引发一个异常。
延伸阅读

更多相关文章

2026/9/11 7:53:45

YOLO26智能交通监测系统:实时多车道分析与优化实践

1. 项目背景与核心价值在城市化进程加速的今天,交通拥堵已成为困扰各大城市的顽疾。传统交通流量监测主要依赖地磁线圈、摄像头结合人工计数等方式,存在安装维护成本高、数据更新延迟、无法实时分析等痛点。我们团队基于YOLO26框架开发的这套智能监测系统…

2026/9/11 5:04:05

Windows C盘空间清理全攻略与CCleaner使用技巧

1. 为什么C盘总是莫名其妙变红?作为一名常年与Windows系统打交道的IT从业者,我见过太多同事和朋友的电脑C盘莫名其妙就飘红了。这种情况通常发生在使用电脑1-2年后,系统盘空间就像被黑洞吞噬一样快速消失。经过多年观察,我发现主要…

2026/9/5 5:40:10

云原生爬虫架构设计与Kubernetes实践指南

1. 项目概述:云原生爬虫的工业级实践爬虫技术从单机脚本发展到分布式系统已有十余年历史,但直到容器化技术成熟,真正的弹性爬虫架构才成为可能。这个项目展示的是基于Kubernetes的爬虫集群设计方案,我在三个不同行业的实际部署中验…

2026/9/12 8:00:07

UFS Hibernate机制深度解析:链路级低功耗状态切换原理与实战

1. UFS Hibernate不是“休眠”,而是协议层的深度状态切换很多人第一次看到“UFS Hibernate”这个词,下意识会联想到操作系统里的休眠(Hibernate)——把内存内容写入硬盘、断电保存、唤醒时恢复。但UFS协议里的Hibernate完全不是一…

2026/9/12 8:00:07

流式输出+SSE:大模型响应秒出的工程实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/12 8:00:07

SpringBoot+SSM框架实现课堂作业管理系统开发实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/12 8:00:07

Python爬虫实战:豆瓣图书Top250数据采集全流程

1. 项目概述:豆瓣图书Top250爬虫实战 这个项目是一个完整的Python爬虫解决方案,目标是抓取豆瓣读书Top250榜单的所有图书信息。不同于简单的教学示例,我们将从零开始构建一个生产级别的爬虫系统,包含数据采集、清洗、存储和导出的…

2026/9/12 8:00:07

基于.NET Core MVC的在线考试系统开发实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/12 2:05:33

超人会飞不算本事:系统稳定依赖清晰规则与边界设计

开头先不绕弯子。“#斯坦李吐槽dc 所以超人是无缘无故会飞的嘛哈哈哈哈哈哈哈锤哥真是技术人才啊!#雷神 #复联”这类调侃式短标题,第一波冲击力在于它把两个宇宙的角色塞进同一个吐槽箱里,但细想一下就能发现,它真正碰到的根本不是…

2026/9/12 3:55:12

超人VS蜘蛛侠:拆解超级IP的影响力与传播方法论

把“蜘蛛侠 vs 超人”放在 CSDN 上聊,可能很多人第一反应是走错片场了。但如果把这两个角色看成“两个持续运营了 80 多年的文化产品”,你会发现,这场比较本质上是两个不同 IP 策略的长期结果对比:超人赢在定义了整个超级英雄题材…

2026/9/9 16:31:09

基于CNN的调制信号识别:MATLAB实现时频图分类实战

简介:本资源是一套面向通信工程与信号处理方向学习者、研究者的深度学习实践方案,聚焦调制信号自动检测与识别这一典型无线通信任务,解决传统方法依赖人工特征、低信噪比下性能下降等痛点。压缩包共12个文件(10.73MB)&…

2026/9/12 0:04:17

MATLAB仿生优化框架:长鼻浣熊算法多策略融合实现

简介:本资源是一份面向智能优化算法研究者与MATLAB初学者的仿生智能算法实践代码包,聚焦于长鼻浣熊优化算法(COA)的多策略改进与性能验证。针对传统COA易陷局部最优、收敛精度不足等问题,作者融合Circle映射初始化提升…

2026/9/12 0:04:17

【JAVA毕设源码分享】基于 JavaWeb 的校园一卡通管理系统的设计与实现 基于 JavaWeb 的校园卡业务管理系统(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/9/12 0:04:17

【JAVA毕设源码分享】基于 Java 的图书馆借阅管理平台的搭建与实现 基于 Java 的图书馆综合管理系统(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/9/12 6:29:36

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/10 15:19:50

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/12 6:37:43

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码