文章目录

  • 一、urllib模块介绍
  • 二、urllib功能
  • 三、常用模块
    • 3.1 request.urlopen() 函数详解
    • 3.2 urlretrieve() 函数详解
    • 3.3 urlencode、parse_qs、和parse.quote函数使用实例
    • 3.4 urlparse()详解
    • 3.5 request.Request类
    • 3.6 ProxyHandler()类,设置代理
    • 3.7 http.cookiejar模块
  • 4、实战案例

一、urllib模块介绍

urllib是Python中请求url连接的内置库,在Python2中主要为urllib和urllib2,在Python3中整合成了urllib,并增加了连接池等功能。从使用角度看,urllib基本上涵盖了基础的网络请求功能。

二、urllib功能

urllib 是一个收集了多个用到 URL 的模块的包,是Python自带的标准库,无需安装,直接可以用,提供了如下功能:

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

源代码: Lib/urllib/

三、常用模块

在Python3的urllib库中,所有和网络请求相关的方法,都被集到urllib.request模块,下面是request的一些常用函数:

函数名 功能
request.urlopen() 创建一个表示远程url的类文件对象,然后像本地文件一样操作这个类文件对象来获取远程数据。
request.urletrieve() 这个函数可以方便的将网页上的一个文件保存到本地
parse.urlencode() 可以把字典数据或者两元素元组序列转换为URL编码的数据
parse.quote() 可以将字符串转化为ASCII字符,同时屏蔽特殊字符,比如如果url里面的空格!
parse.parse_qs() 可以将经过编码后的url参数进行解码,返回字典
parse.parse_qsl() 功能类似parse_qs(),只是返回值是列表
parse.urlparse(url) 将url解析为6元组,返回一个ParseResult对象元组
parse.urlsplit(url) 和urlparse()功能类似,比urlparse里少一个params属性
request.Request类 网络请求 可以增加请求头,拓展功能比urlopen()丰富
request.ProxyHandler() 设置代理服务器
http.cookiejar模块 提供用于存储cookie的对象

3.1 request.urlopen() 函数详解

1、语法:

urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)

2、参数:

  • url:可以是字符串或者是Request对象。

  • data:必须是一个定义了向服务器所发送额外数据的对象,默认为None。

  • timeout:超时时间(以秒为单位),如果未指定,将使用全局默认超时设置

  • context:它必须是描述各种SSL选项的ssl.SSLContext实例。

  • cafile和capath参数为HTTPS请求指定一组可信的CA证书。 cafile应指向包含一系列CA证书的单个文件,而capath应指向散列证书文件的目录。

  • cadefault:参数被忽略。

3、返回值:

  • 返回值是一个http.client.HTTPResponse对象,这个对象是一个类文件句柄对象。有read(size)、readline(行)、readlines(多行)以及getcode(状态码)等方法

4、代码实例

'''
创建一个表示远程url的类文件对象,然后像本地文件一样操作这个类文件对象来获取远程数据。
version:01
author:金鞍少年
date:2020-03-20
'''
from urllib import requestresp = request.urlopen('http://www.youkelai.net/')
print(resp.readlines())

3.2 urlretrieve() 函数详解

1、语法

urlretrieve(url, filename=None, reporthook=None, data=None)

2、参数

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

3、返回值

  • 返回一个包含新创建路径的元组数据文件以及生成的HTTPMessage对象。

4、代码实例

'''这个函数可以方便的将网页上的一个文件保存到本地。
version:01
author:金鞍少年
date:2020-03-20
'''from urllib import request# 获取网页,保存到本地
request.urlretrieve('http://www.youkelai.net/', './res/index.html')  # 存放在res目录下,保存为index.html# 获取图片,保存到本地
request.urlretrieve('http://pic1.win4000.com/pic/a/a8/eb94162c9b.jpg', './res/刘亦菲《环球银幕》三月刊封面写真图片.jpg')

3.3 urlencode、parse_qs、和parse.quote函数使用实例

代码示例

