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

尾语

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

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

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

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

相关推荐
潮汐退涨月冷风霜21 分钟前
数字图像处理(1)OpenCV C++ & Opencv Python显示图像和视频
c++·python·opencv
长河1 小时前
Java开发者LLM实战——LangChain4j最新版教学知识库实战
java·开发语言
Cyan_RA91 小时前
SpringMVC @RequestMapping的使用演示和细节 详解
java·开发语言·后端·spring·mvc·ssm·springmvc
再见晴天*_*4 小时前
SpringBoot 中单独一个类中运行main方法报错:找不到或无法加载主类
java·开发语言·intellij idea
lqjun08276 小时前
Qt程序单独运行报错问题
开发语言·qt
Hello_Embed6 小时前
STM32HAL 快速入门(二十):UART 中断改进 —— 环形缓冲区解决数据丢失
笔记·stm32·单片机·学习·嵌入式软件
咸甜适中6 小时前
rust语言 (1.88) 学习笔记:客户端和服务器端同在一个项目中
笔记·学习·rust
酷飞飞7 小时前
Python网络与多任务编程:TCP/UDP实战指南
网络·python·tcp/ip
Magnetic_h7 小时前
【iOS】设计模式复习
笔记·学习·ios·设计模式·objective-c·cocoa
hdsoft_huge8 小时前
Java & Spring Boot常见异常全解析:原因、危害、处理与防范
java·开发语言·spring boot