您现在的位置是:网站首页> 编程资料编程资料
Python网络编程之HTTP客户端模块urllib与urllib3_python_
2023-05-26
397人已围观
简介 Python网络编程之HTTP客户端模块urllib与urllib3_python_
一、urllib
概述:
urllib是Python中请求url连接的官方标准库,就是你安装了python,这个库就已经可以直接使用了,基本上涵盖了基础的网络请求功能。在Python2中主要为urllib和urllib2,在Python3中整合成了urllib。
Python3.x中将urllib2合并到了urllib,之后此包分成了以下四个模块:
- urllib.request: 它是最基本的http请求模块,用来模拟发送请求
- urllib.error: 异常处理模块,如果出现错误可以捕获这些异常
- urllib.parse: 一个工具模块,提供了许多URL处理方法,如:拆分、解析、合并等
- urllib.robotparser:主要用来识别网站的robots.txt文件,然后判断哪些网站可以爬
二、urllib.parse模块
它支持如下协议的URL处理:file,ftp,gopher,hdl,http,https,imap,mailto,mms,news,nntp,prospero,rsync,rtsp,rtspu,sftp,sip,sips,snews,svn,snv+ssh,telnet,wais
1、urlparse()、urlunparse():将url字符串解析成元组
语法:urllib.parse.urlparse(urlstring,scheme='',allow_fragments=True)
可以传递3个参数
- urlstring:待解析的URL,字符串
- scheme:它是默认的协议,如http或者https,URL如果不带http协议,可以通过scheme来指定,如果URL中制定了http协议则URL中生效
- allow_fragments:是否忽略fragment即锚点,如果设置为False,fragment部分会被忽略,反之不忽略
该方法可以实现URL的识别和分段,分别是scheme(协议),netloc(域名),path(路径),params(参数),query(查询条件),fragment(锚点)
import urllib.parse url = "http://www.baidu.com" parsed = urllib.parse.urlparse(url) print(parsed) # 输出:ParseResult(scheme='http', netloc='www.baidu.com', path='', params='', query='', fragment='') #返回的是一个parseresult类型的元组对象,可以通过属性或者索引来获取值
与urlparse()相反,urlunparse通过列表或者元祖的形式接受一个可迭代的对象,实现URL构造
from urllib.parse import urlunparse data=['http','www.baidu.com','index.html','user','a=6','comment'] print(urlunparse(data)) #构造一个完整的URL #output #http://www.baidu.com/index.html;user?a=6#comment
2、urlsplit()、urlunsplit():URL分割与组合
与urlparse()方法类似,它会返回5个部分,只是把params合并到path中。
from urllib.parse import urlsplit result = urlsplit('http://www.baidu.com/index.html;user?id=5#comment') print(result) print(result.query) # output # SplitResult(scheme='http', netloc='www.baidu.com', path='/index.html;user', query='id=5', fragment='comment') # id=5与urlunparse()类似,它也是将链接的各部分组合完整的链接的方法,传入的参数也是可迭代的对象,如列表元祖等,唯一的区别是长度必须是5个,它省略了params
from urllib.parse import urlsplit,urlunsplit data=['http','www.baidu.com','index.html','a=5','comment'] result=urlunsplit(data) print(result) #output #http://www.baidu.com/index.html?a=5#comment
3、urlencode()、parse_qs():查询字符串与字典类型转换
urlencode() 将dict中的键值对以连接符&划分。
urlencode()在构造GET请求参数时很有用,可以将字典类型的请求数据转变为url编码
import urllib.parse dic = {'name':'melon','age':18} data = urllib.parse.urlencode(dic) print(data) #age=18&name=melonparse_qs()与urlencode()正好相反,它是用来反序列化的,如将GET参数转换回字典格式
from urllib.parse import urlencode,parse_qs,urlsplit params = {'username':'zs','password':'123'} base_url='http://www.baidu.com' url=base_url+'?'+urlencode(params) #将字典转化为get参数 query=urlsplit(url).query #获去URL的query参数条件 print(parse_qs(query)) #根据获取的GET参数转换为字典格式 #output #{'username': ['zs'], 'password': ['123']}4、quote()、unquote():URL编码与解码
quote:URL编码处理,该方法可以将内容转换为URL编码的格式。
如参数中带有中文等非ASCII码时,有时会导致乱码的问题,此时用这个方法将中文字符转化为URL编码
from urllib.parse import quote key='中文' url='https://www.baidu.com/s?key='+quote(key) print(url) #output #https://www.baidu.com/s?key=%E4%B8%AD%E6%96%87
unquote(url):URL解码处理,与quote()相反,URL上的特殊字符还原
from urllib.parse import quote, urlsplit, unquote key = '中文' url = 'https://www.baidu.com/s?key=' + quote(key) print(url) unq = urlsplit(url).query.split('=')[1] # 获取参数值 print(unquote(unq)) # 解码参数5、urljoin():将url的根域名和新url拼合成一个完整的url
格式:urljoin(baseurl,newurl,allowFrag=None)
通过将基本URL(base)与另一个URL(url)组合起来构建完整URL,它会使用基本URL组件,协议(schemm)、域名(netloc)、路径(path)、来提供给URL中缺失的部分进行补充,最后返回结果。
base_url提供了三项内容scheme,netloc,path,如果这3项在新的链接中不存在就给予补充,如果新的链接存在就使用新的链接部分,而base_url中的params,query和fragment是不起作用的。
通过urljoin()方法可以实现链接的解析、拼接和生成。
import urllib.parse url = "http://www.baidu.com" new_path = urllib.parse.urljoin(url, "index.html") print(new_path) # 输出:http://www.baidu.com/index.html
三、urllib.request模块
1、urlretrieve():下载url到html文件。
urlretrieve(url,filename,reporthook,data)
不写路径filename则会被存为临时文件,可以用 urllib.urlcleanup() 来清理缓存
file_name = urllib.request.urlretrieve('http://www.baidu.com','%s/baidu.html'%BASE_DIR)2、urlopen():打开一个url的方法,返回一个文件对象,然后可以进行类似文件对象的操作
模块中最常用的函数为urlopen():
urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)
参数如下:
- url: 请求的网址,str类型,也可以是一个request对象
- data:要发送到服务器的数据,data参数是可选的,内容为字节流编码格式的即bytes类型,如果传递data参数,urlopen将使用Post方式请求。
- timeout:设置网站的访问超时时间,单位为秒,如果请求超出了设置时间还未得到响应则抛出异常,支持HTTP,HTTPS,FTP请求。
- 其他参数:context参数,她必须是ssl.SSLContext类型,用来指定SSL设置,此外,cafile和capath这两个参数分别指定CA证书和它的路径,会在https链接时用到。
1、urlopen的方法:
urlopen返回http.client.HTTPResponse对象,提供方法:
- read():获取响应返回的数据,只能使用一次。
- readline():返回得是二进制格式得页面中得第一行
- readlines() :以二进制格式 返回所有得数据 以列表格式保存
- fileno():
- close() :
- info():返回一个httplib.HTTPMessage 对象,表示远程服务器返回的头信息。
- getcode():返回Http状态码,如果是http请求,200表示请求成功完成;404表示网址未找到。
- getheaders():获取返回响应的响应报头。
- geturl():返回请求的url。
在urlopen()方法中,直接写入要访问的url地址字符串,该方法就会主动的访问目标网址,然后返回访问结果。
返回的访问结果是一个http.client.HTTPResponse对象,使用该对象的read()方法即可获取访问网页获取的数据,这个数据是二进制格式的,所以我们还需要使用decode()方法来将获取的二进制数据进行解码,转换成我们可以看的懂得字符串。
import urllib.request req = urllib.request.urlopen('http://www.baidu.com') print(req.read().decode()) print(req.getheaders()) # 以列表元祖对的形式返回响应头信息 print(req.getheader('Content-Type')) # 返回响应头中的Content-Type值 print(req.info()) # 返回网页的头信息 print(req.info()['Content-Type']) # 返回响应头中的Content-Type值2、for循环读取
不需要使用read()方法 。
for line in urlopen('https://。。.html'): line = line.decode('utf-8') # Decoding the binary data to text. if 'EST' in line or 'EDT' in line: # look for Eastern Time print(line)3、GET请求
GET请求和我们平常get访问方式一样,直接把参数写到网址上面就好了。
import urllib.request import urllib.parse dic = {'name':'melon','age':18} data = urllib.parse.urlencode(dic) req = urllib.request.urlopen('http://127.0.0.1:8000/index?%s'%data) #通过urlopen方法访问拼接好的url content = req.read()4、POST请求
在urlopen()方法中,urlopen()默认的访问方式是GET,当在urlopen()方法中传入data参数时,则会发起POST请求。
注意:传递的data数据需要为bytes格式,如data=b'word=hello'。
import urllib.request import urllib.parse import json dic = {'name':'melon','age':18} data = urllib.parse.urlencode(dic) req = urllib.request.Request('http://127.0.0.1:8000/index', data.encode()) #encode:将url编码类型的请求数据转变为bytes类型 opener = urllib.request.urlopen(req) content = json.loads(opener.read().decode()) #read()方法是读取返回bytes数据内容,decode转换后为str5、请求头参数模拟
当我们需要模拟一些其他的参数的时候,简单的urlopen() 方法已经无法满足我们的需求了,这个时候我们就需要使用下面的urllib.request中的Request对象来帮助我们实现一些其它参数的模拟,比如请求头。
Request对象如下所示:
# Request对象实例化 req = urllib.request.Request(url, data=None, headers={},origin_req_host=None,unverifiable=False, method=None)- url:请求的URL,必须传递的参数,其他都是可选参数
- data:上传的数据,必须传bytes字节流类型的数据,如果它是字典,可以先用urllib.parse模块里的urlencode()编码
- headers:它是一个字典,传递的是请求头数据,可以通过它构造请求头,也可以通过调用请求实例的方法add_header()来添加
例如:修改User_Agent头的值来伪装浏览器,比如火狐浏览器可以这样设置:
{'User-Agent':'Mozilla/5.0 (compatible; MSIE 5.5; Windows NT)'} - origin_req_host:指请求方的host名称或者IP地址
- unverifiable:表示这个请求是否是无法验证的,默认为False,如我们请求一张图片如果没有权限获取图片那它的值就是true
- method:是一个字符串,用来指示请求使用的方法,如:GET,POST,PUT等
from urllib import request url='http://httpbin.org/post' headers={ 'User-Agent':'Mozilla/5.0 (compatible; MSIE 5.5; Windows NT)', 'Host':'httpbin.org' } #定义头信息 dict={'name':'germey'} data = bytes(parse.urlencode(dict),encoding='utf-8') req = request.Request(url=url,data=data,headers=headers,method='POST') #req.add_header('User-Agent','Mozilla/5.0 (compatible; MSIE 8.4; Windows NT') #也可以request的方法来添加 resp = request.urlopen(req) print(resp.read().decode())3、urllib.request的高级类
BaseHandler类:
在urllib.request模块里的BaseHandler类,他是所有其他Handler的父类,他是一个处理器,比如用它来处理登录验证,处理cookies,代理设置,重定向等
BaseHandler的子类包括:
- HTTPDefaultErrorHandler:用来处理http响应错误,错误会抛出HTTPError类的异常
- HTTPRedirectHandler:用于处理重定向
- HTTPCookieProcessor:用于处理cookies
- ProxyHandler:用于设置代理,默认代理为空
- HTTPPasswordMgr:永远管理密码,它维护用户名和密码表
- HTTPBasicAuthHandler:用户管理认证,如果一个链接打开时需要认证,可以使用它来实现验证功能
build_opener(*handlers)方法用于构建一个自定义的OpenerDirector对象。
build.opener(handler1,handl
相关内容
- Python网络编程之socket与socketserver_python_
- python中的元类metaclass详情_python_
- Python自动化实战之接口请求的实现_python_
- 使用Python操作MySql数据库和MsSql数据库_python_
- Python中的 enumerate和zip详情_python_
- python如何为list实现find方法_python_
- python如何查找列表中元素的位置_python_
- Python数组变形的几种实现方法_python_
- Python实现多脚本处理定时运行_python_
- Pytorch模型定义与深度学习自查手册_python_
点击排行
本栏推荐
