资讯专栏INFORMATION COLUMN

Python标准库学习之urllib

NusterCache / 1799人阅读

摘要:本系列以为基础是的标准网络请求库。包含了网络数据请求,处理改变请求头和用户代理,重定向,认证等的函数。超时单位为秒参数必须是的实例返回值返回一个可以作为的对象。返回的个部分,分别是机制网络位置路径路径段参数查询片段。

本系列以python3.4为基础
urllib是Python3的标准网络请求库。包含了网络数据请求,处理cookie,改变请求头和用户代理,重定向,认证等的函数。
urllib与urllib2?:python2.x用urllib2,而python3改名为urllib,被分成一些子模块:urllib.request,urllib.parse,urllib.error,urllib.robotparser.尽管函数名称大多和原来一样,但是使用新的urllib库时需要注意哪些函数被移动到子模块里了。

HTTP版本:HTTP/1.1,包含Connection:close 头

特别常用的函数:urllib.request.urlopen()

同类型开源库推荐:requests

urllib:用来处理网络请求和操作url。有以下子模块

urllib.request 打开后读取url内容

urllib.error 包含由urllib.request抛出的异常类

urllib.parse 解析URL

urllib.robotparser 解析robots.txt files

简单的例子
from urllib.request import urlopen
html=urlopen("https://www.baidu.com")
print(html.geturl(),html.info(),html.getcode(),sep="
")
print(html.read().decode("UTF-8"))
from urllib import request
with request.urlopen("https://api.douban.com/v2/book/2129650") as f:
    data = f.read()
    print("Status:", f.status, f.reason)
    for k, v in f.getheaders():
        print("%s: %s" % (k, v))
    print("Data:", data.decode("utf-8"))
from urllib import request
req = request.Request("http://www.douban.com/") #设置请求头
req.add_header("User-Agent", "Mozilla/6.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/8.0 Mobile/10A5376e Safari/8536.25")
with request.urlopen(req) as f:
    print("Status:", f.status, f.reason)
    for k, v in f.getheaders():
        print("%s: %s" % (k, v))
    print("Data:", f.read().decode("utf-8"))
import urllib.request
data = parse.urlencode([ #进行url编码参数
    ("username", "xby")]
req = urllib.request.Request(url="https://www.baidu.com",
                     data=data)
with urllib.request.urlopen(req) as f:
    print(f.read().decode("utf-8"))
from urllib import request, parse
print("Login to weibo.cn...")
email = input("Email: ")
passwd = input("Password: ")
login_data = parse.urlencode([ #进行url编码参数
    ("username", email),
    ("password", passwd),
    ("entry", "mweibo"),
    ("client_id", ""),
    ("savestate", "1"),
    ("ec", ""),
    ("pagerefer", "https://passport.weibo.cn/signin/welcome?entry=mweibo&r=http%3A%2F%2Fm.weibo.cn%2F")
])
req = request.Request("https://passport.weibo.cn/sso/login") 
req.add_header("Origin", "https://passport.weibo.cn")
req.add_header("User-Agent", "Mozilla/6.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/8.0 Mobile/10A5376e Safari/8536.25")
req.add_header("Referer", "https://passport.weibo.cn/signin/login?entry=mweibo&res=wel&wm=3349&r=http%3A%2F%2Fm.weibo.cn%2F")
with request.urlopen(req, data=login_data.encode("utf-8")) as f:
    print("Status:", f.status, f.reason)
    for k, v in f.getheaders():
        print("%s: %s" % (k, v))
    print("Data:", f.read().decode("utf-8"))
urllib.request
urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)

url参数可以是字符串或者urllib.request.Request对象

data参数必须是字节形式。可以通过from urllib import parse parse.urlencode()来处理得到。如果没有提供dat参数则为GET请求,否则为POST请求。

[tomeout,]超时单位为秒

context参数必须是ssl.SSLContext的实例

返回值:返回一个可以作为contextmanager的对象。它有一些方法和属性:
geturl()
info()-元数据信息,比如headers
getcode()-http响应码,比如200
read()-获取内容,字节形式
status
reason

对于Http(s)请求,返回的一个http.client.HTTPResponse对象。常用方法getheaders(),read()
对于ftp,file请求,返回一个urllib.response.addinfourl对象

可能抛出的异常urllib.error.URLError,urllib.error.HTTPError

class urllib.request.Request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None)
通过这个对象我们可以设置请求数据,添加请求头,同时可以获取一些url信息:比如协议类型,主机。也可以设置代理Request.set_proxy(host, type)

class urllib.request.OpenerDirector以及关联的urllib.request.install_opener(opener),urllib.request.build_opener([handler, …])
方法:OpenerDirector.add_handler(handler) ,这个handler对象必须继承urllib.request.BaseHandler,常见的有
urllib.request.BaseHandler -基类
urllib.request.HTTPDefaultErrorHandler
urllib.request.HTTPRedirectHandler
urllib.request.HTTPCookieProcessor
urllib.request.ProxyHandler
urllib.request.HTTPBasicAuthHandler
urllib.request.HTTPSHandler
例子:

