Python爬虫之urllib基础用法教程


Posted in Python onOctober 12, 2019

综述

本系列文档用于对Python爬虫技术进行简单的教程讲解,巩固自己技术知识的同时,万一一不小心又正好对你有用那就更好了。

Python 版本是3.7.4

urllib库介绍

它是 Python 内置的HTTP请求库,也就是说我们不需要额外安装即可使用,它包含四个模块(主要对前三个模块进行学习):

  • request : 它是最基本的 HTTP 请求模块,我们可以用它来模拟发送一请求,就像在浏览器里输入网址然后敲击回车一样,只需要给库方法传入 URL 还有额外的参数,就可以模拟实现这个过程了。
  • error : 异常处理模块,如果出现请求错误,我们可以捕获这些异常,然后进行重试或其他操作保证程序不会意外终止。
  • parse : 用于解析URL,提供了许多URL处理方法,比如拆分、解析、合并等等的方法,以及对参数的拼接等待。
  • robotparser : 主要是用来识别网站的robots.txt协议文件,然后判断网站的那些数据可以爬,哪些数据不可以爬的,其实用的比较少。

urllib.request 介绍

urlopen()

1.参数说明(仅写了四个最常用的参数)

url : 爬取目标的URL;
data : 请求参数,如果设置该参数,则请求默认为post请求;没有默认为get请求;
timeout : 用于设置超时时间,单位为秒;
context : 必须是一个ssl.SSLContext类型,用来指定SSL设置,忽略未认证的CA证书;

2.具体用法

GET 请求方式

# 导入urllib库
import urllib.request
 
 # 向指定的url发送请求,并返回服务器响应的类文件对象
 url = "http://www.baidu.com"
 response = urllib.request.urlopen(url=url)
 print(type(response))
 
 # 类文件对象支持文件对象的操作方法,如read()方法读取文件全部内容,返回字符串
 html = response.read()
 # html = response.readline() # 读取一行
 # html = response.readlines() # 读取多行,返回列表
 # 打印响应结果(byte类型)
 print(html)
 # 打印响应结果(utf-8类型)
 # 二进制和字符串之间的相互转码使用 encode() 和 decode() 函数
 # encode() 和 decode() 可带参数,不写默认utf-8,其他不再特别说明
 print(html.decode())
 # 打印状态码
 # print(response.get_code())
 print(response.status)
 # 获取响应头
 print(response.getheaders())
 # 获取响应头Server信息
 print(response.getheader('Server'))
 # 获取响应结果原因
 print(response.reason)

POST 请求方式

# 导入urllib库
import urllib.parse
import urllib.request
 
 # 向指定的url发送请求,并返回
 post_url = 'https://fanyi.baidu.com/sug'
 # 传入参数
 form_data = {
 'kw': 'honey'
 }
 # 格式化参数
 form_data = urllib.parse.urlencode(form_data).encode()
 
 response = urllib.request.urlopen(url=post_url, data=form_data)
 # 打印服务器响应的类文件对象
 print(type(response))
 
 # 类文件对象支持文件对象的操作方法,如read()方法读取文件全部内容,返回字符串
 html = response.read()
 # 打印响应结果(byte类型)
 print(html)
 # 打印响应结果(utf-8类型)
 print(html.decode())
 # 打印状态码
 print(response.status)
 # print(response.getcode())
 # 获取响应头
 print(response.getheaders())
 # 获取响应头Server信息
 print(response.getheader('Server'))
 # 获取响应结果原因
 print(response.reason)

urlretrleve()

1.参数说明

url : 下载链接地址;
filename : 指定保存本地路径(如果参数未指定,urllib会生成一个临时文件保存数据);
reporthook : 是一个回调函数,当连接上服务器、以及相应的数据块传输完毕时会触发该回调,我们可以利用这个回调函数来显示当前的下载进度;
data : 指post导服务器的数据,该方法返回一个包含两个元素的(filename, headers) 元组,filename 表示保存到本地的路径,header表示服务器的响应头;

2.具体用法

