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()

尾语

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

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

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

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

相关推荐
xys_6782 分钟前
深挖C语言:动态内存管理
c语言·开发语言
Be for thing4 分钟前
【嵌入式成长10】STC89C51蜂鸣器|有源/无源蜂鸣器区分、三极管驱动、定时器播放音乐实战
单片机·嵌入式硬件·学习
那年窗外下的雪.6 分钟前
Linux 学习笔记
linux·笔记·学习
码云数智-园园8 分钟前
Python如何将律师的Excel噩梦变成自动化系统
python·自动化·excel
belldeep16 分钟前
python:Selenium 4.47 编码新的写法
python·selenium
卷无止境16 分钟前
除了开发api,FastAPI其实也可以配合jinja2模板写页面
后端·python·fastapi
OPEN-F20 分钟前
Python进阶教程:项目工程化与虚拟环境
开发语言·python
吴声子夜歌22 分钟前
Java面试——基础
java·开发语言·面试
爱奥尼欧28 分钟前
【daily practice】最长数字串怎么找?岛屿数量如何沉岛秒数?六棍拼两三角形有几种验法?(5.字符串中找出连续最长的数字串、岛屿数量、拼三角)
笔记·学习
OPEN-F35 分钟前
Python进阶教程:自动化办公实战
python·c#·自动化