'''urlencode函数:编码  可以把字典数据或者两元素元组序列转换为URL编码的数据。
quote函数:编码      屏蔽特殊的字符、比如如果url里面的空格!url里面是不允许出现空格的。只允许一部分 ASCII 字符(数字字母和部分符号),其他的字符(如汉字)是不符合 URL 标准的。
parse_qs函数:解码   可以将经过编码后的url参数进行解码```'''from urllib import request,parse# urlencode函数
# ===========================================================
# 案例一
data = {'name':'老王','age':18,'greet':'hello world'}
qs = parse.urlencode(data)
print(qs)# 案例二
'''
百度图片搜索刘亦菲  http://image.baidu.com/search/index?tn=baiduimage&ps=1&ct=201326592&lm=-1&cl=2&nc=1&ie=utf-8&word=刘亦菲
直接请求,这个地址会报错,这个时候就要将 汉字 刘亦菲做Url编码处理,再做url拼接
'''
data1 = {'word': '刘亦菲'}
pul = parse.urlencode(data1)re = request.urlopen('http://image.baidu.com/search/index?tn=baiduimage&ps=1&ct=201326592&lm=-1&cl=2&nc=1&ie=utf-8&'+pul)
print(re)  # <http.client.HTTPResponse object at 0x000001A05F417DC0># queto  函数编码
# ===========================================================
str1 = '刘亦菲'
str2 = parse.quote(str1)
print(str2)# parse_qs函数 解码
# ===========================================================
data2 = 'name=%E8%80%81%E7%8E%8B&age=18&greet=hello+world'
print(parse.parse_qs(data2))  # {'name': ['老王'], 'age': ['18'], 'greet': ['hello world']}

3.4 urlparse()详解

1、 urllib.urlparse() 用法

urlparse模块主要是用于解析url中的参数 对url按照一定格式进行 拆分或拼接

'''
将url分为6个部分,返回一个包含6个字符串项目的元组:协议、位置、路径、参数、查询、片段。version:01
author:金鞍少年
date:2020-03-20
'''
from urllib import parseurl = 'https://blog.csdn.net/weixin_42444693/article/details/104953477'
result = parse.urlparse(url)print(result)

输出结果为:

ParseResult(scheme='https', netloc='blog.csdn.net', path='/weixin_42444693/article/details/104953477', params='', query='', fragment='')

其中 scheme 是协议 netloc 是域名服务器 path 相对路径 ,params是参数,query是查询的条件

2、其他用法

函数 功能
urllib.urlsplit() 和urlparse差不多,将url分为5部分,返回一个包含5个字符串项目的元组:协议、位置、路径、查询、片段。
urllib.urljoin() 将相对的地址组合成一个url,对于输入没有限制,开头必须是http://,否则将不组合前面。

3、各用法代码实例

from urllib import parse# urlparse 用法
# ===================================
url = 'https://blog.csdn.net/weixin_42444693/article/details/104953477'
result = parse.urlparse(url)
print(result)
# 获取元组中scheme内容
print(parse.urlparse(url).scheme)# parse.urljoin的用法
# 将相对的地址组合成一个url,对于输入没有限制,开头必须是http://,否则将不组合前面。
# ===================================
new_url = parse.urljoin('https://baidu.com/ssss/','88888')
print(new_url)# parse.urlsplit的用法
# ===================================
url_change = parse.urlsplit('https://blog.csdn.net/weixin_42444693/article/details/104953477')
print(url_change)

3.5 request.Request类

网络请求 可以增加请求头,功能比urlopen()丰富,但是在python3中,建议使用Requests类。

1、代码实例

'''
request.Request类:网络请求  可以增加请求头
version:01
author:金鞍少年
date:2020-03-20
'''from urllib import requestheaders = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'}
rq = request.Request('https://www.baidu.com/', headers=headers)
resp = request.urlopen(rq)
print(resp.read())

3.6 ProxyHandler()类,设置代理

1、工作原理

在请求目的网站之前,先请求代理服务器,然后让代理服务器去请求目的网站,代理服务器拿到目的网站的数据后,再转发给我们的代码。

2、HTTP请求各参数

参数 功能
GET 向Web服务器请求一个文件
POST 向Web服务器发送数据让Web服务器进行处理
PUT 向Web服务器发送数据并存储在Web服务器内部
HEAD 检查一个对象是否存在
DELETE 从Web服务器上删除一个文件
CONNECT 对通道提供支持
TRACE 跟踪到服务器的路径
OPTIONS 查询Web服务器的性能

3、代码实例

from urllib import request# 使用代理
# 步骤
url = 'http://httpbin.org/ip'
# 1. 使用ProxyHandler,传入代理构建一个handler
handler = request.ProxyHandler({'http': '171.83.8.46:9999'})
# 2. 使用上面创建的handler构建一个opener
opener = request.build_opener(handler)
# 3. 使用opener去发送一个请求
resp = opener.open(url)
print(resp.read())

3.7 http.cookiejar模块

1、什么是cookie

指某些网站为了辨别用户身份、进行 session 跟踪而储存在用户本地终端上的数据

2、cookie的格式

语法:

Set-Cookie:NAME=VALUE;Expires/Max-age=DATE;Path=PATH;Domain=DOMAIN_NAME;SECURE

参数意义:

参数 意义
NAME cookie的名字
VALUE cookie的值
Expires cookie的过期时间
Path cookie作用的路径
Domain cookie作用的域名
SECURE 是否只在https协议下起作用

