Python网络编程中urllib2模块的用法总结

一、最基础的应用

import urllib2

url = r'http://www.baidu.com'
html = urllib2.urlopen(url).read()

print html

客户端与服务器端通过request与response来沟通,客户端先向服务端发送request,然后接收服务端返回的response

urllib2提供了request的类,可以让用户在发送请求前先构造一个request的对象,然后通过urllib2.urlopen方法来发送请求

import urllib2

url = r'http://www.baidu.com'
req = urllib2.Request(url)
html = urllib2.urlopen(req).read()
print html

上例中先使用

req = urllib2.Request(url)

实例化一个resquest对象,接下来使用

urllib2.urlopen(req)

来打开这个网页。

我们注意到在实例化Request对象的时候,队了url是必须的,还有几个默认的参数

基中data与header也是使用的比较多的,一些需要登录的才能浏览的网站经常需要这两个参数

import urllib
import urllib2 

url = 'http://www.baidu.com/'
values = {'name' : 'Michael Foord', 'location' : 'Northampton','language' : 'Python' }
data = urllib.urlencode(values)
req = urllib2.Request(url,data)
response = urllib2.urlopen(req)
the_page = response.read()

print the_page

这个例子是向百度发送几个数据,这个例子是会返回一个错误页面,很正常,因为我们在访问百度的时候并不需要post什么信息,post了倒是会出错

百度是找不到相应的网页就会报错。

当然这个是POST数据,也可以用在GET方法,稍将上面的代码进行改造

百度是通过http://www.baidu.com/s?wd=XXX 来进行查询的,这样我们需要将{‘wd':'xxx'}这个字典进行urlencode

#coding:utf-8
import urllib
import urllib2 

url = 'http://www.baidu.com/s'
values = {'wd':'杨彦星'}
data = urllib.urlencode(values)
print data
url2 = url+'?'+data
response = urllib2.urlopen(url2)
the_page = response.read()

print the_page

以下以模拟登录人人网然后再显示首页内容为例来详细说明一下cookie的使用,以下是文档中给的例子,我们就通过改造这个例子来实现我们想要的功能

import cookielib, urllib2
cj = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
r = opener.open("http://example.com/")

#coding:utf-8
import urllib2,urllib
import cookielib

url = r'http://www.renren.com/ajaxLogin'

#创建一个cj的cookie的容器
cj = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
#将要POST出去的数据进行编码
data = urllib.urlencode({"email":email,"password":pass})
r = opener.open(url,data)
print cj

当你看到有cj的时候,说明你已经访问了登录页面,是否正常登录你现在还看不出来,可以通过访问http://www.renren.com/home 来查看

上面的代码有两点要说明,我也是看了很长时间才明白

r = opener.open(url,data) 

这句,为什么要使用opener这个对象来open,而不是用utllib2,urlopen?不光是例子里这么写,我们才这么写,通过改造我们也可以使用urllib2.urlopen,其实是因为opener是urllib2.bulid_opener创造出来的, 但是你可以这样理解,他build出来后,自已却并没有安装使用它,也没有它的属性与方法,如果想使urllib2也具有opener的属性与方法,可以先使用urllib2.install_opener(opener)来"安装"这个opener,安装完以后就可以使用urllib2来操作了

#coding:utf-8
import urllib2,urllib
import cookielib

url = r'http://www.renren.com/ajaxLogin'

#创建一个cj的cookie的容器
cj = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
urllib2.install_opener(opener)
#将要POST出去的数据进行编码
data = urllib.urlencode({"email":email,"password":pass})
#r = opener.open(url,data)如果没有上面的urllib2.install_opener方法,就必须这样写了
r = urllib2.urlopen(url,data)
html = urllib2.urlopen('http://www.renren.com/home').read()

print html

同样urllib2还有proxy相关的handle,基本的思路和这个差不多。

二、异常处理

当urlopen()不能处理响应时会引起URLError异常。HTTPError异常是URLError的一个子类,只有在访问HTTP类型的URL时才会引起。

1、URLError异常

通常引起URLError的原因是:无网络连接(没有到目标服务器的路由)、访问的目标服务器不存在。在这种情况下,异常对象会有reason属性(是一个(错误码、错误原因)的元组)。

#! /usr/bin/env python
#coding=utf-8
import urllib2

url="http://www.baidu.com/"
try:
 response=urllib2.urlopen(url)
except urllib2.URLError,e:
 print e.reason

