300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > 爬虫实战学习笔记_3 网络请求urllib模块:设置IP代理+处理请求异常+解析URL+解码+编

爬虫实战学习笔记_3 网络请求urllib模块:设置IP代理+处理请求异常+解析URL+解码+编

时间:2022-12-28 14:54:26

相关推荐

爬虫实战学习笔记_3 网络请求urllib模块:设置IP代理+处理请求异常+解析URL+解码+编

1 设置IP代理

1.1 方法论述

使用urllib模块设置代理IP是比较简单的,首先需要创建ProxyHandler对象,其参数为字典类型的代理IP,键名为协议类型(如HTTP或者HTTPS),值为代理链接。然后利用ProxyHandler对象与buildopener()方法构建一个新的opener对象,最后再发送网络请求即可。

1.2 代码实现

import urllib.request # 导入urllib.request模块url= '/get' # 网络请求地址# 创建代理IPproxy_handler = urllib.request.ProxyHandler({'https':'58.220.95.114:10053'})# 创建opener对象opener = urllib.request.build_opener(proxy_handler)response = opener.open(url,timeout=2) # 发送网络请求print(response.read().decode('utf-8')) # 打印返回内容

2 处理请求异常

在实现网络请求时,可能会出现很多异常错误,ulib模块中的urllib.error模块包含了URLError与HTTPError两个比较重要的异常类。

2.1 处理URLError异常

URLError类中reason属性,可以反馈异常的原因

2.1.1 向不存在的地址发送请求

import urllib.request # 导入urllib.request模块import urllib.error# 导入urllib.error模块try:# 向不存在的网络地址发送请求response = urllib.request.urlopen('/4040.html')except urllib.error.URLError as error: # 捕获异常信息print(error.reason)# 打印异常原因print(error.code) # 打印HTTP状态码print(error.header) # 返回请求头

2.1.2 双重异常捕获

import urllib.request # 导入urllib.request模块import urllib.error# 导入urllib.error模块try:# 向不存在的网络地址发送请求response = urllib.request.urlopen('/',timeout=0.1)except urllib.error.HTTPError as error: # HTTPError捕获异常信息print('状态码为:',error.code) # 打印状态码print('HTTPError异常信息为:',error.reason) # 打印异常原因print('请求头信息如下:\n',error.headers) # 打印请求头except urllib.error.URLError as error:# URLError捕获异常信息print('URLError异常信息为:',error.reason)# 输出 URLError异常信息为: [Errno 11001] getaddrinfo failed

3 解析URL

urllib模块中提供了parse子模块,主要用于解析URL,可以实现URL的拆分或者是组合。它支持多种协议的URL处理。

3.1urlparse()

3.1.1 urlparse()简介

urlparse()用于将URL分解成不同部分

3.1.2 urlparse()函数构成

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

urlstring:需要拆分的URL,该参数为必选参数。scheme:可选参数,表示需要设置的默认协议。如果需要拆分的URL中没有协议,可以通过该参数设置一个默认的协议,该参数的默认值为空字符串。allow_fragments:可选参数,如果该参数设置为False,表示忽略fragment这部分内容,默认为Tnue。

3.1.3 使用urlparse()分解URL

import urllib.parse #导入urllib.parse模块parse_result = urllib.parse.urlparse('/doc/library/urllib.parse.html')print(type(parse_result)) # 打印类型print(parse_result)# 打印拆分后的结果### 也可以拆分打印print(parse_result.scheme)# 打印拆分后的结果print(loc)# 打印拆分后的结果print(parse_result.path)# 打印拆分后的结果print(parse_result.params)# 打印拆分后的结果print(parse_result.query)# 打印拆分后的结果print(parse_result.fragment)# 打印拆分后的结果

<class 'urllib.parse.ParseResult'>

ParseResult(scheme='https', netloc='', path='/doc/library/urllib.parse.html', params='', query='', fragment='')

https

/doc/library/urllib.parse.html

3.2urlsplit()

3.2.1urlsplit()简介

使用urlsplit()方法与urlparse()方法类似,可以实现URL的拆分,只是urlsplit()方法不再单独拆分params这部分内容,而是将params合并到path中,所以返回的结果中只有5部分内容,并且运数据类型为SplitResult。示例代码如下,

3.2.2urlsplit()代码实现

import urllib.parse #导入urllib.parse模块# 需要拆分的URLurl = '/doc/library/urllib.parse.html'print(urllib.parse.urlsplit(url))# 使用urlsplit()方法拆分URL# 输出: SplitResult(scheme='https', netloc='', path='/doc/library/urllib.parse.html', query='', fragment='')print(urllib.parse.urlparse(url))# 使用urlparse()方法拆分URL# 输出:ParseResult(scheme='https', netloc='', path='/doc/library/urllib.parse.html', params='', query='', fragment='')

