PYTHON REQUESTS的安装与简单运用

PYTHON REQUESTS的安装与简单运用

2013.07.09

强烈推荐!requests官方文档已有了中文版,请见http://cn.python-requests.org/zh_CN/latest/ 。

python requests文档上的那个龟requests是python的一个HTTP客户端库,跟urllib,urllib2类似,那为什么要用requests而不用urllib2呢?官方文档中是这样说明的:

python的标准库urllib2提供了大部分需要的HTTP功能,但是API太逆天了,一个简单的功能就需要一大堆代码。

我也看了下requests的文档,确实很简单,适合我这种懒人。下面就是一些简单指南。

1. 安装

安装很简单,我是win系统,就在这里下载了安装包(网页中download the tarball处链接),然后$ python setup.py install就装好了。当然,有easy_installpip的朋友可以直接使用:easy_install requests或者pip install requests来安装。至于linux用户,这个页面还有其他安装方法。测试:在IDLE中输入import requests,如果没提示错误,那说明已经安装成功了!

2. 小试牛刀

>>>import requests
>>> r = requests.get('http://www.zhidaow.com') # 发送请求 >>> r.status_code # 返回码 200 >>> r.headers['content-type'] # 返回头部信息 'text/html; charset=utf8' >>> r.encoding # 编码信息 'utf-8' >>> r.text #内容部分(PS,由于编码问题,建议这里使用r.content) u'<!DOCTYPE html>\n<html xmlns="http://www.w3.org/1999/xhtml"...' ... 

是不是很简单?比urllib2和urllib简单直观的多?!那请接着看快速指南吧。

3. 快速指南

3.1 发送请求

发送请求很简单的,首先要导入requests模块:

>>>import requests

接下来让我们获取一个网页,例如我个人博客的首页:

>>>r = requests.get('http://www.zhidaow.com') 

接下来,我们就可以使用这个r的各种方法和函数了。另外,HTTP请求还有很多类型,比如POST,PUT,DELETE,HEAD,OPTIONS。也都可以用同样的方式实现:

>>> r = requests.post("http://httpbin.org/post") >>> r = requests.put("http://httpbin.org/put") >>> r = requests.delete("http://httpbin.org/delete") >>> r = requests.head("http://httpbin.org/get") >>> r = requests.options("http://httpbin.org/get") 

因为目前我还没用到这些,所以没有深入研究。

3.2 在URLs中传递参数

有时候我们需要在URL中传递参数,比如在采集百度搜索结果时,我们wd参数(搜索词)和rn参数(搜素结果数量),你可以手工组成URL,requests也提供了一种看起来很NB的方法:

>>> payload = {'wd': '张亚楠', 'rn': '100'} >>> r = requests.get("http://www.baidu.com/s", params=payload) >>> print r.url u'http://www.baidu.com/s?rn=100&wd=%E5%BC%A0%E4%BA%9A%E6%A5%A0' 

上面wd=的乱码就是“张亚楠”的转码形式。(好像参数按照首字母进行了排序。)

3.3 获取响应内容

可以通过r.text来获取网页的内容。

>>> r = requests.get('https://www.zhidaow.com') >>> r.text u'<!DOCTYPE html>\n<html xmlns="http://www.w3.org/1999/xhtml"...' 

文档里说,requests会自动将内容转码。大多数unicode字体都会无缝转码。但我在cygwin下使用时老是出现UnicodeEncodeError错误,郁闷。倒是在python的IDLE中完全正常。另外,还可以通过r.content来获取页面内容。

>>> r = requests.get('https://www.zhidaow.com') >>> r.content b'<!DOCTYPE html>\n<html xmlns="http://www.w3.org/1999/xhtml"...' 

文档中说r.content是以字节的方式去显示,所以在IDLE中以b开头。但我在cygwin中用起来并没有,下载网页正好。所以就替代了urllib2的urllib2.urlopen(url).read()功能。(基本上是我用的最多的一个功能。)

3.4 获取网页编码

可以使用r.encoding来获取网页编码。

>>> r = requests.get('http://www.zhidaow.com') >>> r.encoding 'utf-8' 

当你发送请求时,requests会根据HTTP头部来猜测网页编码,当你使用r.text时,requests就会使用这个编码。当然你还可以修改requests的编码形式。

>>> r = requests.get('http://www.zhidaow.com') >>> r.encoding 'utf-8' >>>r.encoding = 'ISO-8859-1' 

像上面的例子,对encoding修改后就直接会用修改后的编码去获取网页内容。

