urllib是一个包,收集几个模块与url:
- urllib.request 用于打开和读取url
- urllib.error 包含由urllib.request引发的异常
- urllib.parse 解析url
- urllib.robotparser 用于解析robots.txt文件
urllib.request
-
语法 urllib.request.urlopen(url,data = None,[ timeout,] *,cafile = None,capath = None,cadefault = False,context = None)
– url 打开地址,它可以是url字符串或 Request对象。
– data 这个参数很讲究,默认Noen是GET请求,非空是POST请求(在python中不用手动指定请求类型)。
– timeout 请求超时时间
– ca 开头的参数是证书(认证)相关
– context 证书(认证)相关 -
返回值 此函数始终返回一个可以用作上下文管理器的对象
– geturl() —返回所获取资源的URL,通常用于确定是否遵循了重定向
– info()—以email.message_from_string()实例的形式返回页面的元信息,例如标头(请参阅 HTTP标头快速参考)。
– getcode() –返回响应的HTTP状态代码。
– 对于HTTP和HTTPS URL,此函数返回一个http.client.HTTPResponse对象。
– 对于FTP,文件和数据URL以及由旧版URLopener和FancyURLopener,此函数返回一个urllib.response.addinfourl对象。 -
一个简单的demo
import urllib.request
# 使用这个地址,方便观察重定向
url = 'http://www.bing.com/'
pesp = urllib.request.urlopen(url)
with pesp:
print(pesp.geturl())# 返回访问url,一般涉及到重定向使用
print(pesp.info())
print(pesp.getcode())
print(pesp.status,resp.reason)
# print(str(pesp.read(),'utf-8'))
- 指定 Headers
import urllib.request
# Mac 版本的 Chrome 的 User-Agent 信息
ua = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'
url = 'https://www.baidu.com/'
# 实例一个 Request对象
req = urllib.request.Request(url)
# 添加请求头信息(User-Agent是浏览器信息)
req.add_header('User-Agent',ua)
resp = urllib.request.urlopen(req)
with resp:
print(resp.geturl())
print(resp.info())
print(resp.getcode())
print(resp.status,resp.reason)
# print(str(f.read(),'utf-8'))
- 模拟不同浏览器请求头
import urllib.request
import random
# Mac 版本的 Chrome 的 User-Agent 信息
# ua = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'
# agent 列表
au_list = [
'Mozilla/5.0 (Linux; U; Android 4.0.2; en-us; Galaxy Nexus Build/ICL53F) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30',
'Mozilla/5.0 (BB10; Touch) AppleWebKit/537.1+ (KHTML, like Gecko) Version/10.0.0.1337 Mobile Safari/537.1+',
'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36',
'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:46.0) Gecko/20100101 Firefox/46.0'
]
# 取得列表随机项,参数可以是一个列表,元组或字符串。
ua = random.choice(au_list)
url = 'https://www.baidu.com/'
# 实例一个 Request对象
req = urllib.request.Request(url)
# 添加请求头信息(User-Agent是浏览器信息)
req.add_header('User-Agent',ua)
resp = urllib.request.urlopen(req)
with resp:
print(resp.geturl())
print(resp.info())
print(resp.getcode())
print(resp.status,resp.reason)
# print(str(f.read(),'utf-8'))
print(req.get_header('User-agent'))
urllib.parse
将入参进行编码
- 入参是一个字典。
import urllib.parse
dict = {
'name':'张三',
'age':23,
'url':'https://www.baidu.com/'
}
u = urllib.parse.urlencode(dict)
print(u)
编码后
name=%E5%BC%A0%E4%B8%89&age=23&url=https%3A%2F%2Fwww.baidu.com%2F
很明显是一个请求参数格式,并把数据转成百分号加十六进制字节形式
在开发过程中我建议使用parse.urlencode进行编码,这样相对安全一些
POST请求示例
from urllib import parse
from urllib.request import urlopen,Request
import simplejson
url = 'http://httpbin.org/post'
data = parse.urlencode({'name':'张三','age':15})
ua = 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:46.0) Gecko/20100101 Firefox/46.0'
req = Request(url)
req.add_header('User-Agent',ua)
with urlopen(req,data=data.encode()) as resp:
text = resp.read()
# print(text)
json = simplejson.loads(text)
print(json['form'])
httpbin是一个http测试网站,很好用
python多数是操作bytes格式数据,无论入参data还是返回数据,都是bytes格式,而我们使用得多是我们熟悉的类型比如int、string、列表等,网络请求返回的也是bytes数据,我们要使用就需要转换类型,而simplejson不需要我们手动转型,会自动转为相应类型