urllib库
urllib库是Python
中一个最基本的网络请求库。可以模拟浏览器的行为,向指定的服务器发送一个请求,并可以保存服务器返
回的数据。urllib
库是python内置的一个http请求库,不需要额外的安装。只需要关注请求的链接,参数,提供了强大的解析。
urllib库
提供了如下功能:
- 网页请求
- 响应获取
- 代理和cookie设置
- 异常处理
- URL解析
爬虫所需要的功能,基本上在urllib
中都能找到,学习这个标准库,可以更加深入的理解后面更加便利的requests
库。
urllib库有一下三个模块:
- urllb.request 请求模块
- urllib.error 异常处理模块
- urllib.parse 解析模块
urllib库中的urlopen函数:
在Python3
的urllib
库中,所有和网络请求相关的方法,都被集到urllib.request
模块下面了,首先来讲一下urlopen函数:
实际上,使用浏览器访问百度,右键查看源代码。你会发现,跟我们刚才打印出来的数据是一模一样的。也就是说,上面的三行代码就已经帮我们把百度的首页的全部代码爬下来了。一个基本的url请求对应的python代码真的非常简单。 以下对urlopen
函数的进行详细讲解:
1.url:请求的url。
2.data:请求的data
,如果设置了这个值,那么将变成post
请求。
3.返回值:返回值是一个http.client.HTTPResponse
对象,这个对象是一个类文件句柄对象。有read(size)
、readline
、readlines
以及getcode
等方法。
read()方法:读取整个页面的全部代码。
readline()方法:读取某一行的代码,默认是第一行的代码。
readlines()方法:按行来读取整个页面的代码存放在数组中。
getcode()方法:读取整个页面的状态码。
(1)简单的get请求
from urllib.request import urlopen
# if has Chinese, apply decode()
html = urlopen(
"http://www.baidu.com/"
).readline().decode('utf-8')
print(html)
(2)简单的post请求
import urllib.parse
import urllib.request
data = bytes(urllib.parse.urlencode({'hello':'world'}),encoding='utf-8')
reponse = urllib.request.urlopen('http://httpbin.org/post',data=data)
print(reponse.read())
(3)超时处理
import urllib.parse
import urllib.request
data = bytes(urllib.parse.urlencode({'hello':'world'}),encoding='utf-8')
reponse = urllib.request.urlopen('http://httpbin.org/post',data=data)
print(reponse.read())
urlretrieve函数:
urlretrieve() 方法直接将远程数据下载到本地。
这个函数可以方便的将网页上的一个文件保存到本地。文件类型可以是网页的html文件、图片、视频等媒体文件。
函数原型:urlretrieve(url, filename=None, reporthook=None, data=None)
- 参数 url 指定了要下载的文件的url
- 参数 finename 指定了保存本地路径(如果参数未指定,urllib会生成一个临时文件保存数据。)
- 参数 reporthook 是一个回调函数,当连接上服务器、以及相应的数据块传输完毕时会触发该回调,我们可以利用这个回调函数来显示当前的下载进度。
- 参数 data 指 post 到服务器的数据,该方法返回一个包含两个元素的(filename, headers)元组,filename 表示保存到本地的路径,header 表示服务器的响应头。
from urllib import request
request.urlretrieve
#前面参数是url,后面是保存的路径以及文件名
编码urlencode或者quote
urlencode()函数原理就是首先把中文字符转换为十六进制,然后在每个字符前面加一个标识符%。
在url中如果出现一些中文或者字符,url不识别的,则需要进行转换,使用urllib库中的urlencode函数,可以把key-value这样的
键值对转换成我们想要的格式,返回的是a=1&b=2这样的字符串,比如:
from urllib import request
from urllib import parse
params={'name':'Demo',"age":18}
qs=parse.urlencode(params)
print(qs)
#name=Demo&age=18
解码unquote()或者parse_qs函数
unquote()函数与urlencode()函数原理相反,用于解码已编码的 URL 字符串,其原理就是把十六进制字符串转换为中文字符
当urlencode之后的字符串传递过来之后,接受完毕就要解码了——urldecode。urllib提供了unquote()这个函数,可没有urldecode()函数!
n='%E8%BF%AA%E4%B8%BD%E7%83%AD%E5%B7%B4'
print(parse.unquote(n))
#迪丽热巴
parse_qs函数:
可以将经过编码后的url参数进行解码。示例代码如下:
from urllib import parse
qs = "name=%E7%88%AC%E8%99%AB%E5%9F%BA%E7%A1%80&greet=hello+world&age=100"
print(parse.parse_qs(qs))
#{'name': ['爬虫基础'], 'greet': ['hello world'], 'age': ['100']}
URL解析函数urlparse
url='https://baike.baidu.com/item/%E8%BF%AA%E4%B8%BD%E7%83%AD%E5%B7%B4/1180418?fr=aladdin#3'
result = parse.urlparse(url)
print(result)
print('scheme:',result.scheme) #网络协议
print('netloc:',result.netloc) #域名
print('path:',result.path) #文件存放路径
print('query:',result.query) #查询字符
print('fragment:',result.fragment) #拆分文档中的特殊猫
分割函数urlsplit
urlparse
和urlsplit
基本上是一模一样的。唯一不一样的地方是,urlparse
里面多了一个params
属性,而urlsplit
没有这个params
属性。比如有一个url
为:url = '
https://www.baidu.com/s;index.php?tn=78040160_14_pg&ch=16#1'
, 那么urlparse
可以获取到index.php
,而urlsplit
不可以获取到。url
中的params
也用得比较少。