Python urllib.request读取资源

1,349 阅读3分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

本文已参与 「掘力星计划」 ,赢取创作大礼包,挑战创作激励金。

复习回顾

我们在前面urllib模块初识中对urllib模块中包含request、parse、error、robotparse四个模块,其中request模块主要对http发起请求。

我们都知道HTTP协议中主要有8种请求方式

  • GET请求:请求指定的页面信息
  • POST请求:向服务器提交数据请求处理结果
  • HEAD请求:获取报文头
  • PUT请求:向服务器上传新资源
  • TRACE请求:回显服务器收到的请求,主要用于测试和诊断
  • CONNECT请求:HTTP1.1协议预留给能够将连接改为管道方式的代理服务器
  • OPTIONS请求:允许查看服务端端性能
  • DELETE请求:请求服务器删除指定的页面

本期,我们对urllib.request模块对HTTP协议常用的请求进行学习,Let's go~

1. 基本网络请求

我们可以直接使用urllib.request模块提供的urlopen(url,data=None)方法

urlopen方法可以打开url资源

  • 传入的url地址后,会返回一个http.clinet.HTTPResponsed对象

根据返回的http.clinet.HTTPResponsed对象,有两种方式可以读取资源

  • 直接调用read 方式进行读取
  • 借助with文本资源管理器来进行读取

PS:由于返回数据都是二进制的,读取完后需要调用decode解析成utf-8格式输出

import urllib.request

# 打开URL资源
re = urllib.request.urlopen("https://juejin.cn/post/7024105564426731551")

# 方式一:按字节读取资源300字节
data = re.read(300)
# 将字节打印出来
print(data.decode("utf-8"))

# 方式二:with 文本管理器来进行打开读取资源
with re as f:
    print(f.read(300).decode("utf-8"))

2. GET请求

GET 请求是HTTP协议中最常见的请求方式之一,其显著特点在于所有请求的数据都在URL中

在urllib.request模块中,模拟实现GET方式有如下几种方式

urllib.request模块使用urlopen()方法

  • urlopen()方法默认就是采用GET请求方法
  • urlopen()发送GET请求参数,无需使用data属性,直接把请求参数附加在URL之后即可
 import urllib.request
 import urllib.parse

 # 请求的数据
 param = urllib.parse.urlencode({"bid": "juejin_web"})
 url = "https://i.snssdk.com/slardar/sdk_setting?%s" % param
 # 打开URL资源
 re = urllib.request.urlopen(url)

 # 按字节读取资源300字节
 data = re.read(300)
 # 将字节打印出来
 print(data.decode("utf-8"))

3. POST请求

POST 请求特点是把请求的数据放在body里,URL不用显示请求的数据

  • 方式一:使用urlopen()方法来进行POST请求

    • urlopen方法需要借助data属性
    • urlopen方法第一个参数既可以是url字符串,还可以是urllib.request.Request对象
import urllib.request
import urllib.parse
import json


# 请求的数据
param = urllib.parse.urlencode({
    "id_type": 2,
    "client_type": 2608,
    "sort_type": 2,
    "cursor": "0",
    "limit": 2
})
param = param.encode("utf-8")
# 打开URL资源
re = urllib.request.urlopen("https://api.juejin.cn/recommend_api/v1/article/recommend_all_feed?aid=2608&uuid=6977760184626628096",data=param)

# 按字节读取资源300字节
data = re.read()
# 将字节打印出来
print(json.dumps(data.decode("utf-8")))

  • 使用urllib.request.Resquest方法
import urllib.request
import urllib.parse
import json


# 请求的数据
param = urllib.parse.urlencode({
    "id_type": 2,
    "client_type": 2608,
    "sort_type": 2,
    "cursor": "0",
    "limit": 2
})
param = param.encode("utf-8")
url = "https://api.juejin.cn/recommend_api/v1/article/recommend_all_feed?aid=2608&uuid=6977760184626628096"
# 打开URL资源
req = urllib.request.Request(url=url,data=param)
re = urllib.request.urlopen(req)

# 按字节读取资源300字节
data = re.read()
print(re.status)
print(re.reason)
# 将字节打印出来
print(json.dumps(data.decode("utf-8")))

4. 其他请求

我们可以直接使用urllib.request.Resquest(),method属性来指定需要传入的请求方法

param = "请求更新的数据"
url = "请求地址"
req = urllib.request.Request(url=url,data=param,method="PUT/DELETE/CONNECT")
  • PUT请求:一般用于更新网站内容
  • DELETE请求:一般用来删除指定资源,一般都会开放出来

总结

本期,我们对urllib.request对HTTP各种请求进行学习和实操。

以上是本期内容,欢迎大佬点赞评论,下期见~