python之web模块学习-- urllib2

下面继续学习python的web模块 ---  urllib2,一个源于urllib又高于urllib的模块。

1  urllib2 简介

urllib2是python自带的一个访问网页及本地文件的库。

与urllib相比,显著区别之处在于:

1) urllib2可以接受一个Request类的实例来设置URL请求的headers,urllib仅可以接受URL。这意味着,用urllib时不可以伪装User Agent字符串等。

2) urllib提供urlencode方法用来encode发送的data,而urllib2没有。这是为何urllib常和urllib2一起使用的原因。

2  urllib2 常用方法

2.1  urllib2.urlopen

urlopen()是最简单的请求方式,它打开url并返回类文件对象,并且使用该对象可以读取返回的内容

    urllib2.urlopen(url[, data][, timeout]) 
参数:
    url: 可以是包含url的字符串,也可以是urllib2.request类的实例。
    data: 是经过编码的post数据(一般使用urllib.urlencode()来编码)。
    没有data参数时为GET请求,设置data参数时为POST请求
    timeout: 是可选的超时期(以秒为单位),设置请求阻塞的超时时间,如果没有设置的话,会使用全局默认timeout参数,该参数只对HTTP、HTTPS、FTP生效

假设urlopen()返回的文件对象u,它支持下面的这些常用的方法:

  • u.read([nbytes]) 以字节字符串形式读取nbytes个数据
  • u.readline() 以字节字符串形式读取单行文本
  • u.readlines() 读取所有输入行然后返回一个列表
  • u.close() 关闭链接
  • u.getcode() 返回整数形式的HTTP响应代码,比如成功返回200,未找到文件时返回404
  • u.geturl() 返回所返回的数据的实际url,但是会考虑发生的重定向问题
  • u.info() 返回映射对象,该对象带有与url关联的信息,对HTTP来说,返回的服务器响应包含HTTP包头。对于FTP来说,返回的报头包含‘content-length‘。对于本地文件,返回的报头包含‘content-length’和‘content-type‘字段。

注意:

类文件对象u以二进制模式操作。如果需要以文本形式处理响应数据,则需要使用codecs模块或类似方式解码数据。

附代码:

>>> import urllib2
>>> res=urllib2.urlopen(‘http://www.51cto.com‘)
>>>res.read()
。。。。。。(一堆源代码)
>>>res.readline()
‘<!DOCTYPE html PUBLIC "-//W3C//DTDXHTML 1.0 Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\r\n‘
>>>res.readlines()
。。。(list形式的一堆源码)
>>>res.info()
<httplib.HTTPMessage instance at0x1a02638>
>>>res.getcode()
200
>>>res.geturl()
‘http://www.51cto.com‘
#最后关闭连接
>>> res.close()

2.2  urllib2.request

新建Request实例

    Request (url [data,headers[,origin_req_host ,[unverifiable]]]])
说明:
    对于比较简单的请求,urlopen()的参数url就是一个代表url的,但如果需要执行更复杂的操作,如修改HTTP报头,可以创建Request实例并将其作为url参数
参数:
    url: 为url字符串,
    data: 是伴随url提交的数据(比如要post的数据)。不过要注意,提供data参数时,它会将HTTP请求从‘GET‘改为‘POST’。
    headers: 是一个字典,包含了可表示HTTP报头的键值映射(即要提交的header中包含的内容)。
    origin_req_host: 通常是发出请求的主机的名称,如果请求的是无法验证的url(通常是指不是用户直接输入的url,比如加载图像的页面中镶入的url),则后一个参数unverifiable设为TRUE

假设Request实例r,其比较重要的方法有下面几个:

  • r.add_data(data) 向请求添加数据。如果请求是HTTP请求,则方法改为‘POST’。data是向指定url提交的数据,要注意该方法不会将data追教导之前已经设置的任何数据上,而是使用现在的data替换之前的。
  • r.add_header(key, val) 向请求添加header信息,key是报头名,val是报头值,两个参数都是字符串。
  • r.addunredirectedheader(key,val) 作用基本同上,但不会添加到重定向请求中。
  • r.set_proxy(host, type) 准备请求到服务器。使用host替换原来的主机,使用type替换原来的请求类型。

附代码:

1  向网页提交数据:

>>> import urllib
>>> import urllib2
>>> url=‘http://www.51cto.com‘
>>> info={‘name‘:"51cto",‘location‘:‘51cto‘}
#info需要被编码为urllib2能理解的格式,这里用到的是urllib
>>> data=urllib.urlencode(info)
>>> data
‘name=51cto&location=51cto‘
>>> request=urllib2.Request(url,data)
>>> response=urllib2.urlopen(request)
>>> the_page=response.read()

2  修改网页头信息:

有时会碰到,程序也对,但是服务器拒绝你的访问。这是为什么呢?问题出在请求中的头信息(header)。 有的服务端有洁癖,不喜欢程序来触摸它。这个时候你需要将你的程序伪装成浏览器来发出请求。请求的方式就包含在header中。

在使用 REST 接口时,Server 会检查Content-Type字段,用来确定 HTTP Body 中的内容该怎样解析。

>>> import urllib
>>> import urllib2
>>> url=‘http://www.51cto.com‘
# 将user_agent写入头信息
>>> user_agent=‘Mozilla/4.0 (compatible; MSIE 5.5; WindowsNT)‘
>>>values={‘name‘:‘51cto‘,‘location‘:"51cto",‘language‘:‘Python‘} 
>>> headers={‘User-Agent‘:user_agent}
>>> data=urllib.urlencode(values)
>>> req=urllib2.Request(url,data,headers)
>>> response=urllib2.urlopen(req)
>>> the_page=response.read()

