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中用于返回绝对值的abs()方法
May 14 Python
Python实现网站注册验证码生成类
Jun 08 Python
Python爬虫实现爬取京东手机页面的图片(实例代码)
Nov 30 Python
python机器学习实战之K均值聚类
Dec 20 Python
详解Python自建logging模块
Jan 29 Python
浅谈Python中的作用域规则和闭包
Mar 20 Python
Python小白必备的8个最常用的内置函数(推荐)
Apr 03 Python
Python2与Python3的区别实例分析
Apr 11 Python
详解用python写一个抽奖程序
May 10 Python
Python collections模块使用方法详解
Aug 28 Python
500行代码使用python写个微信小游戏飞机大战游戏
Oct 16 Python
Python特殊属性property原理及使用方法解析
Oct 09 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连接access数据库
2008/03/27 PHP
destoon在各个服务器下设置URL Rewrite(伪静态)的方法
2014/06/21 Servers
php绘制圆形的方法
2015/01/24 PHP
PHP递归遍历指定目录的文件并统计文件数量的方法
2015/03/24 PHP
PHP书写格式详解(必看)
2016/05/23 PHP
浅谈php中urlencode与rawurlencode的区别
2016/09/05 PHP
Node.js开发指南中的简单实例(mysql版)
2013/09/17 Javascript
JQuery工具函数汇总
2015/06/15 Javascript
javascript+html5实现绘制圆环的方法
2015/07/28 Javascript
JavaScript中Object.prototype.toString方法的原理
2016/02/24 Javascript
jQuery实现TAB选项卡切换特效简单演示
2016/03/04 Javascript
微信小程序购物商城系统开发系列-工具篇的介绍
2016/11/21 Javascript
jQuery实现下拉菜单动态添加数据点击滑出收起其他功能
2018/06/14 jQuery
微信小程序实现留言功能
2018/10/31 Javascript
详解在不使用ssr的情况下解决Vue单页面SEO问题
2018/11/08 Javascript
详解Vue demo实现商品列表的展示
2019/05/07 Javascript
vuex实现像调用模板方法一样调用Mutations方法
2019/11/06 Javascript
JS如何实现封装列表右滑动删除收藏按钮
2020/07/23 Javascript
[02:53]DOTA2英雄昆卡基础教程
2013/11/25 DOTA
Python如何实现守护进程的方法示例
2017/02/08 Python
python中print()函数的“,”与java中System.out.print()函数中的“+”功能详解
2017/11/24 Python
Python实现矩阵转置的方法分析
2017/11/24 Python
Django压缩静态文件的实现方法详析
2018/08/26 Python
python可视化实现代码
2019/01/15 Python
opencv调整图像亮度对比度的示例代码
2019/09/27 Python
Python通过format函数格式化显示值
2020/10/17 Python
德国电子产品购物网站:TechInTheBasket德国
2018/12/07 全球购物
国际花店:Pickup Flowers
2020/04/10 全球购物
工厂仓管员岗位职责
2014/01/01 职场文书
大家检讨书5000字
2014/02/03 职场文书
成语的广告词
2014/03/19 职场文书
退休党员个人对照检查材料思想汇报
2014/09/29 职场文书
埃及王子观后感
2015/06/16 职场文书
毕业生入职感言
2015/07/31 职场文书
手把手教你实现PyTorch的MNIST数据集
2021/06/28 Python
前端JavaScript大管家 package.json
2021/11/02 Javascript