urllib库的介绍以及常见使用

urllib库,它是模拟浏览器发送请求的库,它由Python自带。

1、不同的版本其使用也不相同,对应关系如下:

    Python2:urllib  urllib2

    Python3: urllib.request   urllib.parse

2、urllib.request的使用:

       (1) urlopen(url)#读取url

如:response = urllib.request.urlopen(url=url) #返回的是一个http.client.HTTPResponse对象

        读取响应内容:content = response.read() #返回的是二进制的字节类型,HTML文本的内容

        content= content.decode('utf-8') #把字节类型转换为字符串类型

        读取状态码:response.getcode()

        读取url:response.geturl()

        读取响应头:response.getheaders()

       接下来,看看它返回的到底是什么 。

       利用 type ()方法输出响应的类型:
      import urllib.request 
     response = urllib.request.urlopen (’ https://www.python.org') 
     print(type(response)) 
     输出结果如下:
    <class ’ http.client.HTTPResponse ’ >
    可以发现,它是一个 HTTPResposne 类型的对象,主要包含 read ()、 readinto ()、 getheader(name )、
getheaders ()、 fileno ()等方法,以及 msg 、version、 status、 reason 、debuglevel、 closed 等属性.
得到这个对象之后,我们把它赋值为 response 变量,然后就可以调用这些方法和属性,得到返回结果的-系列信息了。

利用最基本的 urlopen ()方法,可以完成最基本的简单网页的 GET 请求抓取.
如果想给链接传递一些参数,该怎么实现呢?

首先看一下 urlopen ()函数的 API:
urllib . request . urlopen(url, data=None, [ timeout, ]*, cafile=None, capath=None, cadefault=False, context=None ) 
可以发现,除了第一个参数可以传递 URL 之外,我们还可以传递其他内容,比如 data (附加数
据)、 timeout (超时时间)
下面我们详细说明下这几个参数的用法:
 data 参数
data 参数是可选的 如果要添加该参数,并且如果它是字节流编码格式的内容,即 bytes 类型,
则需要通过 bytes ()方法转化 另外,如果传递了这个参数,则它的请求方式就不再是 GET 方式,而是POST。
下面用实例来看 下:
import urllib.parse 
import urllib.request 
data = bytes(urllib . parse . urlencode({'word ’:’ hello'}), encoding =’ utf8')
response= urllib.request.urlopen('http://httpbin.org/post ’, data=data) 
print(response.read()) 
这里我们传递了一个参数 word ,值是 hello 它需要被转码成 bytes (字节流)类型 其中转
节流采用了 bytes ()方法,该方法的第一个参数需要是 str (字符串)类型,需要用 urllib.parse
块里的 ur lencode ()方法来将参数字典转化为字符串;第 个参数指定编码格式,这里指定为 utf8.

 timeout 参数
timeout 参数用于设置超时时间,单位为秒,意思就是如果请求超 了设置的这个时间, 还没有得
到响应 就会抛出异常 如果不指定该参数 ,就会使用全局默认时间 它支持 HTTP HTTPS FTP
请求.

其他参数
除了 data 参数和 timeout 参数外,还有 context 参数,它必须是 ssl.SSLContext 类型,用来指定
SSL
此外, cafile ca path 这两个参数分别指定 CA 证书和它的路径,这个在请求 HTTPS 链接时
有用
cadefault 参数现在已经弃用了,其默认值为 False.

      (2)urlretrieve(url, image_path) #根据图片链接获取图片,一行代码搞定网页或者图片保存

        如:urllib.request.urlretrieve(image_url, '**.jpg')#默认存放在当前文件夹

      (3)构建请求头部信息(这是反爬第一步)
     原理是通过 伪装自己的UA,让服务端认为是浏览器在上网

     构建请求对象: urllib.request.Request()

示例:import urllib.request
import urllib.parse
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
url = 'http://www.baidu.com/'
# 伪装头部
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36',
}
# 构建请求对象
request = urllib.request.Request(url=url, headers=headers)
# 发送请求
response = urllib.request.urlopen(request)
print(response.read().decode())

下面我们看一下 Request 可以通过怎样的参数来构造,它的构造方法如下:
class urllib. request. Request ( ur 1, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None) 
第一个参数 ur 用于请求 RL 这是必传参数,其他都是可选参数。

第二个参数 data 如果要传,必须传 bytes (字节流)类型的 如果它是字典,可以先用urllib.parse 模块里的 urlencode ()编码
第 三个参数 headers 是一个字典,它就是请求头,我们可以在构造请求时通过 headers 参数直接构造,也可以通过调用请求实例的 add_header ()方法添加。
添加请求头最常用的用法就是通过修改 User-Agent 来伪装浏览器,默认的 User-Agent 是Python-urllib ,我们可以通过修改它来伪装浏览器。 比如要伪装火狐浏览器,你可以把它设置为Mozilla/s.o (X11; U; Linux i686) Gecko/20071127 Firefox/2.0.0.11 
第四个参数 origin_req_host 指的是请求方的 host 名称或者 IP 地址
第五个参数 nveri iable 表示这个请求是否是无法验证的,默认是 False ,意思就是说用户没有足够权限来选择接收这个请求的结果 例如,我们请求 HTML 文档中的图片,但是我们没有向动抓取图像的权限,这时 unverifiable 的值就是 True
第六个参数 method 一个字符串 ,用来指示请求使用的方法,比如 GET、 POST、 PUT。

另外, headers 也可以用 add_header ()方法来添加:
req = request.Request(url=url, data=data, method= ' POST ’) 
req .add_header(’ User-Agent p ,’Mozilla/4 .0 (compatible; MSIE 5.5; Windows NT )’) 
如此一来 ,我们就可以更加方便地构造请求,实现请求的发送啦。

3、urllib.parse的使用:

        quote :url编码函数,将中文进行转化为%xxx

        unquote :url解码函数,将%xxx转化为指定字符

如:url = urllib.parse.unquote(url)

        urlencode :给一个字典,将字典拼接为query_string,并且实现了编码的功能

如:url = 'http://www.baidu.com/index.html'
name = '小明'
age = 18
sex = '男'
height = '180'
data = {
    'name': name,
    'age': age,
    'sex': sex,
    'height': height,
    'weight': 180,
}
query_string = urllib.parse.urlencode(data)
print(query_string)
url = url + '?' + query_string
print(url)

4、response的使用:
        read() :读取相应内容,内容是字节类型
        geturl() :获取请求的url
        getheaders() :获取头部信息,列表里面有元组
        getcode() :获取状态码
        readlines() :按行读取,返回列表,都是字节类型

5、字符串类型与字节类型之间的转化

       encode()    字符串->字节类型
            如果小括号里面不写参数,默认是utf8
            如果写,你就写 gbk
        decode()    字节类型->字符串
            如果不写   默认utf8

            如果写   写 gbk

6、URLError\HTTPError
    这两个类都在 urllib.error 里面
    NameError   TypeError  FileNotFound  异常
    异常处理,结构  try-except
    URLError:
        (1)没有网
        (2)服务器连接失败
        (3)找不到指定的服务器
    HTTPError:
        是URLError的子类

    【注】两个同时捕获的时候,需要将HTTPError写到上面,URLError写到下面

示例如下:import urllib.request
import urllib.parse
import urllib.error
url = 'https://blog.csdn.net/thinkcortex/article/details/5206282'
try:
    response = urllib.request.urlopen(url)
    print(response)
except urllib.error.HTTPError as e:
    print(e)
    print(e.code)
except urllib.error.URLError as e:
    print(e)

print(response.read().decode())

7、使用Handler处理器、自定义Opener   

首先,介绍一下 urllib . reqest 模块里的 BaseHandler 类,它是所有其他 Handler 的父类,它提
供了最基本的方法,例如 default_open ()、 protocol_request ()等
接下来,就有各种 Handler 子类继承这个 BaseHandler 类,举例如下:
HITPDefaultErrorHandler :用于处理 HTTP响应错误,错误都会抛出 HTTP Error 类型的异常;
HTTPRedirectHandler :用于处理重定向;
HTTPCookieProcessor 用于处理 Cookies;
ProxyHandler :用于设置代理 默认代理为空;
HTTPPasswordMgr :用于管理密码,它维护了用户名和密码的表;
HTTPBasicAuthHandler 用于管理认证,如果一个链接打开时需要认证,那么可以用它来解决认证问题。另一个比较重要的类就是 OpenerDirector ,我们可以称为 Opener 我们之前用过 urlopen ()这方法,实际上它就是 urllib 为我们提供的一个 Opener.
那么,为什么要引人 Opener 呢?因为需要实现更高级的功能 之前使用的 Request 和urlopen()相当于类库为你封装好了极其常用的请求方法,利用它们可以完成基本的请求,但是现在不一样了,我们需要实现更高级的功能,所以需要深入一层进行配置,使用更底层的实例来完成操作,所以这里就用到了 Opener。
Opener 可以使用 open ()方法,返回的类型和 urlopen ()如出 那么,它和 Handler 有什么系呢?简而言之,就是利用Han dler 来构建 Opener.

(1)不使用代理,示例如下:

import urllib.request
import urllib.parse
url = 'http://www.baidu.com/'
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36',
}
# 创建一个handler
handler = urllib.request.HTTPHandler()
# 通过handler创建一个opener
# opener就是一个对象,一会发送请求的时候,直接使用opener里面的方法即可,不同使用urlopen
opener = urllib.request.build_opener(handler)
# 构建请求对象
request = urllib.request.Request(url, headers=headers)
# 发送请求
response = opener.open(request)

print(response.read().decode())

(2)使用代码设置代理并访问网页查看ip是否更改

实例如下:import urllib.request
import urllib.parse
# 创建handler
handler = urllib.request.ProxyHandler({'http': '代理ip:端口'})
# 创建opener
opener = urllib.request.build_opener(handler)
url = 'http://www.baidu.com/s?ie=UTF-8&wd=ip'
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36',
}
request = urllib.request.Request(url, headers=headers)
response = opener.open(request)
with open('ip.html', 'wb') as fp:
    fp.write(response.read())

(3)用于管理认证

from urllib.request import HTTPPasswordMgrWithDefaultRealm, HTTPBasicAuthHandler, build_opener 
from urllib.error import URLError 
username = username 
password =’ password ’ 
url = ’ http: //localhost:sooo/' 
p = HTTPPasswordMgrWi thDefaultRealm() 
p.add_password(None, url, username , password) 
auth_handler = HTTPBasicAuthHandler(p) 
opener = build_opener(auth_handler) 
try: 
 result = opener.open(url) 
 html = result. read(). decode (’ utf 8’) 
 print(html) 
except URLError as e: 
 print(e.reason) 

这里首先实例化HTTPBasicAuthHandler 对象,其参数是 HTTPPasswordMgrWithDefaultRealm 对象,它利用 add _password ()添加进去用户名和密码,这样就建立了一个处理验证的 Handler。

接下来利用 Opener 的open ()方法打开链接,就可以完成验证了 这里获取到的结果就是验证后的页面源码内容。

(4)用于Cookies

 

 



 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值