Python之urllib库详解

urllib 是 Python 标准库中用于网络请求的库。

该库有四个模块,分别是:

urllib.request

urllib.error

urllib.parse

urllib.robotparser

1 发起请求

模拟浏览器发起一个 HTTP 请求,我们需要用到 urllib.request 模块。urllib.request 的作用不仅仅是发起请求, 还能获取请求返回结果。发起请求,单靠 urlopen() 方法就可以叱咤风云。我们先看下 urlopen() 的 API:

urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None,context=None)
  • data 是 bytes 类型的内容,可通过 bytes()函数转为化字节流。它也是可选参数。使用 data 参数,请求方式变成以 POST 方式提交表单。使用标准格式是application/x-www-form-urlencoded
  • timeout 参数是用于设置请求超时时间。单位是秒。
  • cafilecapath代表 CA 证书和 CA 证书的路径。如果使用HTTPS则需要用到。
  • context参数必须是ssl.SSLContext类型,用来指定SSL设置
  • 该方法也可以单独传入urllib.request.Request对象
  • 该函数返回结果是一个http.client.HTTPResponse对象。
使用 urllib.request.urlopen() 去请求百度贴吧,并获取到它页面的源代码。
import urllib.request

url = "http://tieba.baidu.com"
response = urllib.request.urlopen(url)
html = response.read()         # 获取到页面的源代码
print(html.decode(‘utf-8‘))    # 转化为 utf-8 编码

1.2 设置请求超时

有些请求可能因为网络原因无法得到响应。因此,我们可以手动设置超时时间。当请求超时,我们可以采取进一步措施,例如选择直接丢弃该请求或者再请求一次。

import urllib.request

url = "http://tieba.baidu.com"
response = urllib.request.urlopen(url, timeout=1)
print(response.read().decode(‘utf-8‘))

1.3 使用 data 参数提交数据

在请求某些网页时需要携带一些数据,我们就需要使用到 data 参数。

import urllib.parse
import urllib.request

url = "http://www.baidu.com/"
params = {
  ‘name‘:‘TTT‘,
  ‘author‘:‘Miracle‘
}

data = bytes(urllib.parse.urlencode(params), encoding=‘utf8‘)
response = urllib.request.urlopen(url, data=data)
print(response.read().decode(‘utf-8‘))

params 需要被转码成字节流。而 params 是一个字典。我们需要使用 urllib.parse.urlencode() 将字典转化为字符串。再使用 bytes() 转为字节流。最后使用 urlopen() 发起请求,请求是模拟用 POST 方式提交表单数据。

注意:当url地址含有中文或者“/”的时候,这是就需要用做urlencode一下编码转换。urlencode的参数是词典,它可以将key-value这样的键值对转换成我们想要的格式

1.4 使用 Request

由上我们知道利用 urlopen() 方法可以发起简单的请求。但这几个简单的参数并不足以构建一个完整的请求,如果请求中需要加入headers(请求头)、指定请求方式等信息,我们就可以利用更强大的Request类来构建一个请求。
按照国际惯例,先看下 Request 的构造方法:

urllib.request.Request(url, data=None, headers={}, origin_req_host=None,unverifiable=False, method=None)
  • data 参数跟 urlopen() 中的 data 参数用法相同。
  • headers 参数是指定发起的 HTTP 请求的头部信息。headers 是一个字典。它除了在 Request 中添加,还可以通过调用 Reques t实例的 add_header() 方法来添加请求头。
  • origin_req_host 参数指的是请求方的 host 名称或者 IP 地址。
  • unverifiable 表示请求是否是无法验证的,默认False。意思就是说用户没有足够权限来选择接收这个请求的结果。例如我们请求一个HTML文档中的图片,但是我们没有自动抓取图像的权限,我们就要将 unverifiable 的值设置成 True。
  • method 参数指的是发起的 HTTP 请求的方式,有 GET、POST、DELETE、PUT等
1.4.1 简单使用 Request

使用 Request 伪装成浏览器发起 HTTP 请求。如果不设置 headers 中的 User-Agent,默认的User-AgentPython-urllib/3.5。可能一些网站会将该请求拦截,所以需要伪装成浏览器发起请求。我使用的 User-Agent 是 Chrome 浏览器。

#修改User-Agent为chrome的UA进行伪装
import urllib.request

url = "http://tieba.baidu.com/"
headers = {
    ‘User-Agent‘: ‘Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36‘
}
request = urllib.request.Request(url=url, headers=headers)
response = urllib.request.urlopen(request)
print(response.read().decode(‘utf-8‘))

1.4.2 Request 高级用法

如果我们需要在请求中添加代理、处理请求的 Cookies,我们需要用到HandlerOpenerDirector