2、HTTPError
每一个从服务器返回的HTTP响应都有一个状态码。其中,有的状态码表示服务器不能完成相应的请求,默认的处理程序可以为我们处理一些这样的状态码(如返回的响应是重定向,urllib2会自动为我们从重定向后的页面中获取信息)。有些状态码,urllib2模块不能帮我们处理,那么urlopen函数就会引起HTTPError异常,其中典型的有404/401。
HTTPError异常的实例有整数类型的code属性,表示服务器返回的错误状态码。
urllib2模块默认的处理程序可以处理重定向(状态码是300范围),而且状态码在100-299范围内表示成功。因此,能够引起HTTPError异常的状态码范围是:400-599.
当引起错误时,服务器会返回HTTP错误码和错误页面。你可以将HTPError实例作为返回页面,这意味着,HTTPError实例不仅有code属性,还有read、geturl、info等方法。

#! /usr/bin/env python
#coding=utf-8
import urllib2

url="http://cs.scu.edu.cn/~duanlei"
try:
 response=urllib2.urlopen(url)
except urllib2.HTTPError,e:
 print e.code
 print e.read()

3、总结
如果想在代码中处理URLError和HTTPError有两种方法,代码如下:

#! /usr/bin/env python
#coding=utf-8
import urllib2
url="xxxxxx" #需要访问的URL
try:
 response=urllib2.urlopen(url)
except urllib2.HTTPError,e: #HTTPError必须排在URLError的前面
 print "The server couldn't fulfill the request"
 print "Error code:",e.code
 print "Return content:",e.read()
except urllib2.URLError,e:
 print "Failed to reach the server"
 print "The reason:",e.reason
else:
 #something you should do
 pass #其他异常的处理
#! /usr/bin/env python
#coding=utf-8
import urllib2
url="http://xxx" #需要访问的URL
try:
 response=urllib2.urlopen(url)
except urllib2.URLError,e:
 if hasattr(e,"reason"):
 print "Failed to reach the server"
 print "The reason:",e.reason
 elif hasattr(e,"code"):
 print "The server couldn't fulfill the request"
 print "Error code:",e.code
 print "Return content:",e.read()
else:
 pass #其他异常的处理

相比较而言,第二种异常处理方法更优。

(0)

