Python 爬虫之urllib库,及urllib库的4个模块的基本了解和使用

示例:
from urllib import requestfrom urllib import errorif __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 errorif __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 转码
1、URL 解析
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 urlparseo = 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: httpsnetloc: docs.python.orgpath: /zh-cn/3/library/urllib.parse.htmlparams:query:fragment: module-urllib.parsehostname: docs.python.org
以上还可以通过索引获取,如通过
print(o[0])...print(o[5])
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
1.3 urlsplit()
urlsplit() 函数也能对 URL 进行拆分,所不同的是, urlsplit() 并不会把 路径参数(params) 从 路径(path) 中分离出来 。
当 URL 中路径部分包含多个参数时 , 使用 urlparse() 解析是有问题的,这时可以使用 urlsplit() 来解析.
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
1.5 urljoin()
同样可以构造URL 。
传递一个基础链接,根据基础链接可以将某一个不完整的链接拼接为一个完整链接.
注:连接两个参数的url, 将第二个参数中缺的部分用第一个参数的补齐,如果第二个有完整的路径 , 则以第二个为主 。
2、URL 转码
python中提供urllib.parse模块用来编码和解码,分别是urlencode()与unquote() 。
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 parseurl = "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
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
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的文本文件,一般放在网站的根目录上 。
当爬虫访问一个站点的时候,会首先检查这个站点目录是否存在robots.txt文件,如果存在静态网页的爬取思路,搜索爬虫会根据其中定义的爬取范围进行爬取 。如果没有找到这个文件,搜索爬虫会访问所有可直接访问的页面 。
urllib.robotparser 提供了 RobotFileParser 类静态网页的爬取思路,语法如下:
class urllib.robotparser.RobotFileParser(url='')
这个类提供了一些可以读取、解析 robots.txt 文件的方法:
【Python 爬虫之urllib库,及urllib库的4个模块的基本了解和使用】本文到此结束,希望对大家有所帮助!

猜你喜欢