1) Handler
Handler 的中文是处理者、处理器。 Handler 能处理请求(HTTP、HTTPS、FTP等)中的各种事情。它的具体实现是这个类 urllib.request.BaseHandler。它是所有的 Handler 的基类,其提供了最基本的Handler的方法,例如default_open()、protocol_request()等。
继承 BaseHandler 有很多个,我就列举几个比较常见的类:

  • ProxyHandler:为请求设置代理
  • HTTPCookieProcessor:处理 HTTP 请求中的 Cookies
  • HTTPDefaultErrorHandler:处理 HTTP 响应错误。
  • HTTPRedirectHandler:处理 HTTP 重定向。
  • HTTPPasswordMgr:用于管理密码,它维护了用户名密码的表。
  • HTTPBasicAuthHandler:用于登录认证,一般和 HTTPPasswordMgr 结合使用。

2) OpenerDirector
对于 OpenerDirector,我们可以称之为 Opener。我们之前用过 urlopen() 方法,实际上它就是 urllib 为我们提供的一个Opener。那 Opener 和 Handler 又有什么关系?opener 对象是由 build_opener(handler) 方法来创建出来 。我们需要创建自定义的 opener,就需要使用 install_opener(opener)方法。值得注意的是,install_opener 实例化会得到一个全局的 OpenerDirector 对象。

1.5 使用代理

我们已经了解了 opener 和 handler,接下来我们就通过示例来深入学习。第一个例子是为 HTTP 请求设置代理
有些网站做了浏览频率限制。如果我们请求该网站频率过高。该网站会被封 IP,禁止我们的访问。所以我们需要使用代理来突破这“枷锁”。

import urllib.request

url = "http://tieba.baidu.com/"
headers = {
    ‘User-Agent‘: ‘Mozilla/5.0 AppleWebKit/537.36 Chrome/56.0.2924.87 Safari/537.36‘
}

proxy_handler = urllib.request.ProxyHandler({
    ‘http‘: ‘web-proxy.oa.com:8080‘,
    ‘https‘: ‘web-proxy.oa.com:8080‘
})
opener = urllib.request.build_opener(proxy_handler)
urllib.request.install_opener(opener)

request = urllib.request.Request(url=url, headers=headers)
response = urllib.request.urlopen(request)
print(response.read().decode(‘utf-8‘))        
1.6 认证登录

有些网站需要携带账号和密码进行登录之后才能继续浏览网页。碰到这样的网站,我们需要用到认证登录。我们首先需要使用 HTTPPasswordMgrWithDefaultRealm() 实例化一个账号密码管理对象;然后使用 add_password() 函数添加账号和密码;接着使用 HTTPBasicAuthHandler() 得到 hander;再使用 build_opener() 获取 opener 对象;最后使用 opener 的 open() 函数发起请求。

第二个例子是携带账号和密码请求登录博客园,代码如下:

import urllib.request
url = "http://cnblogs.com/xtznb/"
user = ‘奇迹‘
password = ‘password‘
pwdmgr = urllib.request.HTTPPasswordMgrWithDefaultRealm()
pwdmgr.add_password(None,url,user,password)

auth_handler = urllib.request.HTTPBasicAuthHandler(pwdmgr)
opener = urllib.request.build_opener(auth_handler)
response = opener.open(url)
print(response.read().decode(‘utf-8‘))
1.7 Cookies设置

如果请求的页面每次需要身份验证,我们可以使用 Cookies 来自动登录,免去重复登录验证的操作。获取 Cookies 需要使用 http.cookiejar.CookieJar() 实例化一个 Cookies 对象。再用 urllib.request.HTTPCookieProcessor 构建出 handler 对象。最后使用 opener 的 open() 函数即可。

第三个例子是获取请求百度贴吧的 Cookies 并保存到文件中,代码如下:

import http.cookiejar
import urllib.request

url = "http://tieba.baidu.com/"
fileName = ‘cookie.txt‘

cookie = http.cookiejar.CookieJar()
handler = urllib.request.HTTPCookieProcessor(cookie)
opener = urllib.request.build_opener(handler)
response = opener.open(url)

f = open(fileName,‘a‘)
for item in cookie:
    f.write(item.name+" = "+item.value+‘\n‘)
f.close()

1.8 HTTPResponse

从上面的例子可知, 使用 urllib.request.urlopen() 或者 opener.open(url) 返回结果是一个 http.client.HTTPResponse 对象。它具有 msg、version、status、reason、debuglevel、closed等属性以及read()、readinto()、getheader(name)、getheaders()、fileno()等函数。

2 错误解析

发起请求难免会出现各种异常,我们需要对异常进行处理,这样会使得程序比较人性化。
异常处理主要用到两个类,urllib.error.URLErrorurllib.error.HTTPError

  • URLError
    URLError 是 urllib.error 异常类的基类, 可以捕获由urllib.request 产生的异常。
    它具有一个属性reason,即返回错误的原因。

捕获 URL 异常的示例代码:

import urllib.request
import urllib.error

url = "http://www.google.com"
try:
    response = request.urlopen(url)