# 引入所需要的库
import os
import urllib.request
 
 
 # 定义回调函数
 def call_back(a, b, c):
 """
 图片下载回调
 :param a: 已经下载的数据块
 :param b: 数据块的大小
 :param c: 远程文件的大小
 :return: 
 """
 per = 100.0 * a * b / c
 if per > 100:
 per = 100
 print('%.2f%%' % per)
 
 
 # 定义下下载的地址
 url = 'http://www.baidu.com'
 # 构造文件保存路径
 path = os.path.abspath('.')
 file_path = os.path.join(path, 'baidu.html')
 # 进行下载
 urllib.request.urlretrieve(url, file_path, call_back)

urllib.parse 介绍

urlencode()

1.参数说明

query : url参数,可以是字符串,也可以是字典;
encoding : 编码方式;

2.具体用法

# 引入所需要的库
import urllib.parse
# 参数数据
 data = {
 'name': '张三',
 'age': 26
 }
 # 进行编码
 ret = urllib.parse.urlencode(data)
 print(ret)

parse_s()

1.参数说明

qs : url参数,编码后的字符串;
encoding : 字符方式;

2.具体用法

# 引入所需要的库
import urllib.parse
# 参数数据
data = {
 'name': '张三',
 'age': 26
 }
 # 进行编码
 ret1 = urllib.parse.urlencode(data)
 print(ret1)
 # 进行解码
 ret2 = urllib.parse.parse_qs(ret1)
 print(ret2)

urlparse()

1.参数说明

url : url地址字符串;

2.具体用法

# 引入所需要的库
import urllib.parse
# 声明url
 url = "https://www.baidu.com/s?wd=urlparse&rsv_spt=1&rsv_iqid=0x921f00fe005646ef&issp=1&f=8"
 # 进行url解析
 ret = urllib.parse.urlparse(url)
 print(ret)
 print('scheme:', ret.scheme) # 协议
 print('netloc:', ret.netloc) # 域名服务器
 print('path:', ret.path) # 相对路径
 print('params:', ret.params) # 路径端参数
 print('fragment:', ret.fragment) # 片段
 print('query:', ret.query) # 查询
 
 # urlunparse() 与 urlparse() 对应相反函数
 # 使用urlparse的格式组合成一个url,可以直接将urlparse的返回传递组合
 ret1 = urllib.parse.urlunparse(ret)
 print(ret1)

urlsplit()

1.参数说明

url : url地址字符串;

2.具体用法

# 引入所需要的库
import urllib.parse
# 声明url
 url = "https://www.baidu.com/s?wd=urlparse&rsv_spt=1&rsv_iqid=0x921f00fe005646ef&issp=1&f=8"
 # 进行url解析
 ret = urllib.parse.urlsplit(url)
 print(ret)
 print('scheme:', ret.scheme) # 协议
 print('netloc:', ret.netloc) # 域名服务器
 print('path:', ret.path) # 相对路径
 print('fragment:', ret.fragment) # 片段
 print('query:', ret.query) # 查询
 
 # urlunsplit() 与 urlsplit() 对应相反函数
 # 使用urlsplit的格式组合成一个url,可以直接将urlsplit的返回传递组合
 ret1 = urllib.parse.urlunsplit(ret)
 print(ret1)
 
 # 此函数和urlparse函数的区别在于此函数没有params

urljoin()

1.参数说明

qs : url参数,编码后的字符串;
encoding : 字符方式;

2.具体用法

# 引入所需要的库
import urllib.parse
 
 # 声明url
 url = "https://www.baidu.com/"
 # 参数数据
 data = {
 'name': '张三',
 'age': 26
 }
 # 格式化参数
 data = urllib.parse.urlencode(data)
 # 进行url拼接
 ret = urllib.parse.urljoin(url, data)
 print(ret)

urllib.error 介绍

我们在爬虫的时候发请求的时候难免出现错误,如访问不到服务器或者访问被禁止等等,error分为URLError和HTTPError两类:

1.URLError

没有网
服务器链接失败
找不大指定服务器

2.HTTPError

是URLError的子类

3.两者区别和联系

1).URLError封装的错误信息一般是由网络引起的,包括url错误
2).HTTPError封装的错误信息一般是服务器返回了错误状态码
3).URLError是OSERROR的子类,HTTPError是URLError的子类
4).【注意】两个同时捕获的时候需要将子类放在上面,父类放在下面

用法

