urllib包
Posted lalavender
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了urllib包相关的知识,希望对你有一定的参考价值。
- urllib包提供了一个高级接口,用于编写需要与HTTP服务器、FTP服务器和本地文件交互的客户端。典型的应用程序包括从网页抓取数据、自动化、代理、Web爬虫等。
1. urllib.request ()
- 该模块最常见的用途是通过HTTP从Web服务器获取数据。
- urlopen(url [,data [,timeout]
打开 URL url并返回类文件对象,可使用该对象读取返回的数据。简言之,url可以是包含URL的字符串,也可以是 Request类实例。data是URL编码的字符串,包含要上传到服务器的表单数据。
如果提供了data,那么实际使用的就是HTTP"PosT‘方法,而不是‘GET’(默认值)。通常使用urllib.parse.urlencode()之类的函数创建数据。timeout是可选的超时期(以秒为单位),内部存在阻塞操作时使用。
u = urllib.request.urlopen()
- urlopen()返回的类文件对象u支持以下方法。
方法 描述 u.read( [nbytes]) u.readline() u.readlines() u.fileno() u.close () u.info () u.getcode() u.geturl() 需要特别强调的是类文件对象υ以二进制模式操作。如果需要以文本形式处理响应数据,则需要使用 codecs模块或类似方式解码数据。
对于简单的请求来说urlopen()的url参数就是一个字符串,如
http://www.pythonorg
如果需要执行更加复杂的操作,如修改HTTP请求报头,可创建Request实例并使用其作为url参数。Request(url [,data [,headers [,origin_ reg host [,unverifiable]]]])
- url指定URL(如http://www.foo.bar/spam.htm1‘.)
- data是URL编码的数据,要通过HTTP请求上传到服务器。提供该参数时,它将HTTP请求类型从‘GET‘改为‘POST‘。
- headers是一个字典,包含了可表示HITP报头内容的键值映射。
- origin_reg host设为事务的请求主机,通常是发出请求的主机名称。
如果请求的是无法验证的URL,则 unveri fiable设为rue。无法验
证的URL的非正式定义是:不是用户直接输入的URL,如加载图像的页面中嵌入的URL。unverifiable的默认值是False,
r= urllib.request.Request()
- Request的实例r具有以下方法
方法 描述 r.add_ data(data) r.add_ header (key, val) r.add_unredirected-header(key, val) r.get_data() r.get_ full_url() r.get_host() r.get_method () r.get_origin_rea_host() r.get_ selector() r.get_ type () r.has_data() r.is_unverifiable() r.has_ header(header) r.set_proxy(host, type) 2. 自定义opener
基本的urlopen()函数不支持验证、cookie或者其他高级HTTP功能。要支持这些功能,必须使用 build_opener(函数创建自己的自定义 opener对象
- build_opener([handler [, handler2,...]]
- 构建用于打开URL的自定义opener对象。参数 handler1、 handler2等都是特殊处理程序对象的实例。这些处理程序的目的是向得到的opener对象添加各种功能。
- build_opener()返回的对象具有open(ur1[,data[, timeout]])方法,其作用是根据各种处理程序提供的规则打开URL。open()的参数与传递ur⊥open()函数的参数相同。
- insta11。 pener【 opener)
安装不同的opener对象作为ur1open()使用的全局URL opener。opener通常是 build_opener()创建的opener对象。
3. 密码验证
- 要处理涉及密码验证的请求,你可以创建一个opener,往其中添加
HttpbasIcautHhandLer、HttpdiGest Authhandler、 ProxyBasicAuthHandler或 ProxyDigestAuthHandler
的组合。这些处理程序都具有以下方法,可用来设置密码。 - h.add_ password(realm, uri, user, passwd)
为给定的域和UR添加用户和密码信息。所有参数都是字符串。uxi可以是URI序列,在这种情况下,用户和密码信息适用于序列中的所有URI。 realm是与验证相关联的名称或描述信息。它的值取决于远程服务器。但是,它通常是与相关网页关联的常用名称。uri是与验证相关联的基础URL.realm和uri的常见值类似于(‘adminIstrator‘,‘http://www.somesite.com‘)user和password分别
指定用户名和密码。4. Http Cookie
如果要管理 Http cookie,需要创建添加了 HttpcooKieprocessor处理程序的 opener对象。例如:
cookiehand = HttpcoOkiepRoceSsor()
opener build_opener(cookiehand)
u=opener.open("http://www.example.com/")
- 默认情况下HttpcoOkieprOcesSor使用httpcookiejar模块中的Cookiejar对象。将不同类型的 Cookiejar对象作为 HttpcookieProcessor的参数提供,可以支持不同类型的 cookie处理方法。
例如:
cookiehand=httpcookieprocessor(
httpcookiejar.Mozillacookiejar("cookies.txt")
opener build_opener(cookiehand)
u=opener.open("http://www.examplecom/)
5. 代理
如果需要通过代理重定向请求,可创建 ProxyHandler实例。
Proxy Handler(proxies])创建通过代理路由请求的代理处理程序。参数proxies是一个字典,将协议名称(如‘http,‘ftp等)映射到相应代理服务器的URL。下例演示了如何使用该方法:
proxy=proxyhandler(('http':'htTp://someproxy.com8080/')
auth=httpbasicauthhandler()
auth.add_password("realm","host","username","password")
opener = build _opener(proxy.auth)
u=openeropen("http://www.examplecom/doc.html")
urllib. response
这是一个内部模块,实现了ur11ib. request模块中函数返回的类文件对象。没有公共API。
urllib.parse
- ur11ib.parse模块用于操作URL字符串,如"http:/www.python.org"。
1.URL解析
URL的一般形式为" scheme://netloc/path; parameters? query# fragment"。另外,URL的netloc部分可能包含一个端口号,如" hostname:port",也可能包含用户验证信息,如"user:[email protected]"。
- 以下函数用于解析URL:
urlparse(urlstring [ default_ scheme [ allow fragments]])
- 在urlstring中解析URL并返回ParseResult实例。如果URL中没有任何内容,则default_scheme指定要使用的方案("http","ftp"等)。如果allow_fragments为0,则不支持片段标识符。
ParseResult实例r是一个指定的元组,形式为( scheme, net loc,path, parameters, query,fragment)。
- 该实例还定义了以下只读属性。
属性 描述 r.scheme r.netloc r.path r.params r.query r.fragment r.username r.password r.hostname r.port 使用r.geturl()可将 ParseResult实例转换回URL字符串.
- urlunparse(parts)
- 将 urlparse()返回的元组表示形式的URL转换为URL字符串。parts必须是元组或者具有6个组件的可迭代内容。
urlsplit(url [ default_ scheme [ allow fragments]])
- 该方法与 unlparse(类似,不同之处在于URL的 parameters部分在路径中保持不变。该方法可以解析参数附加在单个路径组件上的URL,如‘ scheme:/ net loc/ path1; paramlpath2; paran2/
path3? query# fragment‘。返回的结果是 SplitResult的实例,是包含( scheme,net1oc,path,query, fragment)的指定元组。 - 还定义了以下只读属性。
| 属性 | 描述 |
| :--- | :--- |
| r.scheme | |
| r.netloc | |
| r.path | |
| r.query | |
| r.fragment | |
| r.username | |
| r.password | |
| r.hostname | |
| r.port | | 使用 r.geturl()可将 SplitResult实例转换回URL字符串。
urldefrag(url)
- 返回元组( newurl, fragment),其中newurl是去除了片段的url部分, fragment是包含片段部分的字符串(如果有)。如果url中没有任何片段,则newurl与url相同, fragment为空字符串。
urljoin(base, url [ allow_fragments])
通过组合基础 URL base和相对URL构造绝对URL。url.a11ow_fragments的含义与 unlparse()中的含义相同。如果基础URL的最后一个组件不是目录,则去除最后的组件。
parse_gs(gs [, keep_blank_values [ strict_parsing]l)
解析URL编码的(MME类型为 application/x-www-form- urlencode)查询字符串qs,并返回字典,其中键是查询变量名称,值是为每个名称定义的值列表。
keep_blank_values
是一个布尔值标志,控制如何处理空白值。如果为True,则它们包含在字典中,值设置为空字符串;如果为False(默认值),则将其丢弃。 strict_ parsing是一个布尔值标志,如果为πrue,则将解析错误转换为Valueerror异常。默认情况下会忽略错误。- parse_qsl(gs [ ,keep_blank_vaLues[ ,strict parsing]])
该方法与 parse_qs()类似,不同之处在于返回的结果是一个(name, value)对列表,其中name是查询变量的名称, value是值。
2.URL编码
以下函数可对组成URL的数据进行编码和解码。
- quote(string [ safe [ encoding [ errors]]])
使用适合URL内容的转义序列替换 string中的特殊字符。字母、数字和下划线()、逗号(,)句号(.)、连字符(-)都保持不变。所有其他字符都转换为‘%xx‘形式的转义序列。safe提供由其他不应该带有引号的字符组成的字符串,默认为‘/‘。 encoding指定对非ASCI字符使用的编码。默认情况下是utf-8。 errors指定遇到编码错误时的操作,默认值是‘strict‘。
quote_plus(string [ safe [ encoding [ errors]]])
调用quote()并使用加号替换所有空格。string,safe, quote()中的含义相同 encoding和 errors。
quote_from_bytes(bytes [ safe])
该方法与 quote类似,但是接受字节字符串且不执行编码。返回的值为文本字符串。
unquote(string [ encoding [ errors]])
使用转义序列对应的单字符替换‘xx‘形式的转义序列。 encoding和 errors指定‘xx‘转义中编码数据的编码和错误处理。默认编码是‘utf-8‘,默认的 errors策略是‘replace‘。
unquote_ plus(string [ encoding [ errors]])
该方法与 unquote()类似,但使用加号替换空格。
**unquote_to__bytes(string)**
该方法与 unquote(类似,但是不执行任何编码并返回字节字符串。
urlencode(query [,dosed])
将query中的查询值转换为一个URL编码的字符串,该字符串可以作为URL的 query.参数包括在内,或者可以作为POST请求的一部分上传。 query是字典,或者是一个(key, value)对序列。得到的字符串是以"&字符分隔的‘key=va1ue‘对序列,其中key和 value都使用 quote_plus()引用。
dosed参数是一个布尔值标志,如果 query中的vaue是序列,则应该设置为rue,表示同一个键有多个值。在这种情况下,将为value中的每个v创建一个单独的"key=v字符串。
- 设置headers
- 代理的设置
- Timeout的设置
- cookies的使用
以上是关于urllib包的主要内容,如果未能解决你的问题,请参考以下文章
Python练习册 第 0013 题: 用 Python 写一个爬图片的程序,爬 这个链接里的日本妹子图片 :-),(http://tieba.baidu.com/p/2166231880)(代码片段