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 相关文章推荐
35个Python编程小技巧
Apr 01 Python
Python 实现购物商城,含有用户入口和商家入口的示例
Sep 15 Python
有趣的python小程序分享
Dec 05 Python
OpenCV-Python实现轮廓检测实例分析
Jan 05 Python
python验证码识别实例代码
Feb 03 Python
基于Python实现的微信好友数据分析
Feb 26 Python
kali中python版本的切换方法
Jul 11 Python
python对一个数向上取整的实例方法
Jun 18 Python
Python docutils文档编译过程方法解析
Jun 23 Python
Python如何将模块打包并发布
Aug 30 Python
python 如何利用argparse解析命令行参数
Sep 11 Python
Python word文本自动化操作实现方法解析
Nov 05 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常用的文件操作函数经典收藏
2013/04/02 PHP
php mysqli查询语句返回值类型实例分析
2016/06/29 PHP
HR vs ForZe BO3 第二场 2.13
2021/03/10 DOTA
关于firefox的ElementTraversal 接口 使用说明
2010/11/11 Javascript
原生Js页面滚动延迟加载图片实现原理及过程
2013/06/24 Javascript
JavaScript获取多个数组的交集简单实例
2013/11/11 Javascript
js生成随机数的方法实例
2015/10/16 Javascript
JS简单实现String转Date的方法
2016/03/02 Javascript
关于javascript中限定时间内防止按钮重复点击的思路详解
2016/08/16 Javascript
JS实现的排列组合算法示例
2019/07/16 Javascript
vue+element项目中过滤输入框特殊字符小结
2019/08/07 Javascript
vue+elementUI组件table实现前端分页功能
2020/11/15 Javascript
JS中类的静态方法,静态变量,实例方法,实例变量区别与用法实例分析
2020/03/14 Javascript
Node.js API详解之 os模块用法实例分析
2020/05/06 Javascript
Vue 监听元素前后变化值实例
2020/07/29 Javascript
JavaScript 中判断变量是否为数字的示例代码
2020/10/22 Javascript
python简单判断序列是否为空的方法
2015/06/30 Python
python3编写ThinkPHP命令执行Getshell的方法
2019/02/26 Python
python redis连接 有序集合去重的代码
2019/08/04 Python
Django Admin后台添加数据库视图过程解析
2020/04/01 Python
基于python实现模拟数据结构模型
2020/06/12 Python
python与c语言的语法有哪些不一样的
2020/09/13 Python
python 实现一个简单的线性回归案例
2020/12/17 Python
中国旅游网站:同程旅游
2016/09/11 全球购物
荷兰度假屋租赁网站:Aan Zee
2020/02/28 全球购物
初中生三年学习生活的自我评价
2013/11/03 职场文书
国家励志奖学金获奖感言
2014/01/09 职场文书
事业单位绩效考核实施方案
2014/03/27 职场文书
市场部业务员岗位职责
2014/04/02 职场文书
公司捐款倡议书
2014/05/14 职场文书
工作失职造成投诉的检讨书范文
2014/10/05 职场文书
预备党员转正党小组意见
2015/06/01 职场文书
简爱电影观后感
2015/06/10 职场文书
新娘父亲婚礼致辞
2015/07/27 职场文书
事业单位工作人员岗前培训心得体会
2016/01/08 职场文书
php实现自动生成验证码的实例讲解
2021/11/17 PHP