3.5 json

像urllib和urllib2,如果用到json,就要引入新模块,如jsonsimplejson,但在requests中已经有了内置的函数,r.json()。就拿查询IP的API来说:

>>>r = requests.get('http://ip.taobao.com/service/getIpInfo.php?ip=122.88.60.28') >>>r.json()['data']['country'] '中国' 

3.6 网页状态码

我们可以用r.status_code来检查网页的状态码。

>>>r = requests.get('http://www.mengtiankong.com') >>>r.status_code 200 >>>r = requests.get('http://www.mengtiankong.com/123123/') >>>r.status_code 404 >>>r = requests.get('http://www.baidu.com/link?url=QeTRFOS7TuUQRppa0wlTJJr6FfIYI1DJprJukx4Qy0XnsDO_s9baoO8u1wvjxgqN') >>>r.url u'http://www.zhidaow.com/ >>>r.status_code 200 

前两个例子很正常,能正常打开的返回200,不能正常打开的返回404。但第三个就有点奇怪了,那个是百度搜索结果中的302跳转地址,但状态码显示是200,接下来我用了一招让他原形毕露:

>>>r.history
(<Response [302]>,) 

这里能看出他是使用了302跳转。也许有人认为这样可以通过判断和正则来获取跳转的状态码了,其实还有个更简单的方法:

>>>r = requests.get('http://www.baidu.com/link?url=QeTRFOS7TuUQRppa0wlTJJr6FfIYI1DJprJukx4Qy0XnsDO_s9baoO8u1wvjxgqN', allow_redirects = False) >>>r.status_code 302 

只要加上一个参数allow_redirects,禁止了跳转,就直接出现跳转的状态码了,好用吧?我也利用这个在最后一掌做了个简单的获取网页状态码的小应用,原理就是这个。

3.7 响应头内容

可以通过r.headers来获取响应头内容。

>>>r = requests.get('http://www.zhidaow.com') >>> r.headers { 'content-encoding': 'gzip', 'transfer-encoding': 'chunked', 'content-type': 'text/html; charset=utf-8'; ... } 

可以看到是以字典的形式返回了全部内容,我们也可以访问部分内容。

>>> r.headers['Content-Type'] 'text/html; charset=utf-8' >>> r.headers.get('content-type') 'text/html; charset=utf-8' 

3.8 设置超时时间

我们可以通过timeout属性设置超时时间,一旦超过这个时间还没获得响应内容,就会提示错误。

>>> requests.get('http://github.com', timeout=0.001) Traceback (most recent call last): File "<stdin>", line 1, in <module> requests.exceptions.Timeout: HTTPConnectionPool(host='github.com', port=80): Request timed out. (timeout=0.001) 

3.9 代理访问

采集时为避免被封IP,经常会使用代理。requests也有相应的proxies属性。

import requestsproxies = {"http": "http://10.10.1.10:3128", "https": "http://10.10.1.10:1080", } requests.get("http://www.zhidaow.com", proxies=proxies) 

如果代理需要账户和密码,则需这样:

proxies = {"http": "http://user:pass@10.10.1.10:3128/", } 

3.10 请求头内容

请求头内容可以用r.request.headers来获取。

>>> r.request.headers {'Accept-Encoding': 'identity, deflate, compress, gzip', 'Accept': '*/*', 'User-Agent': 'python-requests/1.2.3 CPython/2.7.3 Windows/XP'} 

3.11 自定义请求头部

伪装请求头部是采集时经常用的,我们可以用这个方法来隐藏:

r = requests.get('http://www.zhidaow.com') print r.request.headers['User-Agent'] #python-requests/1.2.3 CPython/2.7.3 Windows/XP headers = {'User-Agent': 'alexkh'} r = requests.get('http://www.zhidaow.com', headers = headers) print r.request.headers['User-Agent'] #alexkh 

3.12 持久连接keep-alive

requests的keep-alive是基于urllib3,同一会话内的持久连接完全是自动的。同一会话内的所有请求都会自动使用恰当的连接。

也就是说,你无需任何设置,requests会自动实现keep-alive。

4. 简单应用

4.1 获取网页返回码

def get_status(url):r = requests.get(url, allow_redirects = False) return r.status_code print get_status('http://www.zhidaow.com') #200 print get_status('http://www.zhidaow.com/hi404/') #404 print get_status('http://mengtiankong.com') #301 print get_status('http://www.baidu.com/link?url=QeTRFOS7TuUQRppa0wlTJJr6FfIYI1DJprJukx4Qy0XnsDO_s9baoO8u1wvjxgqN') #302 print get_status('http://www.huiya56.com/com8.intre.asp?46981.html') #500 

