天天看点

python爬虫之urllib库学习urllib库

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())
           

 参考链接:https://blog.csdn.net/qq_27524749/article/details/105119634 网易爬虫工程师

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("https://blog.csdn.net/sereasuesue/category_10790248.html",'csdn.html')
 
#前面参数是url,后面是保存的路径以及文件名
           
python爬虫之urllib库学习urllib库

下载图片见https://blog.csdn.net/sereasuesue/article/details/113730274

编码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爬虫之urllib库学习urllib库

解码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爬虫之urllib库学习urllib库

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

也用得比较少。