在入门urllib2之前,我想应该先调研一下urllib与urllib2的区别[1].首先我们要明白的是,这两个模块不可以相互替代.两者都是接受URL请求的模块,但是提供了不同的功能,两个显著的区别是:

1. 对于一个URL的request,urllib2.urlopen可以接受一个request类的实例作为参数, 从而设置HTTP请求的headers; 而urllib却只可以接受一个URL,这意味着你用urllib不能伪装user agent字符串(伪装成浏览器请求).

2. urllib提供了一个urlencode方法,用来产生GET请求字符串,而urllib2却没有提供这个函数,这也是我们还需要urllib来配合urllib2进行使用的原因之一.

此外,urllib.urlretrieve和urllib.quote等一系列quote和unquote函数没有被假如到urllib2里面,因此也需要urllib的协助.

还有一点需要注意的是: requests模块可能urllib2模块要好用,两者可能学一即可.

1. urllib2.urlopen()函数的使用

urllib2为我们提供了一个很基础的函数: urlopen(url[,data,[timeout]]), 来帮助我们通过给定的URL来获取网页数据(网页源代码), 返回该对象(从里面可以读数据); 参数url: 可以是包含url的字符串, 也可以是urllib2.Request类的实例. 参数data: 是经过编码的POST数据(可以使用urllib.urlencode()编码, 注意是urllib里面的函数). 参数timeout: 是可选的超时时间(单位秒), 供所有阻塞操作内部使用.

import urllib2  # 

url = 'https://www.zhihu.com/people/vihu'   # 待访问的url
response = urllib2.urlopen(url) # 请求访问/打开这个url
urlContent = response.read() # 读取内容

读取的部分内容如下图所示:

再看下面的代码, 得到的结果和上面是相同的. 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模块

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":""} # 生成的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: 两个词之间用 - 分隔.

  • User-agent: 有些服务器或者Proxy(代理)会通过该值来判断是否是浏览器发出的请求.(有的服务端拒绝程序来访问, 这时候需要将程序伪装成浏览器来访问, 请求的方式包含在header中). User-agent的中文名为用户代理, 是一个特殊字符串头, 使得服务器能够识别客户使用的操作系统及版本, CPU类型, 浏览器版本, 浏览器渲染引擎, 浏览器语言, 浏览器插件等等. Mozilla/Version (Platform; Encryption;
  • Content-Type: 在使用REST接口时, 服务器会检查该值, 用来确定HTTP Body中的内容应该怎么解析! 常见的如: 'text/html','image/jpeg'等.

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

urllib2使用初探的更多相关文章

  1. 初探接口测试框架--python系列6

    点击标题下「蓝色微信名」可快速关注 坚持的是分享,搬运的是知识,图的是大家的进步,没有收费的培训,没有虚度的吹水,喜欢就关注.转发(免费帮助更多伙伴)等来交流,想了解的知识请留言,给你带来更多价值,是 ...

  2. 初探领域驱动设计(2)Repository在DDD中的应用

    概述 上一篇我们算是粗略的介绍了一下DDD,我们提到了实体.值类型和领域服务,也稍微讲到了DDD中的分层结构.但这只能算是一个很简单的介绍,并且我们在上篇的末尾还留下了一些问题,其中大家讨论比较多的, ...

  3. CSharpGL(8)使用3D纹理渲染体数据 (Volume Rendering) 初探

    CSharpGL(8)使用3D纹理渲染体数据 (Volume Rendering) 初探 2016-08-13 由于CSharpGL一直在更新,现在这个教程已经不适用最新的代码了.CSharpGL源码 ...

  4. 从273二手车的M站点初探js模块化编程

    前言 这几天在看273M站点时被他们的页面交互方式所吸引,他们的首页是采用三次加载+分页的方式.也就说分为大分页和小分页两种交互.大分页就是通过分页按钮来操作,小分页是通过下拉(向下滑动)时异步加载数 ...

  5. JavaScript学习(一) —— 环境搭建与JavaScript初探

    1.开发环境搭建 本系列教程的开发工具,我们采用HBuilder. 可以去网上下载最新的版本,然后解压一下就能直接用了.学习JavaScript,环境搭建是非常简单的,或者说,只要你有一个浏览器,一个 ...

  6. .NET文件并发与RabbitMQ(初探RabbitMQ)

    本文版权归博客园和作者吴双本人共同所有.欢迎转载,转载和爬虫请注明原文地址:http://www.cnblogs.com/tdws/p/5860668.html 想必MQ这两个字母对于各位前辈们和老司 ...

  7. React Native初探

    前言 很久之前就想研究React Native了,但是一直没有落地的机会,我一直认为一个技术要有落地的场景才有研究的意义,刚好最近迎来了新的APP,在可控的范围内,我们可以在上面做任何想做的事情. P ...

  8. 【Python网络爬虫二】使用urllib2抓去网页内容

    在Python中通过导入urllib2组件,来完成网页的抓取工作.在python3.x中被改为urllib.request. 爬取具体的过程类似于使用程序模拟IE浏览器的功能,把URL作为HTTP请求 ...

  9. 【手把手教你全文检索】Apache Lucene初探

    PS: 苦学一周全文检索,由原来的搜索小白,到初次涉猎,感觉每门技术都博大精深,其中精髓亦是不可一日而语.那小博猪就简单介绍一下这一周的学习历程,仅供各位程序猿们参考,这其中不涉及任何私密话题,因此也 ...

随机推荐

  1. Spring小节

    Spring的总结 Spring的核心: 1. Spring的两大核心: 1. IOC: 控制反转,将创建(实例化)对象的权利交给Spring容器去进行管理. 2. AOP: 面向切面编程(将切面织入 ...

  2. Android listview与adapter用法(BaseAdapter + getView)

    Android listview与adapter用法http://www.cnblogs.com/zhengbeibei/archive/2013/05/14/3078805.html package ...

  3. 微服务Kong(八)——代理参考

    Kong侦听四个端口的请求,默认情况是: 8000:此端口是Kong用来监听来自客户端的HTTP请求的,并将此请求转发到您的上游服务.这也是本教程中最主要用到的端口. 8443:此端口是Kong监听H ...

  4. salt源码安装

    salt是什么? 一种全新的基础设施管理方式,部署轻松,在几分钟内可运行起来,扩展性好,很容易管理上万台服务器,速度够快,服务器之间秒级通讯. salt底层采用动态的连接总线, 使其可以用于编配, 远 ...

  5. shell参数代表什么,如何调试shell?

    $0就是该bash文件名$?是上一指令的返回值$*所有位置参数的内容:就是调用调用本bash shell的参数.$@基本上与上面相同.只不过是“$*”返回的是一个字符串,字符串中存在多外空格.“$@” ...

  6. 源码中transient的用途

    Java的serialization提供了一种持久化对象实例的机制.当持久化对象时,可能有一个特殊的对象数据成员,我们不想用serialization机制来保存它.为了在一个特定对象的一个域上关闭se ...

  7. bzoj千题计划163:bzoj1060: [ZJOI2007]时态同步

    http://www.lydsy.com/JudgeOnline/problem.php?id=1060 以激发器所在节点为根 终止节点一定是叶节点 记录点的子树内最深的终止节点 然后从根往下使用道具 ...

  8. 通过网络仓库建立本地的yum仓库

    [root@kazihuo ~]# yum -y install createrepo yum-utils [root@kazihuo ~]# yum -y install https://mirro ...

  9. Java并发编程原理与实战三十六:阻塞队列&消息队列

    一.阻塞队列 1.阻塞队列BlockingQueue ---->可以理解成生产者消费者的模式---->消费者要等待到生产者生产出来产品.---->而非阻塞队列ConcurrentLi ...

  10. 【学习DIV+CSS】1. 你必须知道的三个知识

    1. DIV+CSS的叫法不够严谨 我们以前做页面布局的时候大多是用Table,很多人称之为“Table+CSS”,而现在比较流行的是DIV布局,所以称之为“DIV+CSS”.听起来是挺合理的,岂不知 ...