1 设置IP代理

1.1 方法论述

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

1.2 代码实现

import urllib.request  # 导入urllib.request模块
url= 'https://www.httpbin.org/get'   # 网络请求地址# 创建代理IP
proxy_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('http://www.52pojie.cn/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('https://www.python12.org/',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.1 urlparse()

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('https://www.baidu.com/doc/library/urllib.parse.html')
print(type(parse_result))    # 打印类型
print(parse_result)          # 打印拆分后的结果
### 也可以拆分打印
print(parse_result.scheme)          # 打印拆分后的结果
print(parse_result.netloc)          # 打印拆分后的结果
print(parse_result.path)          # 打印拆分后的结果
print(parse_result.params)          # 打印拆分后的结果
print(parse_result.query)          # 打印拆分后的结果
print(parse_result.fragment)          # 打印拆分后的结果

<class 'urllib.parse.ParseResult'>
ParseResult(scheme='https', netloc='www.baidu.com', path='/doc/library/urllib.parse.html', params='', query='', fragment='')
https
www.baidu.com
/doc/library/urllib.parse.html

3.2 urlsplit()

3.2.1 urlsplit()简介

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

3.2.2 urlsplit()代码实现

import urllib.parse    #导入urllib.parse模块
# 需要拆分的URL
url = 'https://www.baidu.com/doc/library/urllib.parse.html'
print(urllib.parse.urlsplit(url))     # 使用urlsplit()方法拆分URL
# 输出: SplitResult(scheme='https', netloc='www.baidu.com', path='/doc/library/urllib.parse.html', query='', fragment='')
print(urllib.parse.urlparse(url))     # 使用urlparse()方法拆分URL
# 输出:ParseResult(scheme='https', netloc='www.baidu.com', 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','baidu.org','/3/library/urllib.parse.html','','','']
tuple_url = ('https','baidu.org','/3/library/urllib.parse.html','','','')
dict_url = {'scheme':'https','netloc':'docs.baidu.org','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: https://baidu.org/3/library/urllib.parse.html
组合元组类型的URL: https://baidu.org/3/library/urllib.parse.html
组合字典类型的URL: https://docs.baidu.org/baidu/library/urllib.parse.html

4.2 urlunsplit()

import urllib.parse    #导入urllib.parse模块
list_url = ['https','docs.python.org','/3/library/urllib.parse.html','','']
tuple_url = ('https','docs.python.org','/3/library/urllib.parse.html','','')
dict_url = {'scheme':'https','netloc':'docs.python.org','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: https://docs.python.org/3/library/urllib.parse.html
组合元组类型的URL: https://docs.python.org/3/library/urllib.parse.html
组合字典类型的URL: https://docs.python.org/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 = 'https://tet.baidu.org'   # 定义基础链接
# 第二参数不完整时,合并返回
print(urllib.parse.urljoin(base_url,'3/library/urllib.parse.html'))
# 第二参数完成时,不合并直接返回第二参数的链接
print(urllib.parse.urljoin(base_url,'https://docs.tet.baidu.org/3/library/urllib.parse.html#url-parsing'))

输出:

https://tet.baidu.org/3/library/urllib.parse.html

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

6 URL的解码与编码

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

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

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

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

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

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

编码后的请求地址为: http://baidu.org/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 = 'http://httpbin.org/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连接相关推荐

  1. 爬虫实战学习笔记_6 网络请求request模块:基本请求方式+设置请求头+获取cookies+模拟登陆+会话请求+验证请求+上传文件+超时异常

    1 requests requests是Python中实现HTTP请求的一种方式,requests是第三方模块,该模块在实现HTTP请求时要比urlib.urllib3模块简化很多,操作更加人性化. ...

  2. 爬虫实战学习笔记_4 网络请求urllib3模块:发送GET/POST请求实例+上传文件+IP代理+json+二进制+超时

    1 urllib3模块简介 urllib3是一个第三方的网络请求模块(单独安装该模块),在功能上比Python自带的urllib强大. 1.1了解urllib3 urllib3库功能强大,条理清晰的用 ...

  3. 爬虫实战学习笔记_2 网络请求urllib模块+设置请求头+Cookie+模拟登陆

    1 urllib模块 1.1 urllib模块简介 Python3中将urib与urllib2模块的功能组合,并且命名为urllib.Python3中的urllib模块中包含多个功能的子模块,具体内容 ...

  4. 爬虫实战学习笔记_1 爬虫基础+HTTP原理

    1 爬虫简介 网络爬虫(又被称作网络蜘蛛.网络机器人,在某些社区中也经常被称为网页追逐者)可以按照指定的规则(网络爬虫的算法)自动浏览或抓取网络中的信息. 1.1 Web网页存在方式 表层网页指的是不 ...

  5. 爬虫实战学习笔记_7 【实战】模拟下载页面视频(模板)

    import requests # 导入requests模块 import re # 导入re模块 import os # 导入系统os模块# 实现发送网络请求,返回响应结果 def send_req ...

  6. TCP/IP网络编程 学习笔记_3 --给套接字分配IP地址和端口号

    IP地址和端口号 1,IP地址:为使计算机连接到网络并收发数据,必须为其分配IP地址.IP地址分为两类:IPv4(4字节地址族)和IPv6(16字节地址族).它们主要区别就是在表示IP地址所用的字节数 ...

  7. NS-3学习笔记(4)水声模块aqua-sim-ng模型及helper类内容解析

    aqua-sim-ng模块 官方给出的该模块的结构图如下: 可以看出从底向上,信道的实现包括: 传播模型, 噪声生成,多信道支持. 随后是水声模块的节点依附: NetDevice类.其余模块都依托该类 ...

  8. 爬虫(Spider)学习笔记

    title: Spider(蜘蛛)笔记 date: 2018-06-30 11:23:30 tags: Spider基础 作者:李忠林 Github: https://github.com/Leezh ...

  9. Linux性能优化实战学习笔记:第四十六讲=====实战分析

    Linux性能优化实战学习笔记:第四十六讲 一.上节回顾 不知不觉,我们已经学完了整个专栏的四大基础模块,即 CPU.内存.文件系统和磁盘 I/O.以及网络的性能分析和优化.相信你已经掌握了这些基础模 ...

最新文章

  1. etcd 笔记(06)— Client 结构定义、客户端(初始化、KV存储Get、Put、事务 Txn、压缩 Compact、Watch、Lease
  2. sklearn基于make_scorer函数构建自定义损失函数或者评估指标
  3. comsol分析时总位移代表什么_基于COMSOL的气动软体执行器仿真
  4. STM32工作笔记0022---STM32F1开发版 GPIO口工作原理
  5. JavaScript之Ajax-1 Ajax(Ajax原理、Ajax对象属性和方法)
  6. 解决 mcrypt.h not found
  7. 视觉平台搭建——光源选择
  8. SharePoint 2010-在ribbon上添加表单,将默认control加到自定义group中
  9. MYSQL 无重复插入数据更新语法 sql一句话使insert时若主键重复则更新
  10. iPhone设备字体详解
  11. FunCode太空战机C++实现
  12. python对接INVEST和ARCGIS
  13. 示波器学习笔记(2)——模拟示波器
  14. android studio无法连接小米手机问题解决
  15. WXPY自动转发群消息
  16. leaflet地图原理_leaflet绘制区域(仿高德地图效果)
  17. 淘宝官方商品详情接口
  18. 当ivms平台无法登录以及服务状态显示未注册的处理办法
  19. 聊天也是技术活:内向性格社交宝典-摘抄
  20. Arduino录音时间延长_如何用arduino设计出可以语音播报的数字时钟

热门文章

  1. 后端DTO(数据传输对象)与DAO(数据库数据源对象)解耦的好处
  2. Diango博客--6.Markdown 文章自动生成目录
  3. 深度学习之RetinaNet
  4. linux 进程通信机制,linux的进程通信机制小结
  5. scrapyd部署_如何通过 Scrapyd + ScrapydWeb 简单高效地部署和监控分布式爬虫项目
  6. java后期发展方向_Java程序员的4个职业发展方向,该如何把握黄金5年?
  7. HyperLogLog原理与在Redis中的使用
  8. yii2 ajax分页,Yii框架分页技术实例分析
  9. oracle中pga指什么,oracle学习SGA跟PGA理解
  10. ES6 数组、对象的扩展