# 引入所需要的库
import urllib.error
import urllib.request
 
 # 一个访问异常的url
 url = 'https://www.mz.com/156427/100'
 # 捕获异常
 try:
 ret = urllib.request.urlopen(url)
 print(ret)
 except urllib.error.HTTPError as e:
 print(e.getcode())
 except urllib.error.URLError as e:
 print(e)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
用Python实现一个简单的多线程TCP服务器的教程
May 05 Python
Python计算三角函数之asin()方法的使用
May 15 Python
详解Python异常处理中的Finally else的功能
Dec 29 Python
Python日期时间对象转换为字符串的实例
Jun 22 Python
详解如何在Apache中运行Python WSGI应用
Jan 02 Python
Python数据可视化实现正态分布(高斯分布)
Aug 21 Python
Python通过VGG16模型实现图像风格转换操作详解
Jan 16 Python
Python中zip()函数的解释和可视化(实例详解)
Feb 16 Python
Python爬虫与反爬虫大战
Jul 30 Python
Python 整行读取文本方法并去掉readlines换行\n操作
Sep 03 Python
Python Django搭建文件下载服务器的实现
May 10 Python
Python&Matlab实现樱花的绘制
Apr 07 Python
python 生成器和迭代器的原理解析
Oct 12 #Python
python 表格打印代码实例解析
Oct 12 #Python
Django+uni-app实现数据通信中的请求跨域的示例代码
Oct 12 #Python
python3.7将代码打包成exe程序并添加图标的方法
Oct 11 #Python
python 多进程并行编程 ProcessPoolExecutor的实现
Oct 11 #Python
Python 中list ,set,dict的大规模查找效率对比详解
Oct 11 #Python
Python 网络编程之UDP发送接收数据功能示例【基于socket套接字】
Oct 11 #Python
You might like
PHP中英混合字符串截取函数代码
2011/07/17 PHP
php除数取整示例
2014/04/24 PHP
PHPAnalysis中文分词类详解
2014/06/13 PHP
PHP访问数据库集群的方法小结
2016/03/14 PHP
PHP输出Excel PHPExcel的方法
2018/07/26 PHP
如何实现动态删除javascript函数
2007/05/27 Javascript
仿迅雷焦点广告效果(JQuery版)
2008/11/19 Javascript
javascript 判断数组是否已包含了某个元素的函数
2010/05/30 Javascript
javascript语言结构小记(一)
2011/09/10 Javascript
JavaScript改变HTML元素的样式改变CSS及元素属性
2013/11/12 Javascript
javascript自动给文本url地址增加链接的方法分享
2014/01/20 Javascript
jQuery中contents()方法用法实例
2015/01/08 Javascript
自己动手写的jquery分页控件(非常简单实用)
2015/10/28 Javascript
js+ajax实现获取文件大小的方法
2015/12/08 Javascript
js判断出两个字符串最大子串的函数实现方法
2016/11/01 Javascript
javascript获取以及设置光标位置
2017/02/16 Javascript
微信小程序 基础组件与导航组件详细介绍
2017/02/21 Javascript
Angular 4.x 路由快速入门学习
2017/05/03 Javascript
JavaScript高级函数应用之分时函数实例分析
2018/08/03 Javascript
小程序自定义单页面、全局导航栏的实现代码
2019/03/15 Javascript
[51:17]Mineski vs Secret 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.22
2019/09/05 DOTA
python下实现二叉堆以及堆排序的示例
2017/09/29 Python
tensorflow构建BP神经网络的方法
2018/03/12 Python
基于Python实现定时自动给微信好友发送天气预报
2018/10/25 Python
基于python判断目录或者文件代码实例
2019/11/29 Python
Python关键字及可变参数*args,**kw原理解析
2020/04/04 Python
Python yield生成器和return对比代码实例
2020/04/20 Python
Python实现定时监测网站运行状态的示例代码
2020/09/30 Python
Python 实现键盘鼠标按键模拟
2020/11/18 Python
前端使用canvas生成盲水印的加密解密的实现
2020/12/16 HTML / CSS
2014年高三毕业生自我评价
2014/01/11 职场文书
市场营销专业自荐书
2014/06/10 职场文书
社区干部培训心得体会
2016/01/06 职场文书
党员干部学习心得体会
2016/01/23 职场文书
详解RedisTemplate下Redis分布式锁引发的系列问题
2021/04/27 Redis
深入浅出讲解Java8函数式编程
2022/01/18 Java/Android