相关推荐

  • Python的网络编程库Gevent的安装及使用技巧

    安装(以CentOS为例) gevent依赖libevent和greenlet: 1.安装libevent 直接yum install libevent 然后配置python的安装 2.安装easy_install (1) wget -q http://peak.telecommunity.com/dist/ez_setup.py (2)使用 python ez_setup.py (3)使用easy_install 查看命令是否可用,如果不可用可以讲路径加入到PATH中 3.安装greenlet

  • Python网络编程详解

    1.服务器就是一系列硬件或软件,为一个或多个客户端(服务的用户)提供所需的"服务".它存在唯一目的就是等待客户端的请求,并响应它们(提供服务),然后等待更多请求. 2.客户端/服务器架构既可以应用于计算机硬件,也可以应用于计算机软件. 3.在服务器响应客户端之前,首先会创建一个通信节点,它能够使服务器监听请求. 一.套接字:通信端点 1.套接字 套接字是计算机网络数据结构,它体现了上节中所描述的"通信端点"的概念.在任何类型的通信开始之前,网络应用程序必须创建套接字

  • 从零开始学Python第八周:详解网络编程基础(socket)

    一,Socket编程 (1)Socket方法介绍 Socket是网络编程的一个抽象概念.通常我们用一个Socket表示"打开了一个网络链接",而打开一个Socket需要知道目标计算机的IP地址和端口号,再指定协议类型即可. 套接字是一个双向的通信信道的端点.套接字可能在沟通过程,进程之间在同一台机器上,或在不同的计算机之间的进程 要创建一个套接字,必须使用Socket模块的socket.socket()方法 在socket模块中的一般语法: s = socket.socket(sock

  • python 网络编程常用代码段

    服务器端代码: # -*- coding: cp936 -*- import socket sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)#初始化socket sock.bind(("127.0.0.1", 8001))#绑定本机地址,8001端口 sock.listen(5)#等待客户连接 while True: print "waiting client connection..." connec

  • python网络编程之文件下载实例分析

    本文实例讲述了python网络编程之文件下载实现方法.分享给大家供大家参考.具体如下: 真是越看越喜欢python啊,想要了解它提供的http和ftp下载功能,原来是如此的简单. 1.相应模块 ftplib模块定义了FTP类和一些方法,用以进行客户端的ftp编程.我们可用python编写一个自已的ftp客户端程序,用于下载文件或镜像站点.如果想了解ftp协议的详细内容,请参考RFC959或是查看python帮助吧. Urllib模块提供了非常高级的接口来从网络上抓取数据,主要使用到的是urlop

  • 详解Python Socket网络编程

    Socket 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的,例如我们每天浏览网页.QQ 聊天.收发 email 等等.要解决网络上两台主机之间的进程通信问题,首先要唯一标识该进程,在 TCP/IP 网络协议中,就是通过 (IP地址,协议,端口号) 三元组来标识进程的,解决了进程标识问题,就有了通信的基础了. 本文主要介绍使用Python 进行TCP Socket 网络编程,假设你已经具

  • Python网络编程中urllib2模块的用法总结

    一.最基础的应用 import urllib2 url = r'http://www.baidu.com' html = urllib2.urlopen(url).read() print html 客户端与服务器端通过request与response来沟通,客户端先向服务端发送request,然后接收服务端返回的response urllib2提供了request的类,可以让用户在发送请求前先构造一个request的对象,然后通过urllib2.urlopen方法来发送请求 import ur

  • Python函数式编程中itertools模块详解

    目录 容器与可迭代对象 count() 函数 cycle 函数 repeat 函数 enumerate 函数,添加序号 accumulate 函数 chain 与 groupby 函数 zip_longest 与 zip tee 函数 compress 函数 islice.dropwhile.takewhile.filterfalse.filter 总结 容器与可迭代对象 在正式开始前先补充一些基本概念在 Python 中存在容器 与 可迭代对象 容器:用来存储多个元素的数据结构,例如 列表,元

  • python中sets模块的用法实例

    本文实例简单讲述了python中sets模块的用法,分享给大家供大家参考. 具体方法如下: import sets magic_chars = sets.Set('abracadabra') print magic_chars poping_chars = sets.Set('supercalifragilisticeexpialidocious') print poping_chars print "".join(magic_chars & poping_chars) 程序运

  • python中ConfigParse模块的用法

    本文实例讲述了python中ConfigParse模块的用法,分享给大家供大家参考.具体方法如下: 写配置一般用ConfigParse.RawConfigParse类 读配置用ConfigParse.ConfigParse类 代码如下: 写配置文件: import ConfigParser import time config = ConfigParser.RawConfigParser() task = {} task["id"] = 1 task["package&quo

  • Python中numpy模块常见用法demo实例小结

    本文实例总结了Python中numpy模块常见用法.分享给大家供大家参考,具体如下: import numpy as np arr = np.array([[1,2,3], [2,3,4]]) print(arr) print(type(arr)) print('number of dim:', arr.ndim) print('shape:', arr.shape) print('size:', arr.size) [[1 2 3]  [2 3 4]] number of dim: 2 sha

  • python中pdb模块实例用法

    大家可能都不大熟悉关于pdb这个模块,实际上就是python中的内置模块,主要作用于命令行调试代码,下面我们将通过是哪个小结给大家详细介绍下使用该内容的方式,首先是简单介绍,然后为大家呈现实例,最后就是总结啦,小伙伴是不是相当期待呢,那就板正做好,一起来详细了解下吧~ 简单介绍: 添加断点-代码后添加一行 pdb.set_trace() 命令行添加断点 b line_number 常见命令: 进入命令行Debug模式,python -m pdb xxx.py h:(help)帮助 w:(wher

  • 详解Python中openpyxl模块基本用法

    Python操作EXCEL库的简介 1.1 Python官方库操作excel Python官方库一般使用xlrd库来读取Excel文件,使用xlwt库来生成Excel文件,使用xlutils库复制和修改Excel文件,这三个库只支持到Excel2003. 1.2 第三方库openpyxl介绍 第三方库openpyxl(可读写excel表),专门处理Excel2007及以上版本产生的xlsx文件,xls和xlsx之间转换容易. 注意:如果文字编码是"gb2312" 读取后就会显示乱码,请

  • python中decimal模块的用法

    目录 1. Decimal类型的优点 2. decimal模块的构成 3. context 4. Signals 5. Round类型 查看python3.4.1文档,发现对于decimal模块的讲解非常多,由此可见其功能也很强大(下面算是把我认为比较重要的半翻译半学习吧~).文档关于decimal模块的总解释是Decimal fixed point and floating point arithmetic,我理解的是固定小数点和浮点运算.头加上from decimal import * 即可

  • 一文详解Python中logging模块的用法

    目录 一.低配logging 1.v1 2.v2 3.v3 二.高配logging 1.配置日志文件 2.使用日志 三.Django日志配置文件 一.低配logging 日志总共分为以下五个级别,这个五个级别自下而上进行匹配 debug-->info-->warning-->error-->critical,默认最低级别为warning级别. 1.v1 import logging logging.debug('调试信息') logging.info('正常信息') logging

  • python网络编程学习笔记(一)

    学习用书:<python 网络编程基础>作者John Goerzen 第一部分底层网络学习 Python提供了访问底层操作系统Socket接口的全部方法,需要的时候这些接口可以提供灵活而强有力的功能. (1)基本客户端操作 在<python 网络编程基础>一书中,作者列出了一个简单的Python客户端程序,具体如下: 复制代码 代码如下: import socket,sysport =70host=sys.argv[1] filename=sys.argv[2] s=socket.

随机推荐