爬虫快速入门教程:利用urllib实现网络请求(中)

本文是Python爬虫入门教程的第二部分,详细介绍了urllib模块的使用,包括urlparse、urljoin、urldefrag、urlencode、quote和unquote等方法,讲解了如何处理和组合URL,以及对请求参数的编码和解码操作。通过实例演示,帮助读者掌握网络请求的关键步骤。

上一节,我们讲了如何通过urllib中的request模块发起网络请求并读取响应。在发起网络请求时,传输正确的url参数是非常重要的。为此,urllib专门提供了一个parse模块用于帮助我们处理URL,它可以帮助我们实现针对URL的提取、解析和合并等。下面我们就针对其中的重点方法做详细说明。

一、urlparse()方法

该方法用于将URL解析为多个分段,其API如下:

urllib.parse.urlparse(urlstring, scheme='', allow_fragments=True)
  • urlstring:这是必填项,是我们需要解析的URL
  • scheme:它是默认的协议,即当URL中未携带协议信息时,会以此值作为默认的协议。
  • allow_fragments:是否允许fragment,默认允许。URL可以标识主要资源,而fragment用于标识次级资源。一般来说在URL末尾通过#标识的部分就是fragment,如#usercenter可能标识了用户中心的位置。当我们设置其为False时,#及后边的部分会被解析到其他信息中。

我们来看一个简单的例子。

from urllib.parse import urlparse

url = 'https://www.oldq.top/index.php?page_id=20#usertab1'
res = urlparse(url)

print(type(res))
print(res)

输出为:

<class 'urllib.parse.ParseResult'>
ParseResult(scheme='https', netloc='www.oldq.top', path='/index.php', params='', query='page_id=20', fragment='usertab1')

可以看到,这里的输出包含了六个部分:

  • scheme:协议,它是指//之前的部分,最常见的就是httphttpsftp等。
  • netloc:域名,这个很好理解,像上文中www.oldq.top就是老Q斥巨资购买的个人域名。
  • path:我们要访问的网页或文件相对于根目录的相对路径,是指域名后边的那一部分。
  • params:访问参数。
  • query:查询条件,是指问号后边的那一部分。
  • fragment:锚点,一般用于定位页面内的次级资源,比如网页中的用户中心模块或者评论模块等,正如前文所述,它一般跟在#后边。

urlparse返回的结果实际上继承了命名元组(NamedTuple),所以我们可以通过索引或者属性名称来提取信息,如res[0]res['scheme']

二、urlunparse()方法

urlparse相对应,urlunparse()用于将URL的不同部分组合成为一个完整的URL。简单示例如下:

from urllib.parse import urlunparse

parts = ['https', 'www.oldq.top', 'index.php', '', 'page_id=20', 'usertab1']
print(urlunparse(parts))

输出为:

https://www.oldq.top/index.php?page_id=20#usertab1

三、urlsplit()方法

urlsplit()urlparse()很像,区别只在于它不再单独解析params,而是将其与path合并。仍以刚才的例子来看:

from urllib.parse import urlsplit

url = 'https://www.oldq.top/index.php?page_id=20#usertab1'
res = urlsplit(url)

print(type(res))
print(res)

输出为:

<class 'urllib.parse.SplitResult'>
SplitResult(scheme='https', netloc='www.oldq.top', path='/index.php', query='page_id=20', fragment='usertab1')

可以看到,结果里没有了params属性。

四、urlunsplit()方法

或许urllib库的作者有强迫症吧,也或许他只是有成人之美的善良。假设urlsplit()是男,urlunsplit就是女,男女搭配,干活不累。单身的码农们看到这些成双入对的方法,也不知道会不会流下酸涩的泪水。

这个方法没什么好说的,用法跟urlunparse()一样,只是要在传入的参数中去掉params的部分。

五、urljoin()方法

这个方法也用于通过合并生成URL。鉴于它和urlunparse()urlunsplit()的功能并不一样,所以我们也单独列出来。我们看一下它的API:

urllib.parse.urljoin(base, url, allow_fragments=True)
  • base:它是一个基链接,用来给后边的url参数对应的链接补充schemenetlocpath部分的缺失,如果url参数对应的链接在这三个部分没有缺失,那最后生成的链接在这三部分采用的是url参数中的信息。
  • url:我们希望访问的链接(但是可能在某些部分不全)。
  • allow_fragments:默认为True,与urlparse()中含义一样。

六、quote()方法

quote()方法用于将内容转化为URL编码的格式。我们经常可以看到在包含中文的链接里,中文往往以奇怪的字符串存在。

比如https://www.baidu.com/s?wd=%E8%80%81Q%E6%9C%80%E5%B8%85实际上就是老Q最帅的百度搜索链接。我们在百度搜索老Q最帅,然后从地址栏中将链接复制出来,粘贴到文本中,就会得到上边这个乱七八糟的链接。

image

我们仍以“老Q最帅”为例。

from urllib.parse import quote

keyword = '老Q最帅'
url = 'https://www.baidu.com/s?wd={0}'.format(quote(keyword))
print(url)

输出为:

https://www.baidu.com/s?wd=%E8%80%81Q%E6%9C%80%E5%B8%85

跟上边我们从浏览器里复制出来的链接一模一样。

七、unquote()方法

假如quote()是男的,unquote()就是女的,它们就是一对恩爱的狗男女。假设我们看到这么一条链接:https://www.baidu.com/s?wd=%E8%80%81Q%E6%9C%80%E5%B8%85,我们很难想到,它的尾缀是在阐述这么一条真理:老Q最帅。

但是我们可以通过解码来找到真相。


from urllib.parse import unquote

url = 'https://www.baidu.com/s?wd=%E8%80%81Q%E6%9C%80%E5%B8%85'
print(unquote(url))

输出为:

https://www.baidu.com/s?wd=老Q最帅

跟你们想的一模一样。

八、urlencode()方法

urlencode()用来帮助我们对请求参数进行编码,它是非常重要且常用的方法。其API如下:

urllib.parse.urlencode(query, doseq=False, safe='', encoding=None, errors=None, quote_via=quote_plus)
  • query:它是我们要编码的信息,可以是字典类型或者是一组二元的元组(元组的第一个元素为key,第二个元素为value)。
  • 其他参数一般我们不需要特意填写,后边实战时有需要我们再详细说明。

我们来看一个例子:

from urllib.parse import urlencode

data = {
    'name': 'oldq',
    'gender': 'male',
    'interest': 'basketball'
}
print(urlencode(data))

data = (('name', 'oldq'), ('gender', 'male'), ('interest', 'basketball'))
print(urlencode(data))

输出为:

name=oldq&gender=male&interest=basketball
name=oldq&gender=male&interest=basketball

可以看到,urlencode()方法实质上就是把key-value对转换成链接里常见的key=value的格式并以&符号连接,也就是生成query部分的内容。编码之后,这些参数就可以跟在?符号后边,与?之前的部分共同组成一个完整的携带参数的链接。

九、parse_qs()方法

parse_qs()方法和urlencode()方法属于一阴一阳,假设urlencode()是男,parse_qs()就是女,男女搭配,干活……

parse_qs()接受拼接好的query,并解析为字典。

from urllib.parse import parse_qs

query = 'name=oldq&gender=male&interest=basketball'
print(parse_qs(query))

输出为:

{'name': ['oldq'], 'gender': ['male'], 'interest': ['basketball']}

十、parse_qsl()方法

假设urlencode()是男,parse_qs()就是女,parse_qsl()就是女小三。男女女搭配,必有一战。

parse_qsl()接受拼接好的query,并解析为元组。

from urllib.parse import parse_qsl

query = 'name=oldq&gender=male&interest=basketball'
print(parse_qsl(query))

输出为:

[('name', 'oldq'), ('gender', 'male'), ('interest', 'basketball')]

好了,上述就是parse模块中最常用的一些方法,我们距离实战越来越近啦,有没有蠢蠢欲动?

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

量化祛魅官 老Q

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值