2.3  异常处理

不能处理一个respons时,urlopen抛出一个urlerror

urllib2.URLError:  
urllib2.HTTPError:

HTTPerror是HTTP URL在特别的情况下被抛出的URLError的一个子类。

urlerror:
    通常,urlerror被抛出是因为没有网络 连接(没有至特定服务器的连接)或者特定的服务器不存在。在这种情况下,含有reason属性的异常将被抛出,以一种包含错误代码 和文本错误信息的tuple形式。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import urllib2
#多写了一个 m (comm)
req = urllib2.Request(‘http://www.51cto.comm‘)
try:
    urllib2.urlopen(req)
except urllib2.URLError,e:
    print e
    print e.reason

结果:

<urlopen error [Errno 11004] getaddrinfo failed>
[Errno 11004] getaddrinfo failed

以上是 urllib2的简单用法,如果要深入:

http://zhuoqiang.me/python-urllib2-usage.html

urllib和urllib2之间的区别:

http://www.cnblogs.com/yuxc/archive/2011/08/01/2124073.html

时间: 2024-10-27 03:11:47

python之web模块学习-- urllib2的相关文章

python之web模块学习-- urllib

准备写一些列的 python之web模块学习,基本上涉及常用的的web模块,包括 urllib.urllib2.httplib.urlparse.requests,现在,开始我们的第一个模块的学习吧. 1  urllib简介 python urllib 模块提供了一个从指定的URL地址获取网页数据,然后对其进行分析处理,获取我们想要的数据. 2  常用方法 2.1  urlopen  -- 创建一个类文件对象 为读取指定的URL help(urllib.urlopen) urlopen(url,

python之web模块学习-- urlparse

继续学习python的web模块,urlparse 是一个比较简单的模块,主要是用来 解析URL字符串的 1  urlparse简介 python使用urlparse来解析URL字符串 主要方法: urlprase 次要方法: urljoin urlsplit  urlunsplit等 2  urlparse详解 urlparse模块主要是把url拆分为6部分,并返回元组.并且可以把拆分后的部分再组成一个url.主要有函数有urljoin.urlsplit.urlunsplit.urlparse

python之web模块学习-- httplib

1  httplib简介 httplib 是python中http协议的客户端实现,可以使用该模块来与 HTTP 服务器进行交互 httplib是一个相对底层的http请求模块,其上有专门的包装模块,如urllib内建模块,goto等第三方模块,但是封装的越高就越不灵活,比如urllib模块里请求错误时就不会返回结果页的内容,只有头信息,对于某些需要检测错误请求返回值的场景就不适用,所以就得用这个模块了. httplib实现了HTTP和HTTPS的客户端协议,一般不直接使用,在python更高层

【Python】Python的urllib模块、urllib2模块进行网页下载文件

由于需要从某个网页上下载一些PDF文件,但是需要下载的PDF文件有几百个,所以不可能用人工点击来下载.正好Python有相关的模块,所以写了个程序来进行PDF文件的下载,顺便熟悉了Python的urllib模块和ulrllib2模块. 1.问题描述 需要从http://www.cvpapers.com/cvpr2014.html上下载几百个论文的PDF文件,该网页如下图所示: 2.问题解决 通过结合Python的urllib模块和urllib2模块来实现自动下载.代码如下: test.py #!

Python随机数random模块学习,并实现生成6位验证码

一.前言 学习python随机数random模块的使用 ,并使用模块中的函数,实现6位验证码生成 二.random模块 1.random.random() 返回0-1直接的随机数,类型为float >>>print(random.random()) 0.1259184691662908 2.random.randint(1, 8) 返回1-8直接的随机数,包括8 >>>print(random.randint(1, 8)) 3 3.random.choice() 从一个

[ python编程 ] subprocess模块学习总结

转载:http://www.jb51.net/article/48086.htm 从Python 2.4开始,Python引入subprocess模块来管理子进程,以取代一些旧模块的方法:如 os.system.os.spawn*.os.popen*.popen2.*.commands.*不但可以调用外部的命令作为子进程,而且可以连接到子进程的input/output/error管道,获取相关的返回信息. 一.subprocess以及常用的封装函数    运行python的时候,我们都是在创建并

Python的hashlib模块学习

python的hashlib模块提供一些常用的加密功能 例如获取字符串'Nobody inspects the spammish repetition'的MD5校验值 In [48]: import hashlib In [49]: m=hashlib.md5() In [50]: m.update('Nobody inspects') In [51]: m.update('the spammish repetition') In [52]: m.digest() Out[52]: '%\x8d

python简易web服务器学习笔记(二)

import BaseHTTPServer #------------------------------------------------------------------------------- class RequestHandler(BaseHTTPServer.BaseHTTPRequestHandler): '''Respond to HTTP requests with info about the request.''' # Template for page to sen

Python re正则表达式模块学习【转】

感谢原作者,本文转自:http://www.cnblogs.com/huxi/archive/2010/07/04/1771073.html 博主还有一些比较好的python文档在此一并推荐,可以移步查看. 文介绍了Python对于正则表达式的支持,包括正则表达式基础以及Python正则表达式标准库的完整介绍及使用示例.本文的内容不包括如何编写高效的正则表达式.如何优化正则表达式,这些主题请查看其他教程. 注意:本文基于Python2.4完成:如果看到不明白的词汇请记得百度谷歌或维基,whate