Python爬虫库urllib使用详解_python使用 urllib

1. URLError 示例


from urllib import requestfrom urllib import error
if __name__ == "__main__":    #一个不存在的连接    url = "http://www.baiiiduuuu.com/"    req = request.Request(url)    try:        response = request.urlopen(req)        html = response.read().decode('utf-8')        print(html)    except error.URLError as e:        print(e.reason)

返回结果:

[Errno -2] Name or service not known

reason:

此错误的原因。它可以是一个消息字符串或另一个异常实例。

2. HTTPError示例


from urllib import requestfrom urllib import error
if __name__ == "__main__":    #网站服务器上不存在资源    url = "http://www.baidu.com/no.html"    req = request.Request(url)    try:        response = request.urlopen(req)        html = response.read().decode('utf-8')        print(html)    except error.HTTPError as e:        print(e.code)

返回结果:

404

code

一个 HTTP 状态码,具体定义见 RFC 2616。这个数字的值对应于存放在

http.server.BaseHTTPRequestHandler.responses 代码字典中的某个值。

reason

这通常是一个解释本次错误原因的字符串。

headers

导致 HTTPError 的特定 HTTP 请求的 HTTP 响应头。

3. URLError和HTTPError混合使用

注意:由于HTTPError是URLError的子类,所以捕获的时候HTTPError要放在URLError的上面。

示例:


from urllib import requestfrom urllib import error
if __name__ == "__main__":    #网站服务器上不存在资源    url = "http://www.baidu.com/no.html"    req = request.Request(url)    try:        response = request.urlopen(req) #       html = response.read().decode('utf-8')    except error.HTTPError as e:        print(e.code)    except error.URLError as e:        print(e.code)

如果不用上面的方法,可以直接用判断的形式。


from urllib import requestfrom urllib import error
if __name__ == "__main__":    #网站服务器上不存在资源    url = "http://www.baidu.com/no.html"    req = request.Request(url)    try:        response = request.urlopen(req) #       html = response.read().decode('utf-8')    except error.URLError as e:        if hasattr(e, 'code'):            print("HTTPError")            print(e.code)        elif hasattr(e, 'reason'):            print("URLError")            print(e.reason)

执行结果:

HTTPError404

四、urllib.parse模块

模块定义的函数可分为两个主要门类: URL 解析和 URL 转码。

4.1 URL 解析

4.1.1 urlparse()

urllib.parse 用于解析 URL,格式如下:

urllib.parse.urlparse(urlstring, scheme='', allow_fragments=True)

urlstring 为 字符串的 url 地址,scheme 为协议类型。

allow_fragments 参数为 false,则无法识别片段标识符。相反,它们被解析为路径,参数或查询组件的一部分,并 fragment 在返回值中设置为空字符串。

标准链接格式为:

scheme://netloc/path;params?query#fragment

对象中包含了六个元素,分别为:协议(scheme)、域名(netloc)、路径(path)、路径参数(params)、查询参数(query)、片段(fragment)。

示例:


from urllib.parse import urlparse
o = urlparse("https://docs.python.org/zh-cn/3/library/urllib.parse.html#module-urllib.parse")
print('scheme  :', o.scheme)print('netloc  :', o.netloc)print('path    :', o.path)print('params  :', o.params)print('query   :', o.query)print('fragment:', o.fragment)print('hostname:', o.hostname)

执行结果:

scheme  : https                                                                                                                                                                                          netloc  : docs.python.org                                                       path    : /zh-cn/3/library/urllib.parse.html                                    params  :                                                                       query   :                                                                       fragment: module-urllib.parse                                                   hostname: docs.python.org

以上还可以通过索引获取,如通过​​​​​​​

print(o[0])...print(o[5])

4.1.2 urlunparse()

urlunparse()可以实现URL的构造。(构造URL)

urlunparse()接收一个是一个长度为6的可迭代对象,将URL的多个部分组合为一个URL。若可迭代对象长度不等于6,则抛出异常。

示例:​​​​​​​

from urllib.parse import urlunparseurl_compos = ['http','www.baidu.com','index.html','user= test','a=6','comment']print(urlunparse(url_compos))

结果:

http://www.baidu.com/index.html;user= test?a=6#comment

4.1.3 urlsplit()

urlsplit() 函数也能对 URL 进行拆分,所不同的是, urlsplit() 并不会把 路径参数(params) 从 路径(path) 中分离出来。

当 URL 中路径部分包含多个参数时,使用 urlparse() 解析是有问题的,这时可以使用 urlsplit() 来解析.

4.1.4 urlsplit()

urlunsplit()与 urlunparse()类似,(构造URL),传入对象必须是可迭代对象,且长度必须是5。

示例:


from urllib.parse import urlunspliturl_compos = ['http','www.baidu.com','index.html','user= test','a = 2']print(urlunsplit(url_compos))urlunsplit()

结果:

http://www.baidu.com/index.html?user= test#a = 2

4.1.5 urljoin()

同样可以构造URL。

传递一个基础链接,根据基础链接可以将某一个不完整的链接拼接为一个完整链接.

注:连接两个参数的url, 将第二个参数中缺的部分用第一个参数的补齐,如果第二个有完整的路径,则以第二个为主。

4.2 URL 转码

python中提供urllib.parse模块用来编码和解码,分别是urlencode()与unquote()。

4.2.1 编码quote(string)

URL 转码函数的功能是接收程序数据并通过对特殊字符进行转码并正确编码非 ASCII 文本来将其转为可以安全地用作 URL 组成部分的形式。它们还支持逆转此操作以便从作为 URL 组成部分的内容中重建原始数据,如果上述的 URL 解析函数还未覆盖此功能的话

语法:

urllib.parse.quote(string, safe='/', encoding=None, errors=None)

使用 %xx 转义符替换 string 中的特殊字符。字母、数字和 ‘_.-~’ 等字符一定不会被转码。在默认情况下,此函数只对 URL 的路径部分进行转码。可选的 safe 形参额外指定不应被转码的 ASCII 字符 — 其默认值为 ‘/’。

string 可以是 str 或 bytes 对象。

示例:

​​​​​​​

from urllib import parse
url = "http://www.baidu.com/s?wd={}"words = "爬虫"
#quote()只能对字符串进行编码query_string = parse.quote(words)url = url.format(query_string)print(url)

执行结果:

http://www.baidu.com/s?wd=%E7%88%AC%E8%99%AB

4.2.2 编码urlencode()

quote()只能对字符串编码,而urlencode()可以对查询字符串进行编码。


# 导入parse模块from urllib import parse
#调用parse模块的urlencode()进行编码query_string = {'wd':'爬虫'}result = parse.urlencode(query_string)
# format函数格式化字符串,进行url拼接url = 'http://www.baidu.com/s?{}'.format(result)print(url)

结果:

http://www.baidu.com/s?wd=%E7%88%AC%E8%99%AB

4.2.3 解码unquote(string)

解码就是对编码后的url进行还原。

最后

🍅 硬核资料:关注即可领取PPT模板、简历模板、行业经典书籍PDF。
🍅 技术互助:技术群大佬指点迷津,你的问题可能不是问题,求资源在群里喊一声。
🍅 面试题库:由技术群里的小伙伴们共同投稿,热乎的大厂面试真题,持续更新中。
🍅 知识体系:含编程语言、算法、大数据生态圈组件(Mysql、Hive、Spark、Flink)、数据仓库、Python、前端等等。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里无偿获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值