后记

1、官方文档requests的具体安装过程请看:http://docs.python-requests.org/en/latest/user/install.html#installrequests的官方指南文档:http://docs.python-requests.org/en/latest/user/quickstart.htmlrequests的高级指南文档:http://docs.python-requests.org/en/latest/user/advanced.html#advanced2、本文内容部分翻译自官方文档,部分自己归纳。3、大多数用的IDLE格式,累死了,下次直接用编辑器格式,这样更符合我的习惯。4、还是那句话,有问题留言或email。5、图注:requests官方文档上的一只老鳖。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/290168.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

7. 堪比JMeter的.Net压测工具 - Crank 总结篇 - crank带来了什么

1. 前言通过上面的学习&#xff0c;我们已经了解清楚crank的职责以及作用&#xff0c;那么我们重新回来思考一下&#xff0c;crank能为我们带来什么&#xff1f;2. Crank带来了什么&#xff1f;为分布式压测提供了解决方案、可以模拟更高强度的压测单机压测最多提供65535&#…

里rust怎么找蓝图_Rust错误处理

错误处理是程序开发中必不可少的一个环节&#xff0c;在Rust中&#xff0c;错误分成两个类别&#xff1a;可恢复错误和不可恢复错误。 可恢复错误&#xff1a;比如说未找到文件&#xff0c;Rust中用Result<T,E>来实现 不可恢复错误&#xff1a;比如数组访问越界&#xff…

转载牛X文章

2019独角兽企业重金招聘Python工程师标准>>> Java中有关Null的9件事&#xff1a; http://www.importnew.com/14229.html 深入理解java异常处理机制&#xff1a; http://blog.csdn.net/hguisu/article/details/6155636 Android JNI知识简介&#xff1a; http://blog.…

internet访问局域网内部方法之----------路由器端口映射

很多人每天都问为什么要端口映射&#xff1f;例如:通过路由器上网的&#xff0c;网站自己可以访问&#xff0c;但是别人就不能&#xff1b;输入127.0.0.1可以访问&#xff0c;别人还是看不到&#xff1b;输入localhost可以看到&#xff0c;但是别人就是看不到&#xff0c;气人啊…

Xamarin效果第四篇之CollectionView子项右侧布局

前面基于PopupPage然后实现了手机底部弹窗;今天再次基于他从手机右侧弹出一个可以交互的窗口;直接看看最终实现的效果:右侧弹窗不是重点主角是排行榜:我还是直接使用CollectionView然后对于头像那一块还是CollectionView然后通过修改他的子项和Header模板然后旋转让子项从右侧布…

java读取csv文件

2019独角兽企业重金招聘Python工程师标准>>> CSV其实就是COMMA SEPARATED VALUE的缩写。在开发中用Java操作csv文件有专门的的API叫javacsv.jar javacsv.jar下载地址&#xff1a; http://sourceforge.net/project/showfiles.php?group_id33066 package com.syc.tes…

两款JSON类库Jackson与JSON-lib的性能对比(新增第三款测试)

本篇文章主要介绍了"两款JSON类库Jackson与JSON-lib的性能对比(新增第三款测试)"&#xff0c;主要涉及到两款JSON类库Jackson与JSON-lib的性能对比(新增第三款测试)方面的内容&#xff0c;对于两款JSON类库Jackson与JSON-lib的性能对比(新增第三款测试)感兴趣的同学可…

子窗体菜单合并到父窗体菜单的解决办法

系统中既有父窗体又有子窗体&#xff0c;子窗体添加下拉菜单&#xff0c;运行时子窗体的菜单会合并到父窗体的菜单中&#xff0c;解决办法是&#xff0c;将子窗体菜单控件的AllowMerge属性设为false。

Android笔记:Activity

1.Android可视化界面结构: 一个Android应用的可视化界面最底层是Activity,在他之上是一个Window对象,在window之上通常是布局容器,再上面才是用户直接交互的组件(按钮,文本框)交互组件(UI控件)-->布局容器(layout)--->Window对象--->Activity2.Activity生命周期 …

ASP.NET Core使用编译时依赖关系注入(DI)

