在入门urllib2以前,我想应该先调研一下urllib与urllib2的区别[1].首先咱们要明白的是,这两个模块不能够相互替代.二者都是接受URL请求的模块,可是提供了不一样的功能,两个显著的区别是:html
1. 对于一个URL的request,urllib2.urlopen能够接受一个request类的实例做为参数, 从而设置HTTP请求的headers; 而urllib却只能够接受一个URL,这意味着你用urllib不能假装user agent字符串(假装成浏览器请求).python
2. urllib提供了一个urlencode方法,用来产生GET请求字符串,而urllib2却没有提供这个函数,这也是咱们还须要urllib来配合urllib2进行使用的缘由之一.浏览器
此外,urllib.urlretrieve和urllib.quote等一系列quote和unquote函数没有被假如到urllib2里面,所以也须要urllib的协助.服务器
还有一点须要注意的是: requests模块可能urllib2模块要好用,二者可能学一便可.cookie
1. urllib2.urlopen()函数的使用函数
urllib2为咱们提供了一个很基础的函数: urlopen(url[,data,[timeout]]), 来帮助咱们经过给定的URL来获取网页数据(网页源代码), 返回该对象(从里面能够读数据); 参数url: 能够是包含url的字符串, 也能够是urllib2.Request类的实例. 参数data: 是通过编码的POST数据(能够使用urllib.urlencode()编码, 注意是urllib里面的函数). 参数timeout: 是可选的超时时间(单位秒), 供全部阻塞操做内部使用.post
import urllib2 # url = 'https://www.zhihu.com/people/vihu' # 待访问的url response = urllib2.urlopen(url) # 请求访问/打开这个url urlContent = response.read() # 读取内容
读取的部份内容以下图所示:ui
再看下面的代码, 获得的结果和上面是相同的. HTTP基于请求-应答的机制. 由主机发出请求(Request), 而后由服务器端提供应答(urlopen). urllib2.Request(url[,data][,headers][,origin_req_host][,unverifiable]), 参数url: 请求的网址; 参数data: POST data; 参数headers: 头部编码
import urllib2 url = 'https://www.zhihu.com/people/vihu' req = urllib2.Request(url) # 建立一个请求对象 response = urllib2.urlopen(req) # 返回一个相关请求的response对象 urlContent = response.read()
2. Cookielib模块 url
cookielib主要用于提供可存储cookie的对象, 以便于urllib2模块进行配合来访问网页的数据. jar的中文翻译为"文件"
CookieJar
|
FileCookieJar
/ \
MozillaCookieJar LWPCookieJar
1) CookieJar()
管理HTTP cookie的值, 存储HTTP请求获得的cookie, 向传出的HTTP请求添加cookie对象.
2) FileCookieJar
3) MozilaCookieJar(filename, delayload=None, policy=None)
Mozila的中文翻译为"浏览器", 建立于浏览器cookies.txt兼容的FileCookieJar实例.
4) LWPCookieJar(filename, delayload=None, policy=None)
建立与libwww-perl的Set-Cookie3文件格式相兼容的FileCookieJar实例.
下面是从网上找到的登陆人人网的代码:
#! /usr/bin/env python #coding=utf-8 import urllib2 import urllib import cookielib # 你的用户名和登陆密码 data = {"email":"passbye@126.com","password":"123456"} # 生成的post_data为: password=123456&email=passbye%40126.com post_data = urllib.urlencode(data) # 用假如header,须要使用Request对象; 对有些header要注意,服务器会对其进行检查; 下面假装成Microsoft IE 6.0 见[2] headers = {"User-agent":"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1"} # 发出请求 req = urllib2.Request("http://www.renren.com/PLogin.do",post_data,headers)
# 生成一个带cookie的opener, opener是urllib2.OpenerDirector的一个实例
cj = cookielib.CookieJar() # 建立一个CookieJar, 尚未存Cookie handler = urllib2.HTTPCookieProcessor(cj) # 利用HTTPCookieProcessor对象来建立cookie处理器
opener = urllib2.build_opener(handler) # 利用build_opener来建立opener
# 这里的open方法和urlopen使用相似 content = opener.open(req) print content2.read().decode("utf-8").encode("gbk")
headers: 两个词之间用 - 分隔.
post_data:
我的信息(帐号/密码)写在post_data里面, 键的命名要跟你你的网页来定义, 下面是人人网的, 用email, password关键词.
[1] Python:difference between urllib and urllib2: http://www.hacksparrow.com/python-difference-between-urllib-and-urllib2.html
[2] Python标准库urllib2使用细节(文章): http://zhuoqiang.me/python-urllib2-usage.html
[3] 总结整理时下流行的浏览器User-Agent大全: http://www.360doc.com/content/12/1012/21/7662927_241124973.shtml
[4] urllib-URL handling modules: https://docs.python.org/3/library/urllib.html