网络爬虫之urllib.parse详解
urllib库的简介
爬虫开发时,一般不会使用这个库,但是我们需要学习这个库。
urllib库简介
urllib是一个用来处理网络请求的python标准库,它包含4个模块
urllib.requests:请求模块,用于发起网络请求
urllib.parse:解析模块,用于解析
urllib.error:异常处理模块,用于处理request引起的异常
urllib.robotparse:用于解析robots.txt文件
urllib.parse作用简介
urllib.parse模块定义了一个标准接口,既可以把统一资源定位符(URL)解析为若干部分(通信协议,网络地址和路径等),也可以把各个部分重新组合成URL,还可以利用“基本URL”把相对路径转化为绝对路径。
urllib.parse模块设计之初就考虑到要兼容一系列和URL相关的RFC标准。目前能够支持的URL协议包括:file, ftp, gopher, hdl,http, https, imap, mailto, mms, nntp, prospero, rsync, rtsp, rtspu, sftp, shttp, sip, sips, snews, svn, svn+ssh, telnet, wais, ws, wss。
urllib.parse定义的函数主要分为两类:URL解析和URL转义
所以总而言之,urllib.parse是一个对url进行操作的包
下面我们来介绍下parse包里面所含有的几个功能
1.urlparse
from urllib.parse import urlparse
s=urlparse('https://www.csdn.net/?spm=1011.2124.3001.5359')#解析的网址
print(type(s),s)#打印类型和解析结果
看看打印结果:
<class 'urllib.parse.ParseResult'> ParseResult
(scheme='https',
netloc='www.csdn.net',
path='/',
params='',
query='spm=1011.2124.3001.5359',
fragment='')
分析下结果:
- ParseResult这个类型对象,打印了六个部分结果:
- scheme是协议,这里协议就是https
- netloc是域名,域名是啥就步说了吧,
- path是访问路径
- params就是参数
- query就是查询条件,一般用作get类型的url
- fragment就是描点,用于定位页面内部下拉位置
- 所以网址的标准链接格式就是:
scheme://netloc/path;params?query#fragment
这些能看懂一个网址什么组成的了吧
2.urlunparse
与第一个对立,他接受的参数是可迭代对象,对象长度必须是6
from urllib.parse import urlunparse
data=['http','www.baidu.com','index.com','user','a=7','comment']
print(urlunparse(data))
结果如下:
http://www.baidu.com/index.com;user?a=6#comment
Process finishedwith exit code 0
这就构造了一个url,当然随便构造一个url是不能正常访问的。对比上面的urlparse,一个是拆分url,一个是构造url,哈哈
3.urlsplit
跟urlparse类似,返回结果只有五个,params合并到了path中
from urllib.parse import urlsplit
s=urlsplit('https://www.csdn.net/?spm=1011.2124.3001.5359')
print(type(s),s)
老规矩还是以CSDN为例子,看打印结果:
<class 'urllib.parse.SplitResult'>
SplitResult(scheme='https',
netloc='www.csdn.net',
path='/',
query='spm=1011.2124.3001.5359',
fragment='')
但是呢,SplitResult是元组类型,可以通过索取获得想要的,不用都打印出来:
from urllib.parse import urlsplit
s=urlsplit('https://www.csdn.net/?spm=1011.2124.3001.5359')
# print(type(s),s)
print(s.path)
print(s.netloc)
print(s[1])
print(s[3])
这样打印结果如下:
4.urlunsplit()
跟上面那个方法类似,这个就是再把各个部分组合成完整的链接,长度必须是5,举例如下:
from urllib.parse import urlunsplit
data=['http','www.csdn.net','/','spm=1011.2124.3001.5359',' ']
print(urlunsplit(data))
根据前面打印拆分结果,我再给它复原了,运行结果如下,又得到csdn首页链接了
5.urljoin
就是对链接的补充合并,自己可以多打印几个试试
from urllib.parse import urljoin
print(urljoin('http://www.baidu.com','index.html'))
print(urljoin('http://www.baidu.com','http://www.baidu.com/index.html'))
效果如下:
6.urlencode
跟上面的类似,也是用于构造url
例子如下:
from urllib.parse import urlencode
parms={
'name':'chuan',
'age':'20'
}
b_url='http://www.baidu.com?'
url=b_url+urlencode(parms)
print(url)
结果:
7.parse_qs
from urllib.parse import parse_qs
u='name=chuan&age=20'
print(parse_qs(u))
parse_qs作用就是把得到的get请求参数字符串转为字典,这样便于好看理解。前面都是有序列化,这个就是反无序化。
8.parse_sql
from urllib.parse import parse_qsl
u='name=chuan&age=20'
print(parse_qsl(u))
跟上面第七个方法类似,这个就是返回的列表,列表里装的元组,元组左边为名,右边为值
9.quote
from urllib.parse import quote
key='川川'
url='http://www.baidu.com/?wd='+quote(key)
print(url)
这个很常见,我的理解就是把中文转换为url格式。对中文进行编码。
10.unquote
from urllib.parse import unquote
url='http://www.baidu.com/?wd=%E5%B7%9D%E5%B7%9D'
print(unquote(url))
它就可以把被编码后的中文还原。
这个模块差不多就这些了,学习爬虫慢慢来,不要一蹴而就。有了这个模块就可以对url解析和构造了。