前言依赖关系注入(DI)&#xff0c;是一种在类及其依赖项之间实现控制反转(IoC)的技术。在ASP.NET Core中&#xff0c;依赖关系注入是“一等公民”&#xff0c;被大量使用。通常&#xff0c;使用接口作为依赖关系实现抽象化&#xff0c;并且在服务容器中注册依赖关系&#xff0c…

使其正序排序 打印一串数字_JavaScript计数排序算法

一、计数排序算法计数排序(Counting sort)是一种稳定的线性时间排序算法。该算法于1954年由 Harold H. Seward 提出。计数排序使用一个额外的数组&#xff0c;数组的下标对应待排序的数字。然后根据新数组的下标来获得正确的顺序。就像给每个位置按数字顺序做好标记&#xff0c…

shiro real的理解,密码匹配等

1 、定义实体及关系 即用户-角色之间是多对多关系&#xff0c;角色-权限之间是多对多关系&#xff1b;且用户和权限之间通过角色建立关系&#xff1b;在系统中验证时通过权限验证&#xff0c;角色只是权限集合&#xff0c;即所谓的显示角色&#xff1b;其实权限应该对应到资源&…

ASP.NET-----Repeater数据控件的用法总结(转)

ASP.NET-----Repeater数据控件的用法总结(转) 一、Repeater控件的用法流程及实例&#xff1a; 1、首先建立一个网站&#xff0c;新建一个网页index.aspx。 2、添加或者建立APP_Data数据文件&#xff0c;然后将用到的数据库文件放到APP_Data文件夹中。 3、打开数据库企业管理器&…

Jenkins修改管理员密码.

前言&#xff1a;Jenkins修改管理员密码&#xff0c;我看了网上所有的教程&#xff0c;竟然全都是拿着一串已经加密好的111111的密文去替代config.xml文件里面的密码&#xff0c;然后大家的密码都是111111&#xff01;我觉得这种做法实在太敷衍了&#xff01;于是我就研究了下&…

截取指定字符前_VBA学习笔记35-1:字符串拆分与组合

学习资源&#xff1a;《Excel VBA从入门到进阶》第35集 by兰色幻想本课的示例都在立即窗口展示运行结果&#xff0c;要在立即窗口展示的话要使用“Debug.Print”。Debug.Print 将代码执行结果显示在“立即窗口”中&#xff0c;但不影响程序执行。一、字符串截取1.left,right,mi…

c#Clay开源的动态语言dynamic框架,让您形如javascript的方式创建对象!

简介Clay非常类似于ExpandoObject, 可以看做是ExpandoObject的加强版. 它们能够让我们在不需要定义类的情况下&#xff0c;就构建出我们想要的对象。Clay和ExpandoObject相比&#xff0c;提供了更加灵活的语法支持&#xff0c;让我们像写javascript代码一样写C#代码&#xff0c…

7 种 JavaScript 技巧使你更聪明

1.总是颠倒逻辑 让我们从一个小优化开始&#xff0c;目的是为了使得非常简单的操作看起来复杂些。 if (x && y) { … } // bad if (!(!x || !y)) { … } // good2.在你的变量名字里使用扩展的unicode字符 编译好的软件一旦发布成产品&#xff0c;它必须是一个黑盒。这对…

设置访问权限_【新思考教学者思】李世松:不要对经典设置访问权限

不要对经典设置访问权限——《背影》备课札记文/李世松紫阳县举办课堂教学改革推进会&#xff0c;师训教研中心王主任电话通知我讲一节示范课。我知道&#xff0c;这既是对我的一种肯定&#xff0c;更是一次磨炼&#xff0c;因为我的师父邱俊老师会到现场点评课堂。自领受任务之…

C#使用Objects Comparer进行对象比较

介绍Objects Comparer是用于对象比较的工具&#xff0c;c#常见的数据结构都是可以用这个三方库进行对比&#xff0c;比较复杂的对象也是可以比较的。简而言之&#xff0c;Objects Comparer 是一个对象到对象的比较器&#xff0c;它允许逐个成员递归得比较对象&#xff0c;并为某…

ora22813操作数值超出系统的限制_最新:华为“鸿蒙”操作系统终于面世!一旦遭到限制,将随时启用...

受美国的要求&#xff0c;自5月开始&#xff0c;安卓暂停了与华为的部分合作&#xff0c;而这直接影响到了华为对安卓系统的正常更新。迫于无奈之下&#xff0c;华为对外表示&#xff0c;已经准备了备用系统&#xff0c;但只在必要的情况下使用&#xff0c;而这一系统就是广为人…