一、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=melon
parse_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=中文
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) # 输出:<a href="http://www.baidu.com/index.html" rel="external nofollow" target="_blank">http://www.baidu.com/index.html</a>
三、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'