3、常用函数功能

  1. CookieJar:

    管理HTTP cookie值、存储HTTP请求生成的cookie、向传出的HTTP请求添加cookie的对象。整个cookie都存储在内存中,对CookieJar实例进行垃圾回收后cookie也将丢失。

  2. FileCookieJar (filename,delayload=None,policy=None):

    从CookieJar派生而来,用来创建FileCookieJar实例,检索cookie信息并将cookie存储到文件中。filename是存储cookie的文件名。delayload为True时支持延迟访问访问文件,即只有在需要时才读取文件或在文件中存储数据。

  3. MozillaCookieJar (filename,delayload=None,policy=None):

    从FileCookieJar派生而来,创建与Mozilla浏览器 cookies.txt兼容的FileCookieJar实例。

  4. LWPCookieJar (filename,delayload=None,policy=None):

    从FileCookieJar派生而来,创建与libwww-perl标准的 Set-Cookie3 文件格式兼容的FileCookieJar实例。

4、代码实例

'''
常用函数代码组合到一起了,运行的时候注意得先注释一部分'''from urllib import request
from urllib import parse
from http.cookiejar import CookieJar# 登录:https://i.meishi.cc/login.php?redirect=https%3A%2F%2Fwww.meishij.net%2F
#个人网页https://i.meishi.cc/cook.php?id=13686422headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'
}
# 1.登录
# ==========================================================
cookiejar = CookieJar()  # 创建cookiejar对象
handler = request.HTTPCookieProcessor(cookiejar)  # 使用cookiejar创建一个HTTPCookieProcess对象opener = request.build_opener(handler)  # 使用上一步的创建的handler创建一个opener
post_url = 'https://i.meishi.cc/login.php?redirect=https%3A%2F%2Fwww.meishij.net%2F'
post_data = parse.urlencode({  # 使用opener发送登录请求  (账号和密码)'username':'XXXXXXXX',  # 伪代码,用自己账号密码测试'password':'XXXXXXXX.'
})
req = request.Request(post_url,data=post_data.encode('utf-8'))
opener.open(req)# 2.访问个人网页
url = 'https://i.meishi.cc/cook.php?id=13686422'
rq = request.Request(url, headers=headers)
resp = opener.open(rq)
print(resp.read().decode('utf-8'))# cookie加载与保存
# ===============================================================
from urllib import request
from http.cookiejar import MozillaCookieJar# 保存
cookiejar = MozillaCookieJar('cookie.txt')
handler = request.HTTPCookieProcessor(cookiejar)
opener = request.build_opener(handler)
resp = opener.open('http://www.httpbin.org/cookies/set/course/abc')cookiejar.save(ignore_discard=True,ignore_expires=True)ignore_discard = True  # 即使cookies即将被丢弃也要保存下来
ignore_expires = True  # 如果cookies已经过期也将它保存并且文件已存在时将覆盖# 加载
cookiejar = MozillaCookieJar('cookie.txt')
cookiejar.load()
handler = request.HTTPCookieProcessor(cookiejar)
opener = request.build_opener(handler)
resp = opener.open('http://www.httpbin.org/cookies/set/course/abc')for cookie in cookiejar:print(cookie)

4、实战案例

'''
https://www.meishij.net/chufang/diy/爬美食杰菜谱大全,家常菜谱
version:01
author:金鞍少年
date:2020-03-20
'''import requests
import re
class meishij:def __init__(self):self.path = r'./美食杰菜谱图片/'self.headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36','referer': 'https://www.meishij.net/'}# 获取htmldef getHtml(self,url):re = requests.get(url, headers=self.headers)if re.status_code == 200:yield re.text# 获取菜谱图片和菜名def get_Data(self, Html):foods_name = re.findall('alt="(.*?)"', Html)  # 菜单名列表foods_img = re.findall('class="img".*?src="(.*?)"', Html)  # 图片url列表for index, name in enumerate(foods_name):file = self.path + name + '.jpg'  # 拼接文件名img = requests.get(foods_img[index])with open(file,'wb')as f:f.write(img.content)print('图片:%s 下载成功!'%name)#  逻辑def func(self):for i in range(1, 10):  # 10代表分页最大页数url = 'https://www.meishij.net/chufang/diy/?&page=' + str(i)  # 拼接分页urlfor Html in self.getHtml(url):self.get_Data(Html)if __name__ == "__main__":f = meishij()f.func()

