Python3爬虫从零开始:urllib库的使用(二)

URLError

来自urllib库的error模块,需要imort error

实例1:当运行一个不存在的页面,如果没有异常处理,直接

from urllib import request,error

request.urlopen('https://cuiqingcai.com/index.htm')

则会报错:

实例2::加上异常处理机制

from urllib import request,error

try:

    response = request.urlopen('https://cuiqingcai.com/index.htm')

except error.URLError as e:

    print(e.reason)

结果如下:

通过如上操作,可以避免程序异常终止。

HTTPError

它是URLError子类,专门用来处理HTTP请求错误。有如下3个属性:

  • code:返回HTTP状态码
  • reason:返回错误原因
  • headers:返回请求头

实例3:

from urllib import request,error

try:

    response = request.urlopen('https://cuiqingcai.com/index.htm')

except error.HTTPError as e:

    print(e.reason,e.code,e.headers,sep='\n')

结果:

补充:

因为URLError是HTTPError的父类,所以更好的写法是先捕获子类的错误,再去补充父类的错误(即先特殊,后一般)。

写法如下:

from urllib import request,error

try:

    response = request.urlopen('https://cuiqingcai.com/index.htm')

except error.HTTPError as e:

    print(e.reason,e.code,e.headers,sep='\n')

except error.URLError as e:

    print(e.reason)

else:

    print('Request Successfully')

urllib库里提供了parse模块,定义了处理URL的标准接口,例如实现URL各部分的抽取、合并以及链接转换。下面是该模块常用的方法:

urlparse()

实例4:

from urllib.parse import urlparse

result = urlparse('http://www.baidu.com/index.html;user?id=5#comment')

print(type(result),result)

输出:

可以看到,urlparse()方法将其拆分为6个部分:

  • scheme:协议
  • netloc:域名
  • path:路径
  • params:参数
  • query:位于?后面,查询条件,一般用于GET类型的URL
  • fragment:位于#后面,锚点,用于直接定位页面内部的下拉位置

urljoin()

生成链接,基础链接作为第一个参数,新链接作为第二个参数。该方法分析基础链接的scheme、netloc和path这3个部分内容并对新链接缺失部分进行补充(不缺失则不处理)。

其他链接方法还有:urlunparse()和urlunsplit()。

实例5:

from urllib.parse import urljoin

print(urljoin('http://www.baidu.com','FAQ.html'))

print(urljoin('http://www.baidu.com','https://cuiqingcai.com/FAQ.html'))

结果:

urlencode() & parse_qs &parse_qsl

实例6:

from urllib.parse import urlencode,parse_qs,parse_qsl

param = {

    'name':'germey',

    'age': 22

}

base_url = 'http://www.baidu.com?'

param1 = urlencode(param) #序列化

print(param1)

url = base_url + param1

print(url)

print(parse_qs(param1)) #对应的反序列方法,转回字典

print(parse_qsl(param1)) #另一个反序列方法,转回元组

结果:

impr

首先用字典将参数表示出来,然后用urlencode()方法对其进行序列化。

quote() & unquote

该方法用于内容和URL编码格式互相转换。

实例7:

from urllib.parse import quote,unquote

keyword = '壁纸'

Q_keyword = quote(keyword)

print(Q_keyword)

url = 'https://www.baidu.com/s?wd='+ Q_keyword

print(url)

UQ_keyword = unquote(Q_keyword)

print(UQ_keyword)

结果:

猜你喜欢

转载自blog.csdn.net/qq_26736193/article/details/83099374
今日推荐