import urllib.request
# Create an OpenerDirector with support for Basic HTTP Authentication...
auth_handler = urllib.request.HTTPBasicAuthHandler()
auth_handler.add_password(realm="PDQ Application",
                          uri="https://mahler:8092/site-updates.py",
                          user="klem",
                          passwd="kadidd!ehopper")
opener = urllib.request.build_opener(auth_handler)
# ...and install it globally so it can be used with urlopen.
urllib.request.install_opener(opener)
urllib.request.urlopen("http://www.example.com/login.html")
proxy_handler = urllib.request.ProxyHandler({"http": "http://www.example.com:3128/"})
proxy_auth_handler = urllib.request.ProxyBasicAuthHandler()
proxy_auth_handler.add_password("realm", "host", "username", "password")
 
opener = urllib.request.build_opener(proxy_handler, proxy_auth_handler)
# This time, rather than install the OpenerDirector, we use it directly:
opener.open("http://www.example.com/login.html")
异常处理

可能抛出的异常urllib.error.URLError,urllib.error.HTTPError
exception urllib.error.URLError :有以下属性:reason
exception urllib.error.HTTPError 它是URLError的一个子类,有以下属性:
code
reason
headers

from urllib.request import Request, urlopen
from urllib.error import URLError, HTTPError
req = Request("http://www.baidu.com/")
try:
    response = urlopen(req)
except HTTPError as e:
    print("Error code: ", e.code)
except URLError as e:
    print("We failed to reach a server.")
    print("Reason: ", e.reason)
else:
    print("good!")
print(response.read().decode("utf8"))
urllib.parse

urllib.parse.urlparse函数会将一个普通的url解析为6个部分,返回的数据类型为ParseResult对象,通过访问其属性可以获取对应的值。
同时,它还可以将已经分解后的url再组合成一个url地址(通过urlunparse(parts))。返回的6个部分,分别是:scheme(机制)、netloc(网络位置)、path(路径)、params(路径段参数)、query(查询)、fragment(片段)。

urllib.parse.urlencode(query, doseq=False, safe=" ", encoding=None, errors=None),注意:query参数是一个序列对象

通过urllib.request.urlretrieve下载文件

urllib.request.urlretrieve(url,savefilepath)

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/44227.html

相关文章

  • python标准库学习之pickle模块

    摘要:利用标准库中的的模块可以将对象转换为一种可以传输或存储的格式。主要方法模块中有两个主要函数,它们是和。具体语法为返回一个字符串,而不是存入文件中。该方法用于反序列化,即将序列化的对象重新恢复成对象。除此之外,这两个模块的接口是几乎完全相同。 对象存在于程序运行时的内存中,当程序不再运行时或断电关机时,这些对象便不再存在。我现在想把对象保存下来,方便以后使用,这就是持久化技术。利用 py...

    宠来也 评论0 收藏0
  • python标准库学习之zipfile模块

    摘要:模块里有两个非常重要的分别是和。返回一个对象,它包括文件的详细信息。将文档内的指定文件解压到当前目录。为文件路径,为添加到文档之后保存的名称参数表示压缩方法,它的值可以是或。预留字段,当前实现总是返回。 ZipFile模块里有两个非常重要的class, 分别是 ZipFile和ZipInfo。ZipFile是主要的类,用来创建和读取zip文件,而ZipInfo是存储的zip文件的每个文...

    Magicer 评论0 收藏0
  • DVWA学习之Brute Force

    摘要:运行结果片段发现密码的返回长度与其他不同,获得密码,爆破成功。源码分析加入了对登录失败次数做限制,防止爆破用了更为安全的机制防御注入 BurpSuite-Intruder笔记 Burp intruder是一个强大的工具,用于自动对Web应用程序自定义的攻击。它可以用来自动执行所有类型的任务您的测试过程中可能出现的 模块说明 Target 用于配置目标服务器进行攻击的详细信息 Posi...

    Near_Li 评论0 收藏0
  • Python3网络爬虫实战---22、使用Urllib:解析链接

    摘要:上一篇文章网络爬虫实战使用处理异常下一篇文章网络爬虫实战使用分析协议库里还提供了这个模块,它定义了处理的标准接口,例如实现各部分的抽取,合并以及链接转换。上一篇文章网络爬虫实战使用处理异常下一篇文章网络爬虫实战使用分析协议 上一篇文章:Python3网络爬虫实战---21、使用Urllib:处理异常下一篇文章:Python3网络爬虫实战---23、使用Urllib:分析Robots协议...

    betacat 评论0 收藏0
  • Python基础之(十)模块

    摘要:是回调函数,当链接服务器和相应数据传输完毕时触发本函数可选。仅仅是针对的,在中,已经没有这个模块了,取代它的是。由于以流式读取文件,从而速度较快,切少占用内存,但是操作上稍复杂,需要用户实现回调函数。 编写模块 模块是程序 模块就是一个扩展名为.py的Python程序。 编写模块 #!/usr/bin/env python # coding=utf-8 lang = python 引...

    jlanglang 评论0 收藏0

发表评论

0条评论

NusterCache

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<