【爬虫学得好,JY进得早】:urllib模块详解相关推荐

  1. python爬虫urllib模块详解

    1.urllib模块简介 python2有urllib和urllib2两种模块,都用来实现网络请求的发送.python3将urllib和urllib2模块整合并命名为urllib模块.urllib模块 ...

  2. python爬虫之urllib库详解

    python爬虫之urllib库详解 前言 一.urllib库是什么? 二.urllib库的使用 urllib.request模块 urllib.parse模块 利用try-except,进行超时处理 ...

  3. Python Urllib库详解

    Urllib库详解 什么是Urllib? Python内置的HTTP请求库 urllib.request 请求模块 urllib.error 异常处理模块 urllib.parse url解析模块 u ...

  4. 第五人格服务器维修中怎么进,第五人格进不去怎么办 游戏进不去解决方法详解[多图]...

    第五人格开启测试已经有一段时间,许多玩家都会遇到各种问题,其中游戏进不去是让玩家最头痛的,今天安族小编来给大家介绍一下游戏进不去解决方法详解. 第五人格进不去解决方法 大家在玩的时候,肯定都会遇到卡顿 ...

  5. java里的进制转换函数_基于Java中进制的转换函数详解

    十进制转成十六进制: Integer.toHexString(int i) 十进制转成八进制 Integer.toOctalString(int i) 十进制转成二进制 Integer.toBinar ...

  6. 爬虫入门之urllib库详解(二)

    爬虫入门之urllib库详解(二) 1 urllib模块 urllib模块是一个运用于URL的包 urllib.request用于访问和读取URLS urllib.error包括了所有urllib.r ...

  7. 忍者必须死3 通关 服务器维护,忍者必须死3进不去怎么办 进不去解决方法详解[多图]...

    忍者必须死3有不少的玩家在玩登录游戏的时候会出现进不去的情况,但又没有维护,不知道是什么原因,下面安族小编给大家介绍一下进不去解决方法详解. 忍者必须死3服务器进不去解决办法 网络问题 如果是进不去游 ...

  8. 刀塔霸业未能连接到服务器,刀塔霸业进不去怎么解决 进不去解决方法详解[多图]...

    刀塔霸业有很多玩家爱下好游戏之后却进不去,不知道什么原因,下面安族小编带大家来看一下进不去解决方法详解,相信对大家会有帮助. 刀塔霸业玩不了解决办法 1.游戏需要的手机配置 iOS系统需要至少1.5内 ...

  9. 【JY】板壳单元的分析详解

    不等待 即关注 简介 板壳是平板和壳体的总称,是最常见的物体形式.其外形特点是厚度比其余两个方向尺寸在数量级上小得多.平分物体厚度的分界面称为中面.若中面是平面,则称此物体为平板:若中面是曲面,则称此 ...

  10. pythonurllib模块-urllib库详解 --Python3

    相关:urllib是python内置的http请求库,本文介绍urllib三个模块:请求模块urllib.request.异常处理模块urllib.error.url解析模块urllib.parse. ...

最新文章

  1. 跨平台表空间传输(linux 10g表空间跨平台迁移到window 11g)
  2. 2 获取对象 IDbDataAdapter 用于填充 DataSet 和更新数据源
  3. Swift中为什么输入“..”报错
  4. SAP Spartacus里所有backend endpoint list
  5. 【专升本计算机】专升本计算机期末考试复习题(B卷附答案)
  6. ppt扇形图怎么显示数据_前方高能!多维数据分析的神器雷达图PPT制作教程来啦!...
  7. [css] 说说你对媒体查询的理解
  8. BZOJ3223文艺平衡树——非旋转treap
  9. 行编辑器c语言,行编辑器——C语言.doc
  10. 怎么获取计算机用户权限,如何获取电脑的最高管理权限|细讲电脑最高管理权限的获取方式...
  11. 计算机系统关机后自动重启,小白教你电脑关机后自动重启是什么原因
  12. iOS系统安全学习小结(一)
  13. Android之流行框架
  14. 如何将论文中的公式图片直接变为word中的公式
  15. 计算机专业校招能去哪哪里,BAT三大互联网巨头最喜欢去哪些学校招人?
  16. HTML标签、认识浏览器
  17. NeRF与GAN的交融(一)——NeRF论文阅读
  18. C#如何将汉字转换成拼音
  19. MNN实践[C++版本]
  20. 易语言+精易模块 访问百度api案例

热门文章

  1. 哪个pdf打印机可以设置双面打印啊
  2. 注册vmvare账号验证码问题
  3. 铁路铁鞋UWB定位系统
  4. 超高精度UWB其实并不贵——UWB定位基站成本详解
  5. 计算机配机方案和理由,配机方案
  6. 今天又是一个全新的开始...
  7. 从明年1月开始,Oracle要对JDK8就要收费了,怎么办?
  8. 计算机常用压缩软件有哪些,电脑压缩软件哪个好推荐
  9. 【UCSC Genome Browser】比老东家还出名的基因组数据库
  10. 支持中文编程、汉语编程的国产C语言编程工具 - 习语言4717版发布