urllib包
urllib是一个包含几个模块来处理请求的库:
- urllib.request发送http请求
- urllib.error处理请求过程中出现的异常
- urllib.parse解析url
- urllib.robotparser解析robots.txt文件
快速请求
urlopen返回对象提供一些基本方法:
- read返回文本数据
- info服务器返回的头信息
- getcode状态码
- geturl请求的url
request.urlopen(url, data=None, timeout=10)
#url: 需要打开的网址
#data:Post提交的数据
#timeout:设置网站的访问超时时间
response = urllib2.urlopen("http://www.baidu.com")
print response.read().decode('utf-8')
urllib3
Urllib3是一个功能强大,条理清晰,用于HTTP客户端的Python库,许多Python的原生系统已经开始使用urllib3。Urllib3提供了很多python标准库里所没有的重要特性:
1.线程安全
2.连接池
3.客户端SSL/TLS验证
4.文件分部编码上传
5.协助处理重复请求和HTTP重定位
6.支持压缩编码
7.支持HTTP和SOCKS代理
urllib3的使用
request GET请求:
#!/usr/bin/env python
#-*- coding: utf-8 -*-
import urllib3
import requests
import sys
reload(sys)
sys.setdefaultencoding('utf8')
#Python的str默认是ascii编码,和unicode编码冲突.
#一个PoolManager实例来生成请求,由该实例对象处理与线程池的链接以及线程安全的所有细节
hhtp = urllib3.PoolManager()
#通过request()方法创造一个请求:
r = hhtp.request('GET','http://www.baidu.com')
#获得登录状态码
print(r.status)
#获得html源码,utf-8解码
print r.data.decode()
request(self, method, url, fields=None, headers=None, **urlopen_kw)
- 第一个参数method必选,指定请求方式。
- 第二个参数url必选
- 第三个fields,请求的参数,可选
- 第四个headers可选
request GET请求(添加数据)
#!/usr/bin/env python
#-*- coding: utf-8 -*-
import urllib3
import requests
import sys
reload(sys)
sys.setdefaultencoding('utf8')
#Python的str默认是ascii编码,和unicode编码冲突.
#一个PoolManager实例来生成请求,由该实例对象处理与线程池的链接以及线程安全的所有细节
http = urllib3.PoolManager()
#通过request()方法创造一个请求:
header={
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3493.3 Safari/537.36'
}
r = http.request('GET','http://www.zzu.edu.cn/',headers=header)
#获得登录状态码
print(r.status)
#获得html源码,utf-8解码
print r.data.decode()
Post请求类比Get请求,同样可以在request中添加数据
发送JSON数据
#!/usr/bin/env python
#-*- coding: utf-8 -*-
import urllib3
import requests
import sys
import json
reload(sys)
sys.setdefaultencoding('utf8')
#Python的str默认是ascii编码,和unicode编码冲突.
#一个PoolManager实例来生成请求,由该实例对象处理与线程池的链接以及线程安全的所有细节
http = urllib3.PoolManager()
#通过request()方法创造一个请求:
header={
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3493.3 Safari/537.36'
}
#r = http.request('GET','http://www.zzu.edu.cn/',headers=header)
'''#获得登录状态码
print(r.status)
#获得html源码,utf-8解码
print r.data.decode()'''
data={'郭翔':'666'}
#使用 json.dumps方法可以将python对象转换为json对象
encode_data = json.dumps(data).encode()
r = http.request('POST','http://httpbin.org'+'/post',body=encode_data,headers={'Content-Type':'application/json'})
print(r.data.decode('unicode_escape'))
JSON:在发起请求时,可以通过定义body 参数并定义headers的Content-Type参数来发送一个已经过编译的JSON数据
上传文件
#使用multipart/form-data编码方式上传文件,可以使用和传入Form data数据一样的方法进行,并将文件定义为一个元组的形式 (file_name,file_data):
with open('1.txt','r+',encoding='UTF-8') as f:
file_read = f.read()
r = http.request('POST',
'http://httpbin.org/post',
fields={'filefield':('1.txt', file_read, 'text/plain')
})
print(r.data.decode('unicode_escape'))
#二进制文件
with open('websocket.jpg','rb') as f2:
binary_read = f2.read()
r = http.request('POST',
'http://httpbin.org/post',
body=binary_read,
headers={'Content-Type': 'image/jpeg'})
#
# print(json.loads(r.data.decode('utf-8'))['data'] )
print(r.data.decode('utf-8'))
使用Timeout
#使用timeout,可以控制请求的运行时间。在一些简单的应用中,可以将timeout参数设置为一个浮点数:
r = http.request('POST',
'http://httpbin.org/post',timeout=3.0)
print(r.data.decode('utf-8'))
#让所有的request都遵循一个timeout,可以将timeout参数定义在PoolManager中:
http = urllib3.PoolManager(timeout=3.0)
对重试和重定向进行控制
#通过设置retries参数对重试进行控制。Urllib3默认进行3次请求重试,并进行3次方向改变。
r = http.request('GET',
'http://httpbin.org/ip',retries=5)#请求重试的次数为5
print(r.data.decode('utf-8'))
##关闭请求重试(retrying request)及重定向(redirect)只要将retries定义为False即可:
r = http.request('GET',
'http://httpbin.org/redirect/1',retries=False,redirect=False)
print('d1',r.data.decode('utf-8'))
#关闭重定向(redirect)但保持重试(retrying request),将redirect参数定义为False即可
r = http.request('GET',
'http://httpbin.org/redirect/1',redirect=False)