Python Requests安装与简单运用


Posted in Python onApril 07, 2016

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

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

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

插播个好消息!刚看到requests有了中文翻译版,建议英文不好的看看,内容也比我的博客好多了,具体链接是:http://cn.python-requests.org/en/latest/(不过是v1.1.0版,另抱歉,之前贴错链接了)。

1. 安装

安装很简单,我是win系统,就在这里下载了安装包(网页中download the zipball处链接),然后$ python setup.py install就装好了。

当然,有easy_install或pip的朋友可以直接使用: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,就要引入新模块,如json和simplejson,但在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 requests
proxies = {
"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

以上是针对Python Requests的安装与简单运用的介绍,希望对大家有所帮助!

三水点靠木推荐阅读:

Python 相关文章推荐
python模拟登录百度代码分享(获取百度贴吧等级)
Dec 27 Python
Python中列表元素转为数字的方法分析
Jun 14 Python
利用Python将每日一句定时推送至微信的实现方法
Aug 13 Python
python根据时间获取周数代码实例
Sep 30 Python
使用Python获取当前工作目录和执行命令的位置
Mar 09 Python
opencv 查找连通区域 最大面积实例
Jun 04 Python
Tensorflow之MNIST CNN实现并保存、加载模型
Jun 17 Python
python使用nibabel和sitk读取保存nii.gz文件实例
Jul 01 Python
python进度条显示之tqmd模块
Aug 22 Python
Python使用grequests并发发送请求的示例
Nov 05 Python
python tkinter实现下载进度条及抖音视频去水印原理
Feb 07 Python
pytorch __init__、forward与__call__的用法小结
Feb 27 Python
Python Requests 基础入门
Apr 07 #Python
Python检测网站链接是否已存在
Apr 07 #Python
python多进程共享变量
Apr 06 #Python
python socket多线程通讯实例分析(聊天室)
Apr 06 #Python
python文件的md5加密方法
Apr 06 #Python
python制作爬虫并将抓取结果保存到excel中
Apr 06 #Python
python基于隐马尔可夫模型实现中文拼音输入
Apr 01 #Python
You might like
《破坏领主》销量已超100万 未来将继续开发新内容
2020/03/08 其他游戏
php面试实现反射注入的详细方法
2019/09/30 PHP
基于jQuery的固定表格头部的代码(IE6,7,8测试通过)
2010/05/18 Javascript
iphone safari不支持position fixed的解决方法
2012/05/04 Javascript
Javascript获取HTML静态页面参数传递值示例
2013/08/18 Javascript
禁止iframe脚本弹出的窗口覆盖了父窗口的方法
2014/09/06 Javascript
jQuery实现单击弹出Div层窗口效果(可关闭可拖动)
2015/09/19 Javascript
JS实现网页右侧带动画效果的伸缩窗口代码
2015/10/29 Javascript
[原创]jQuery常用的4种加载方式分析
2016/07/25 Javascript
编写React组件项目实践分析
2018/03/04 Javascript
KOA+egg.js集成kafka消息队列的示例
2018/11/09 Javascript
es6基础学习之解构赋值
2018/12/10 Javascript
vue在自定义组件中使用v-model进行数据绑定的方法
2019/03/25 Javascript
JS实现碰撞检测效果
2020/03/12 Javascript
Python中常见的异常总结
2018/02/20 Python
python生成器与迭代器详解
2019/01/01 Python
Python操作redis和mongoDB的方法
2019/12/19 Python
pytorch 多分类问题,计算百分比操作
2020/07/09 Python
基于logstash实现日志文件同步elasticsearch
2020/08/06 Python
python中使用.py配置文件的方法详解
2020/11/23 Python
简述Html5 IphoneX 适配方法
2018/02/08 HTML / CSS
美国网上订购鲜花:FTD
2016/09/23 全球购物
体育专业个人的求职信范文
2013/09/21 职场文书
求职信的要素有哪些呢
2013/12/26 职场文书
小加工厂管理制度
2014/01/21 职场文书
家长会邀请书
2014/01/25 职场文书
班级道德讲堂实施方案
2014/02/24 职场文书
宣传保护环境的公益广告词
2014/03/13 职场文书
服务行业口号
2014/06/11 职场文书
爱牙日活动总结
2014/08/29 职场文书
大学生撤销处分思想汇报
2014/09/12 职场文书
公司员工宿舍管理制度
2015/08/03 职场文书
详解CocosCreator项目结构机制
2021/04/14 Javascript
django注册用邮箱发送验证码的实现
2021/04/18 Python
mysql对于模糊查询like的一些汇总
2021/05/09 MySQL
python3实现常见的排序算法(示例代码)
2021/07/04 Python