urllib2使用初探
在入门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使用初探的更多相关文章
- 初探接口测试框架--python系列6
点击标题下「蓝色微信名」可快速关注 坚持的是分享,搬运的是知识,图的是大家的进步,没有收费的培训,没有虚度的吹水,喜欢就关注.转发(免费帮助更多伙伴)等来交流,想了解的知识请留言,给你带来更多价值,是 ...
- 初探领域驱动设计(2)Repository在DDD中的应用
概述 上一篇我们算是粗略的介绍了一下DDD,我们提到了实体.值类型和领域服务,也稍微讲到了DDD中的分层结构.但这只能算是一个很简单的介绍,并且我们在上篇的末尾还留下了一些问题,其中大家讨论比较多的, ...
- CSharpGL(8)使用3D纹理渲染体数据 (Volume Rendering) 初探
CSharpGL(8)使用3D纹理渲染体数据 (Volume Rendering) 初探 2016-08-13 由于CSharpGL一直在更新,现在这个教程已经不适用最新的代码了.CSharpGL源码 ...
- 从273二手车的M站点初探js模块化编程
前言 这几天在看273M站点时被他们的页面交互方式所吸引,他们的首页是采用三次加载+分页的方式.也就说分为大分页和小分页两种交互.大分页就是通过分页按钮来操作,小分页是通过下拉(向下滑动)时异步加载数 ...
- JavaScript学习(一) —— 环境搭建与JavaScript初探
1.开发环境搭建 本系列教程的开发工具,我们采用HBuilder. 可以去网上下载最新的版本,然后解压一下就能直接用了.学习JavaScript,环境搭建是非常简单的,或者说,只要你有一个浏览器,一个 ...
- .NET文件并发与RabbitMQ(初探RabbitMQ)
本文版权归博客园和作者吴双本人共同所有.欢迎转载,转载和爬虫请注明原文地址:http://www.cnblogs.com/tdws/p/5860668.html 想必MQ这两个字母对于各位前辈们和老司 ...
- React Native初探
前言 很久之前就想研究React Native了,但是一直没有落地的机会,我一直认为一个技术要有落地的场景才有研究的意义,刚好最近迎来了新的APP,在可控的范围内,我们可以在上面做任何想做的事情. P ...
- 【Python网络爬虫二】使用urllib2抓去网页内容
在Python中通过导入urllib2组件,来完成网页的抓取工作.在python3.x中被改为urllib.request. 爬取具体的过程类似于使用程序模拟IE浏览器的功能,把URL作为HTTP请求 ...
- 【手把手教你全文检索】Apache Lucene初探
PS: 苦学一周全文检索,由原来的搜索小白,到初次涉猎,感觉每门技术都博大精深,其中精髓亦是不可一日而语.那小博猪就简单介绍一下这一周的学习历程,仅供各位程序猿们参考,这其中不涉及任何私密话题,因此也 ...
随机推荐
- 洛谷 P1436 棋盘分割 解题报告
P1436 棋盘分割 题目描述 将一个8*8的棋盘进行如下分割:将原棋盘割下一块矩形棋盘并使剩下部分也是矩形,再将剩下的两部分中的任意一块继续如此分割,这样割了(n-1)次后,连同最后剩下的矩形棋盘共 ...
- 【hdu3555】 Bomb
http://acm.hdu.edu.cn/showproblem.php?pid=3555 (题目链接) 题意 求区间${[1,n]}$含有49的数的个数. Solution 数位dp,先求出不含4 ...
- WEB入门二 表格和表单
学习内容 Ø 表格的作用和制作 Ø 表单的制作 能力目标 Ø 掌握表格的创建 Ø 掌握设置表格的常用属性: Ø 理解表单的作用 Ø ...
- 遇到问题----java----myeclipse或者eclipse发布的项目时配置文件不更新或者无配置文件
myeclipse或者eclipse发布的项目时配置文件不更新或者无配置文件. 正常的web项目有目录 src/main/resources 和 src/main/java 这两个目录默认在编译发布时 ...
- Lnmp上安装Yaf学习(二)
上一节主要实践了在Lnmp上安装Yaf扩展,那么这一节将测试 Yaf 的一个简单demo的运行. 一.通过Lnmp 创建 vhost 文件 [root@localhost yaf-3.0.6]# ln ...
- dev代码拷贝中文乱码的解决方案
.c / .cpp文件用记事本打开,再拷贝
- HDU 3271 数位dp+二分
SNIBB Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
- 【Asp.net入门15】第一个Asp.net应用程序-输入验证
前言 所谓输入验证,顾名思义就是验证用户输入符不符合要求.前面我们已经完成了这个简单的应用程序,但还有一个问题需要解决:用户可以在Default.aspx窗体中 提交任何数据,甚至可以提交根本不包含任 ...
- Python高手之路【四】python函数装饰器,迭代器
def outer(func): def inner(): print('hello') print('hello') print('hello') r = func() print('end') p ...
- VS批处理命令使用
在项目开始生成或者生成完成后想做一些操作,比如去编译非解决方案下的的项目,完成编译后复制文件到某个文件夹之类的纠结需求. 1. 基本使用 预先生成事件命令行,可以在项目编译的过程中运行 后期生成事件命 ...