4 组合URL

4.1 urlunparse()

使用urlunpare()方法组合URL时,需要注意可迭代参数中的元素必须是6个

import urllib.parse #导入urllib.parse模块list_url = ['https','','/3/library/urllib.parse.html','','','']tuple_url = ('https','','/3/library/urllib.parse.html','','','')dict_url = {'scheme':'https','netloc':'','path':'/baidu/library/urllib.parse.html','params':'','query':'','fragment':''}print('组合列表类型的URL:',urllib.parse.urlunparse(list_url))print('组合元组类型的URL:',urllib.parse.urlunparse(tuple_url))print('组合字典类型的URL:',urllib.parse.urlunparse(dict_url.values()))

输出:

组合列表类型的URL: /3/library/urllib.parse.html

组合元组类型的URL: /3/library/urllib.parse.html

组合字典类型的URL: /baidu/library/urllib.parse.html

4.2 urlunsplit()

import urllib.parse #导入urllib.parse模块list_url = ['https','','/3/library/urllib.parse.html','','']tuple_url = ('https','','/3/library/urllib.parse.html','','')dict_url = {'scheme':'https','netloc':'','path':'/3/library/urllib.parse.html','query':'','fragment':''}print('组合列表类型的URL:',urllib.parse.urlunsplit(list_url))print('组合元组类型的URL:',urllib.parse.urlunsplit(tuple_url))print('组合字典类型的URL:',urllib.parse.urlunsplit(dict_url.values()))

输出:

组合列表类型的URL: /3/library/urllib.parse.html

组合元组类型的URL: /3/library/urllib.parse.html

组合字典类型的URL: /3/library/urllib.parse.html

5 URL的连接urllib.parse.urljoin()

5.1函数原型

urllib.parse.urljoin(base,url,allow_fragments = True)

base:表示基础链接url:表示新的链接allow_fragments:可选择参数,默认为True

5.2 使用urllib.parse.urljoin()实例

import urllib.parse #导入urllib.parse模块base_url = '' # 定义基础链接# 第二参数不完整时,合并返回print(urllib.parse.urljoin(base_url,'3/library/urllib.parse.html'))# 第二参数完成时,不合并直接返回第二参数的链接print(urllib.parse.urljoin(base_url,'https://docs./3/library/urllib.parse.html#url-parsing'))

输出:

/3/library/urllib.parse.html

https://docs./3/library/urllib.parse.html#url-parsing

6 URL的解码与编码

quote()方法与urlencode()方法所实现的功能类似,但是urlencode()方法中只接收字典类型的参数,quote()方法则可以将一个字符串进行编码。

6.1 使用urlcode()方法编码请求参数

import urllib.parse #导入urllib.parse模块base_url = '/get?' # 定义基础链接params = {'name':'Jack','country':'中国','age':30} # 定义字典类型的请求参数url = base_url+urllib.parse.urlencode(params) # 连接请求地址print('编码后的请求地址为:',url)

编码后的请求地址为: /get?name=Jack&country=%E4%B8%AD%E5%9B%BD&age=30

6.2 使用quote()方法编码字符串参数

import urllib.parse #导入urllib.parse模块base_url = '/get?country=' # 定义基础链接url = base_url+urllib.parse.quote('中国') # 字符串编码print('编码后的请求地址为:',url)

编码后的请求地址为: /get?country=%E4%B8%AD%E5%9B%BD

7 解码

7.1 代码1

import urllib.parse #导入urllib.parse模块u = urllib.parse.urlencode({'country':'中国'}) # 使用urlencode编码q=urllib.parse.quote('country=中国') # 使用quote编码print('urlencode编码后结果为:',u)print('quote编码后结果为:',q)print('对urlencode解码:',urllib.parse.unquote(u))print('对quote解码:',urllib.parse.unquote(q))

7.2 代码2

import urllib.parse #导入urllib.parse模块# 定义一个请求地址url = '/get?name=Jack&country=%E4%B8%AD%E5%9B%BD&age=30'q = urllib.parse.urlsplit(url).query # 获取需要的参数q_dict = urllib.parse.parse_qs(q)# 将参数转换为字典类型的数据print('数据类型为:',type(q_dict))print('转换后的数据:',q_dict)

7.3 代码3

import urllib.parse #导入urllib.parse模块str_params = 'name=Jack&country=%E4%B8%AD%E5%9B%BD&age=30' # 字符串参数list_params = urllib.parse.parse_qsl(str_params) # 将字符串参数转为元组所组成的列表print('数据类型为:',type(list_params))print('转换后的数据:',list_params)

爬虫实战学习笔记_3 网络请求urllib模块:设置IP代理+处理请求异常+解析URL+解码+编码+组合URL+URL连接

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。