python3 urllib.request模块学习笔记

urllib库是python3内置的HTTP请求库,包括以下四个模块:

  1. urllib.request:请求模块,可以用来模拟发送请求。
  2. urllib.error:异常处理模块
  3. urllib.parse :url解析模块
  4. urllib.robotparser:robots.txt解析模块

这篇文章主要记录一下urllib库中request模块的学习笔记。


  1. urlopen()方法

一个简单的例子:

from urllib import request
response = request.urlopen("http://www.baidu.com")
print(response)

## 运行结果:
<http.client.HTTPResponse object at 0x000001F0E5307BE0>

调用urlopen()方法,url参数为百度的官网链接,结果返回了一个HTTPResponse类型的对象。这个对象主要包含有如下几个方法和属性:read()、getheader(name)、getheaders()、version、status、closed。通过这个对象可以拿到我们想要的数据。

from urllib import request
response = request.urlopen("http://www.baidu.com")
print(response.read().decode("utf-8"))  # 获取网页html代码
print(response.status)  # 返回响应状态码
print(response.getheaders()) # 以字典形式返响应头信息
print(response.getheader("Content-Type")) # 返回指定返响应头的值

源码定义:

def urlopen(url, data=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT,
            *, cafile=None, capath=None, cadefault=False, context=None):

2. 其他常用参数用法:

data参数:可选,如果传了这个参数,那么请求方式就不再是get,而是post。注意,需要使用bytes()方法将data参数转化为字节流编码格式的内容。

from urllib import request, parse
data = {"name": "python"}
response = request.urlopen("http://httpbin.org/post", data=bytes(parse.urlencode(data), encoding="utf8"))
print(response.read().decode("utf-8"))

bytes(parse.urlencode(data), encoding="utf8")) 是将data参数转化成字节流形式。bytes方法第一个参数需要是字符串,parse模块的urlencode()方法可以将参数字典转化成字符串。第二的参数指定编码为 utf8。httpbin.org 站点是一个用于测试http请求的网站。

timeout参数:可选,用于设置请求超时时间,过了指定的时间就会抛出异常。

from urllib import request
try:
    response = request.urlopen("http://httpbin.org/post", timeout=0.1)
    print(response.read().decode("utf-8"))
except:
    print("请求超时啦")

## 运行结果:
请求超时啦

3. Resquest对象

urlopen()方法可以实现基本的请求,但这个方法有一定局限性,比如无法设置headers等信息。此时可以利用功能更强大的Request类来构建请求对象。
一个简单的例子:

from urllib import request  
req = request.Request("http://httpbin.org/get")  # 构建请求对象
response = request.urlopen(req)
print(response.read().decode("utf-8"))

我们可以发现urlopen()方法接收的是一个Request对象,这个例子中,response = request.urlopen(req)等价于response = request.urlopen("http://httpbin.org/get"),因为构造Reauest对象是只传入了url参数。

源码定义:

def __init__(self, url, data=None, headers={},
             origin_req_host=None, unverifiable=False,
             method=None):

# 常用参数解析:
data:必须传入bytes类型的,如果是字典,可以先用parse模块的urlencode()方法转为字符串,在用bytes()    
      方法
headers:是一个字典,用来构造请求头,也可以用add_header()方法来添加。最长用的就是添加User-Agent。
method:设置请求方法,一般为get或post

一个进阶的栗子:

from urllib import request, parse
headers = {"User-Agent":"User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36"}
dict = {"name": "pyhton"}
data = bytes(parse.urlencode(dict), "utf-8")
req = request.Request("http://httpbin.org/post", headers=headers, data=data, method="POST")  # method参数必须为大写
response = request.urlopen(req)
print(response.read().decode("utf-8"))

这个例子中设置了data参数和headers信息,请求结果如下:

{
  "args": {}, 
  "data": "", 
  "files": {}, 
  "form": {
    "name": "pyhton"
  }, 
  "headers": {
    "Accept-Encoding": "identity", 
    "Connection": "close", 
    "Content-Length": "11", 
    "Content-Type": "application/x-www-form-urlencoded", 
    "Host": "httpbin.org", 
    "User-Agent": "User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36"
  }, 
  "json": null, 
  "origin": "117.178.113.169", 
  "url": "http://httpbin.org/post"
}

4.高级用法

对于一些更高级的用法,入设置cookies和代理,就需要更强大的工具Handler了。可以把他理解为各种处理器,可以提供各种高级的功能,利用它,几乎可以做到http中所有的事情。

待更

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值