except error.URLError as e:
    print(e.reason)
  • HTTPError HTTPError 是 UEKRrror 的子类,专门处理 HTTP 和 HTTPS 请求的错误。它具有三个属性。

  1)code:HTTP 请求返回的状态码。

  2)reason:与父类用法一样,表示返回错误的原因。

  3)headers`:HTTP 请求返回的响应头信息。

获取 HTTP 异常的示例代码, 输出了错误状态码、错误原因、服务器响应头

import urllib.request
import urllib.error

url = "http://www.google.com"
try:
    response = request.urlopen(url)
except error.HTTPError as e:
   print(‘code: ‘ + e.code + ‘\n‘)
   print(‘reason: ‘ + e.reason + ‘\n‘)
   print(‘headers: ‘ + e.headers + ‘\n‘)


原文地址:https://www.cnblogs.com/xtznb/p/10960396.html

时间: 2024-10-21 06:36:21

Python之urllib库详解的相关文章

python urllib库详解

Python的内置HTTP请求库 urllib.request  请求模块 urllib.error  异常处理模块 urllib.parse   url解析模块 urllib.robotparse    robots.txt解析模块 1 import urllib.request 2 from urllib.parse import urlparse,urlunparse,urljoin,urlencode 3 import http.cookiejar 4 from urllib impor

爬虫(二):Urllib库详解

什么是Urllib: python内置的HTTP请求库 urllib.request : 请求模块 urllib.error : 异常处理模块 urllib.parse: url解析模块 urllib.robotparser  : robots.txt解析模块 GET请求方式     POST请求方式     超时timeout,异常处理     响应类型(响应码,响应头...)     POST请求添加Headers     代理方法     cookie添加 读取     ---------

python requests第三方库详解

方法说明 requests库的7个主要方法 方法 说明 说明 requests.request() 构造一个请求,支撑以下各方法的基础方法   requests.get(url, params=None, **kwargs) 获取HTML网页的主要方法,对应于HTTP的GET . params : url中的额外参数,字典或字节流格式,可选 ? **kwargs: 12个控制访问的参数 requests.head() 获取HTML网页头信息的方法,对应于HTTP的HEAD   requests.

Python中time模块详解

在Python中,与时间处理有关的模块就包括:time,datetime以及calendar.这篇文章,主要讲解time模块. 在开始之前,首先要说明这几点: 在Python中,通常有这几种方式来表示时间:1)时间戳 2)格式化的时间字符串 3)元组(struct_time)共九个元素.由于Python的time模块实现主要调用C库,所以各个平台可能有所不同. UTC(Coordinated Universal Time,世界协调时)亦即格林威治天文时间,世界标准时间.在中国为UTC+8.DST

Python对Excel操作详解

  Python对Excel操作详解 文档摘要: 本文档主要介绍如何通过python对office excel进行读写操作,使用了xlrd.xlwt和xlutils模块.另外还演示了如何通过Tcl  tcom包对excel操作. 关键字: Python.Excel.xlrd.xlwt.xlutils.TCl.tcom     1 Python简介 Python是一种面向对象.直译式电脑编程语言,具有近二十年的发展历史,成熟且稳定.它包含了一组完善而且容易理解的标准库,能够轻松完成很多常见的任务.

Python中time模块详解(转)

Python中time模块详解(转) 在平常的代码中,我们常常需要与时间打交道.在Python中,与时间处理有关的模块就包括:time,datetime以及calendar.这篇文章,主要讲解time模块. 在开始之前,首先要说明这几点: 在Python中,通常有这几种方式来表示时间:1)时间戳 2)格式化的时间字符串 3)元组(struct_time)共九个元素.由于Python的time模块实现主要调用C库,所以各个平台可能有所不同. UTC(Coordinated Universal Ti

Python数据类型及其方法详解

Python数据类型及其方法详解 我们在学习编程语言的时候,都会遇到数据类型,这种看着很基础也不显眼的东西,却是很重要,本文介绍了python的数据类型,并就每种数据类型的方法作出了详细的描述,可供知识回顾. 一.整型和长整型 整型:数据是不包含小数部分的数值型数据,比如我们所说的1.2.3.4.122,其type为"int" 长整型:也是一种数字型数据,但是一般数字很大,其type为"long" 在python2中区分整型和长整型,在32位的机器上,取值范围是-2

Struts标签库详解【3】

struts2标签库详解 要在jsp中使用Struts2的标志,先要指明标志的引入.通过jsp的代码的顶部加入以下的代码: <%@taglib prefix="s" uri="/struts-tags" %> If elseif  else 描述: 执行基本的条件流转. 参数: 名称 必需 默认 类型 描述 备注 test 是 boolean 决定标志里的内容是否显示的表达式 else标志没有这个参数 id 否 Object/String 用来标识元素的

python中threading模块详解(一)

python中threading模块详解(一) 来源 http://blog.chinaunix.net/uid-27571599-id-3484048.html threading提供了一个比thread模块更高层的API来提供线程的并发性.这些线程并发运行并共享内存. 下面来看threading模块的具体用法: 一.Thread的使用 目标函数可以实例化一个Thread对象,每个Thread对象代表着一个线程,可以通过start()方法,开始运行. 这里对使用多线程并发,和不适用多线程并发做