Python 网络请求模块 urllib 、requests详解

前言

大家早好、午好、晚好吖 ❤ ~欢迎光临本文章

Python 给人的印象是抓取网页非常方便,提供这种生产力的,主要依靠的就是 urllib、requests这两个模块。

话不多说,直接开搞,如果有什么疑惑/资料需要的可以点击文章末尾名片领取源码

urlib 介绍

urllib.request 提供了一个 urlopen 函数,来实现获取页面。支持不同的协议、基本验证、cookie、代理等特性。

urllib 有两个版本 urllib 以及 urllib2。

urllib2 能够接受 Request 对象,urllib 则只能接受 url。

urllib 提供了 urlencode 函数来对GET请求的参数进行转码,urllib2 没有对应函数。

urllib 抛出了 一个 URLError 和一个 HTTPError 来处理客户端和服务端的异常情况。

Requests 介绍

Requests 是一个简单易用的,用Python编写的HTTP库。

这个库让我们能够用简单的参数就完成HTTP请求,而不必像 urllib 一样自己指定参数。

同时能够自动将响应转码为Unicode,而且具有丰富的错误处理功能。

  • International Domains and URLs

  • Keep-Alive & Connection Pooling

  • Sessions with Cookie Persistence

  • Browser-style SSL Verification

  • Basic/Digest Authentication

  • Elegant Key/Value Cookies

  • Automatic Decompression

  • Unicode Response Bodies

  • Multipart File Uploads

  • Connection Timeouts

  • .netrc support

  • List item

  • Python 2.6---3.4

  • Thread-safe

以下为一些示例代码,本文环境为 Python 3.6.0

无需参数直接请求单个页面

python 复制代码
'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:702813599
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
import urllib
from urllib.request import request
from urllib.urlopen import urlopen
# import urllib2
import requests

# 使用 urllib 方式获取
response = urllib.request.urlopen('http://www.baidu.com')
# read() 读取的是服务器的原始返回数据 decode() 后会进行转码
print(response.read().decode())

# 使用 requests 方式获取
# request 模块相比
resp = requests.get('http://www.baidu.com')
print(resp)
print(resp.text)

HTTP 是基于请求和响应的工作模式,

urllib.request 提供了一个 Request 对象来代表请求,

因此上面的代码也可以这么写

python 复制代码
req = urllib.request.Request('http://www.baidu.com')
with urllib.request.urlopen(req) as response:
print(response.read())

Request对象可以增加header信息

python 复制代码
req = urllib.request.Request('http://www.baidu.com')
req.add_header('User-Agent', 'Mozilla/6.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/8.0 Mobile/10A5376e Safari/8536.25')
with urllib.request.urlopen(req) as response:
print(response.read())

或者直接将 header 传入 Request 构建函数。

带参数的 GET 请求

带有参数的请求和上面的例子本质一样,可以事先拼出URL请求字符串,然后再进行请求。

本例使用了 腾讯 的股票API,可以传入不同的股票代码以及日期,查询对应股票在对应时间的价格、交易信息。

python 复制代码
'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:702813599
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
# 使用带参数的接口访问
tencent_api = "http://qt.gtimg.cn/q=sh601939"

response = urllib.request.urlopen(tencent_api)
# read() 读取的是服务器的原始返回数据 decode() 后会进行转码
print(response.read())

resp = requests.get(tencent_api)
print(resp)
print(resp.text)

发送 POST 请求

urllib 没有单独区分 GET 和 POST 请求的函数,只是通过 Request 对象是否有 data 参数传入来判断。

python 复制代码
import urllib.parse
import urllib.request
url = 'http://www.someserver.com/cgi-bin/register.cgi'
values = {'name' : 'Michael Foord',
          'location' : 'Northampton',
          'language' : 'Python' }
data = urllib.parse.urlencode(values)
data = data.encode('ascii') # data should be bytes req = urllib.request.Request(url, data)
with urllib.request.urlopen(req) as response:
   the_page = response.read()

尾语

好了,今天的分享就差不多到这里了!

对下一篇大家想看什么,可在评论区留言哦!看到我会更新哒(ง •_•)ง

喜欢就关注一下博主,或点赞收藏评论一下我的文章叭!!!

最后,宣传一下呀~👇👇👇 更多源码、资料、素材、解答、交流 皆点击下方名片获取呀👇👇👇

相关推荐
草莓熊Lotso18 分钟前
Qt 进阶核心:UI 开发 + 项目解析 + 内存管理实战(从 Hello World 到对象树)
运维·开发语言·c++·人工智能·qt·ui·智能手机
2501_9418656323 分钟前
从事件驱动到异步架构的互联网工程语法构建与多语言实践分享
java·开发语言·jvm
前端 贾公子3 小时前
v-if 与 v-for 的优先级对比
开发语言·前端·javascript
嗯嗯=5 小时前
python学习篇
开发语言·python·学习
WoY20205 小时前
opencv-python在ubuntu系统中缺少依赖
python·opencv·ubuntu
大游小游之老游7 小时前
Python中如何实现一个程序运行时,调用另一文件中的函数
python
mantch7 小时前
个人 LLM 接口服务项目:一个简洁的 AI 入口
人工智能·python·llm
不会c嘎嘎7 小时前
QT中的常用控件 (二)
开发语言·qt
weixin_445054727 小时前
力扣热题51
c++·python·算法·leetcode
是一个Bug7 小时前
50道核心JVM面试题
java·开发语言·面试