【爬虫学得好,JY进得早】:urllib模块详解
文章目录
- 一、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、常用函数功能
CookieJar:
管理HTTP cookie值、存储HTTP请求生成的cookie、向传出的HTTP请求添加cookie的对象。整个cookie都存储在内存中,对CookieJar实例进行垃圾回收后cookie也将丢失。
FileCookieJar (filename,delayload=None,policy=None):
从CookieJar派生而来,用来创建FileCookieJar实例,检索cookie信息并将cookie存储到文件中。filename是存储cookie的文件名。delayload为True时支持延迟访问访问文件,即只有在需要时才读取文件或在文件中存储数据。
MozillaCookieJar (filename,delayload=None,policy=None):
从FileCookieJar派生而来,创建与Mozilla浏览器 cookies.txt兼容的FileCookieJar实例。
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模块详解相关推荐
- python爬虫urllib模块详解
1.urllib模块简介 python2有urllib和urllib2两种模块,都用来实现网络请求的发送.python3将urllib和urllib2模块整合并命名为urllib模块.urllib模块 ...
- python爬虫之urllib库详解
python爬虫之urllib库详解 前言 一.urllib库是什么? 二.urllib库的使用 urllib.request模块 urllib.parse模块 利用try-except,进行超时处理 ...
- Python Urllib库详解
Urllib库详解 什么是Urllib? Python内置的HTTP请求库 urllib.request 请求模块 urllib.error 异常处理模块 urllib.parse url解析模块 u ...
- 第五人格服务器维修中怎么进,第五人格进不去怎么办 游戏进不去解决方法详解[多图]...
第五人格开启测试已经有一段时间,许多玩家都会遇到各种问题,其中游戏进不去是让玩家最头痛的,今天安族小编来给大家介绍一下游戏进不去解决方法详解. 第五人格进不去解决方法 大家在玩的时候,肯定都会遇到卡顿 ...
- java里的进制转换函数_基于Java中进制的转换函数详解
十进制转成十六进制: Integer.toHexString(int i) 十进制转成八进制 Integer.toOctalString(int i) 十进制转成二进制 Integer.toBinar ...
- 爬虫入门之urllib库详解(二)
爬虫入门之urllib库详解(二) 1 urllib模块 urllib模块是一个运用于URL的包 urllib.request用于访问和读取URLS urllib.error包括了所有urllib.r ...
- 忍者必须死3 通关 服务器维护,忍者必须死3进不去怎么办 进不去解决方法详解[多图]...
忍者必须死3有不少的玩家在玩登录游戏的时候会出现进不去的情况,但又没有维护,不知道是什么原因,下面安族小编给大家介绍一下进不去解决方法详解. 忍者必须死3服务器进不去解决办法 网络问题 如果是进不去游 ...
- 刀塔霸业未能连接到服务器,刀塔霸业进不去怎么解决 进不去解决方法详解[多图]...
刀塔霸业有很多玩家爱下好游戏之后却进不去,不知道什么原因,下面安族小编带大家来看一下进不去解决方法详解,相信对大家会有帮助. 刀塔霸业玩不了解决办法 1.游戏需要的手机配置 iOS系统需要至少1.5内 ...
- 【JY】板壳单元的分析详解
不等待 即关注 简介 板壳是平板和壳体的总称,是最常见的物体形式.其外形特点是厚度比其余两个方向尺寸在数量级上小得多.平分物体厚度的分界面称为中面.若中面是平面,则称此物体为平板:若中面是曲面,则称此 ...
- pythonurllib模块-urllib库详解 --Python3
相关:urllib是python内置的http请求库,本文介绍urllib三个模块:请求模块urllib.request.异常处理模块urllib.error.url解析模块urllib.parse. ...
最新文章
- 跨平台表空间传输(linux 10g表空间跨平台迁移到window 11g)
- 2 获取对象 IDbDataAdapter 用于填充 DataSet 和更新数据源
- Swift中为什么输入“..”报错
- SAP Spartacus里所有backend endpoint list
- 【专升本计算机】专升本计算机期末考试复习题(B卷附答案)
- ppt扇形图怎么显示数据_前方高能!多维数据分析的神器雷达图PPT制作教程来啦!...
- [css] 说说你对媒体查询的理解
- BZOJ3223文艺平衡树——非旋转treap
- 行编辑器c语言,行编辑器——C语言.doc
- 怎么获取计算机用户权限,如何获取电脑的最高管理权限|细讲电脑最高管理权限的获取方式...
- 计算机系统关机后自动重启,小白教你电脑关机后自动重启是什么原因
- iOS系统安全学习小结(一)
- Android之流行框架
- 如何将论文中的公式图片直接变为word中的公式
- 计算机专业校招能去哪哪里,BAT三大互联网巨头最喜欢去哪些学校招人?
- HTML标签、认识浏览器
- NeRF与GAN的交融(一)——NeRF论文阅读
- C#如何将汉字转换成拼音
- MNN实践[C++版本]
- 易语言+精易模块 访问百度api案例