爬虫------urllib的工具模块和异常模块

url由哪些组成

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
锚点是指定位到网页的哪一个部分

urlparse()实现URL的识别和分段

举个例子:解析
https://book.qidian.com/info/1004608738?wd=123&page=20#Catalog


	url = 'https://book.qidian.com/info/1004608738?wd=123&page=20#Catalog'
"""
url:待解析的url
scheme='':假如解析的url没有协议,可以设置默认的协议,如果url有协议,设置此参数无效
allow_fragments=True:是否忽略锚点,默认为True表示不忽略,为False表示忽略
"""
result = parse.urlparse(url=url,scheme='http',allow_fragments=True)
print(result)
print(result.scheme)#把协议拿出来
print(result.fragment)#把锚点点出来

urlunparse()可以实现URL的构造

和上面正好相反

import urllib.parse
u = ('https', 'book.qidian.com','/info/1004608738','', 'wd=123&page=20', 'Catalog')#这个里面解析出来是什么就传什么,空字符串也要传,否则会报错
#把这个分离出来的url合起来
result = urllib.parse.urlunparse(u)
print(result)

在这里插入图片描述

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

base_url = 'https://book.qidian.com/info/1004608738?wd=123&page=20#Catalog'
sub_url = '/info/100861102'
full_url = parse.urljoin(base_url,sub_url)
print(full_url)

在这里插入图片描述
替换,把info后面的替换了

parse_qs()将url编码格式的参数反序列化为字典类型

parmas_str = 'page=20&wd=123'
parmas = urllib.parse_qs(parmas_str)
print(parmas)
"""
{'page': ['20'], 'wd': ['123']}
"""

在这里插入图片描述

quote()可以将中文转换为URL编码格式

word = '中国梦'
url = 'http://www.baidu.com/s?wd='+urllib.parse.quote(word)
print(url)
"""
运行结果:
http://www.baidu.com/s?wd=%E4%B8%AD%E5%9B%BD%E6%A2%A6
"""

unquote:可以将URL编码进行解码

url = 'http://www.baidu.com/s?wd=%E4%B8%AD%E5%9B%BD%E6%A2%A6'
print(urllib.parse.unquote(url))
"""
http://www.baidu.com/s?wd=中国梦
"""

异常模块

URLError

来自urllib库的error模块,继承自OSError,由request模块产生的异常都可以通过捕捉这个类来处理.

  • 没有网络连接
  • 服务器连接失败
  • 找不到指定的服务器

HTTPError

HTTPError是URLError的子类,我们发出一个请求时,服务器上都会对应一个response应答对象,其中它包含一个数字"响应状态码"。

专门用来处理HTTP请求错误,比如未认证,页面不存在等

  • 有三个属性:

    • code:返回HTTP的状态码

    • reason:返回错误原因

    • headers:返回请求头

import urllib.request
from urllib.error import HTTPError,URLError
import ssl

ssl._create_default_https_context = ssl._create_unverified_context
def check_error():
    """
    因为HTTPError的父类是URLError,所以我们更好的处理顺序应该是
    先捕获子类的错误,再捕获父类的错误
    """
    req_url = 'https://www.baiduxxx.com/'
    try:
        response = urllib.request.urlopen(url=req_url)
        print(response.status)
    except HTTPError as err:
        print(err.code,err.reason,err.headers)
    except error.URLError as err:
        print('===', err.reason)
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值