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进行还原。
示例:
* * * * *
from urllib import parsestring = '%E7%88%AC%E8%99%AB’result = parse.unquote(string)print(result)
执行结果:
*
爬虫
**五、urllib.robotparser模块**
(在网络爬虫中基本不会用到,使用较少,仅作了解)
urllib.robotparser 用于解析 robots.txt 文件。
robots.txt(统一小写)是一种存放于网站根目录下的 robots 协议,它通常用于告诉搜索引擎对网站的抓取规则。
Robots协议也称作爬虫协议,机器人协议,网络爬虫排除协议,用来告诉爬虫哪些页面是可以爬取的,哪些页面是不可爬取的。它通常是一个robots.txt的文本文件,一般放在网站的根目录上。
文末有福利领取哦~
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
👉**一、Python所有方向的学习路线**
Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。![img](https://img-blog.csdnimg.cn/c67c0f87cf9343879a1278dfb067f802.png)
👉**二、Python必备开发工具**
![img](https://img-blog.csdnimg.cn/757ca3f717df4825b7d90a11cad93bc7.png)
👉**三、Python视频合集**
观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
![img](https://img-blog.csdnimg.cn/31066dd7f1d245159f21623d9efafa68.png)
👉 **四、实战案例**
光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。**(文末领读者福利)**
![img](https://img-blog.csdnimg.cn/e78afb3dcb8e4da3bae5b6ffb9c07ec7.png)
👉**五、Python练习题**
检查学习结果。
![img](https://img-blog.csdnimg.cn/280da06969e54cf180f4904270636b8e.png)
👉**六、面试资料**
我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
![img](https://img-blog.csdnimg.cn/a9d7c35e6919437a988883d84dcc5e58.png)
![img](https://img-blog.csdnimg.cn/5db8141418d544d3a8e9da4805b1a3f9.png)
👉因篇幅有限,仅展示部分资料,这份完整版的Python全套学习资料已经上传
**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**[需要这份系统化学习资料的朋友,可以戳这里无偿获取](https://bbs.csdn.net/topics/618317507)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**