urllib库

urllib库是Python中一个最基本的网络请求库。可以模拟浏览器的行为,向指定的服务器发送一个请求,并可以保存服务器返

回的数据。urllib库是python内置的一个http请求库,不需要额外的安装。只需要关注请求的链接,参数,提供了强大的解析。

urllib库提供了如下功能:

  • 网页请求
  • 响应获取
  • 代理和cookie设置
  • 异常处理
  • URL解析

爬虫所需要的功能,基本上在urllib中都能找到,学习这个标准库,可以更加深入的理解后面更加便利的requests库。

urllib库有一下三个模块:

  • urllb.request 请求模块
  • urllib.error 异常处理模块
  • urllib.parse 解析模块

urllib库中的urlopen函数:

Python3urllib库中,所有和网络请求相关的方法,都被集到urllib.request模块下面了,首先来讲一下urlopen函数:

实际上,使用浏览器访问百度,右键查看源代码。你会发现,跟我们刚才打印出来的数据是一模一样的。也就是说,上面的三行代码就已经帮我们把百度的首页的全部代码爬下来了。一个基本的url请求对应的python代码真的非常简单。 以下对urlopen函数的进行详细讲解:

1.url:请求的url。

2.data:请求的data,如果设置了这个值,那么将变成post请求。

3.返回值:返回值是一个http.client.HTTPResponse对象,这个对象是一个类文件句柄对象。有read(size)readlinereadlines以及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,后面是保存的路径以及文件名

python怎么算url的长度 python中的urllib_request

编码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

python怎么算url的长度 python中的urllib_python_02

解码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

python怎么算url的长度 python中的urllib_request_03

urlparseurlsplit基本上是一模一样的。唯一不一样的地方是,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也用得比较少。