python爬虫入门教程--优雅的HTTP库requests(二)


Posted in Python onMay 25, 2017

前言

urllib、urllib2、urllib3、httplib、httplib2 都是和 HTTP 相关的 Python 模块,看名字就觉得很反人类,更糟糕的是这些模块在 Python2 与 Python3 中有很大的差异,如果业务代码要同时兼容 2 和 3,写起来会让人崩溃。

好在,还有一个非常惊艳的 HTTP 库叫 requests,它是 GitHUb 关注数最多的 Python 项目之一,requests 的作者是 Kenneth Reitz 大神。

requests 实现了 HTTP 协议中绝大部分功能,它提供的功能包括 Keep-Alive、连接池、Cookie持久化、内容自动解压、HTTP代理、SSL认证、连接超时、Session等很多特性,最重要的是它同时兼容 python2 和 python3。requests 的安装可以直接使用 pip 方法:pip install requests

发送请求

>>> import requests
# GET 请求
>>> response = requests.get(https://foofish.net)

响应内容

请求返回的值是一个Response 对象,Response 对象是对 HTTP 协议中服务端返回给浏览器的响应数据的封装,响应的中的主要元素包括:状态码、原因短语、响应首部、响应体等等,这些属性都封装在Response 对象中。

# 状态码
>>> response.status_code
200

# 原因短语
>>> response.reason
'OK'

# 响应首部
>>> for name,value in response.headers.items():
...  print("%s:%s" % (name, value))
...
Content-Encoding:gzip
Server:nginx/1.10.2
Date:Thu, 06 Apr 2017 16:28:01 GMT

# 响应内容
>>> response.content

'<html><body>此处省略一万字...</body></html>

requests 除了支持 GET 请求外,还支持 HTTP 规范中的其它所有方法,包括 POST、PUT、DELTET、HEADT、OPTIONS方法。

>>> r = requests.post('http://httpbin.org/post', data = {'key':'value'})
>>> r = requests.put('http://httpbin.org/put', data = {'key':'value'})
>>> r = requests.delete('http://httpbin.org/delete')
>>> r = requests.head('http://httpbin.org/get')
>>> r = requests.options('http://httpbin.org/get')

查询参数

很多URL都带有很长一串参数,我们称这些参数为URL的查询参数,用"?"附加在URL链接后面,多个参数之间用"&"隔开,比如:http://fav.foofish.net/?p=4&s=20 ,现在你可以用字典来构建查询参数:

>>> args = {"p": 4, "s": 20}
>>> response = requests.get("http://fav.foofish.net", params = args)
>>> response.url
'http://fav.foofish.net/?p=4&s=2'

请求首部

requests 可以很简单地指定请求首部字段 Headers,比如有时要指定 User-Agent 伪装成浏览器发送请求,以此来蒙骗服务器。直接传递一个字典对象给参数 headers 即可。

>>> r = requests.get(url, headers={'user-agent': 'Mozilla/5.0'})

请求体

requests 可以非常灵活地构建 POST 请求需要的数据,如果服务器要求发送的数据是表单数据,则可以指定关键字参数 data,如果要求传递 json 格式字符串参数,则可以使用json关键字参数,参数的值都可以字典的形式传过去。

作为表单数据传输给服务器

>>> payload = {'key1': 'value1', 'key2': 'value2'}
>>> r = requests.post("http://httpbin.org/post", data=payload)

作为 json 格式的字符串格式传输给服务器

>>> import json
>>> url = 'http://httpbin.org/post'
>>> payload = {'some': 'data'}
>>> r = requests.post(url, json=payload)

响应内容

HTTP返回的响应消息中很重要的一部分内容是响应体,响应体在 requests 中处理非常灵活,与响应体相关的属性有:content、text、json()。

content 是 byte 类型,适合直接将内容保存到文件系统或者传输到网络中

>>> r = requests.get("https://pic1.zhimg.com/v2-2e92ebadb4a967829dcd7d05908ccab0_b.jpg")
>>> type(r.content)
<class 'bytes'>
# 另存为 test.jpg
>>> with open("test.jpg", "wb") as f:
...  f.write(r.content)

text 是 str 类型,比如一个普通的 HTML 页面,需要对文本进一步分析时,使用 text。

>>> r = requests.get("https://foofish.net/understand-http.html")
>>> type(r.text)
<class 'str'>
>>> re.compile('xxx').findall(r.text)

如果使用第三方开放平台或者API接口爬取数据时,返回的内容是json格式的数据时,那么可以直接使用json()方法返回一个经过json.loads()处理后的对象。

>>> r = requests.get('https://www.v2ex.com/api/topics/hot.json')
>>> r.json()
[{'id': 352833, 'title': '在长沙,父母同住...

代理设置

当爬虫频繁地对服务器进行抓取内容时,很容易被服务器屏蔽掉,因此要想继续顺利的进行爬取数据,使用代理是明智的选择。如果你想爬取墙外的数据,同样设置代理可以解决问题,requests 完美支持代理。这里我用的是本地 ShadowSocks 的代理,(socks协议的代理要这样安装 pip install requests[socks]

import requests

proxies = {
 'http': 'socks5://127.0.0.1:1080',
 'https': 'socks5://127.0.0.1:1080',
}

requests.get('https://foofish.net', proxies=proxies, timeout=5)

超时设置

requests 发送请求时,默认请求下线程一直阻塞,直到有响应返回才处理后面的逻辑。如果遇到服务器没有响应的情况时,问题就变得很严重了,它将导致整个应用程序一直处于阻塞状态而没法处理其他请求。

>>> import requests
>>> r = requests.get("http://www.google.coma")
...一直阻塞中

正确的方式的是给每个请求显示地指定一个超时时间。

>>> r = requests.get("http://www.google.coma", timeout=5)
5秒后报错
Traceback (most recent call last):
socket.timeout: timed out

Session

在python爬虫入门教程--快速理解HTTP协议(一)中介绍过HTTP协议是一中无状态的协议,为了维持客户端与服务器之间的通信状态,使用 Cookie 技术使之保持双方的通信状态。

有些网页是需要登录才能进行爬虫操作的,而登录的原理就是浏览器首次通过用户名密码登录之后,服务器给客户端发送一个随机的Cookie,下次浏览器请求其它页面时,就把刚才的 cookie 随着请求一起发送给服务器,这样服务器就知道该用户已经是登录用户。

import requests
# 构建会话
session = requests.Session()
# 登录url
session.post(login_url, data={username, password})
# 登录后才能访问的url
r = session.get(home_url)
session.close()

构建一个session会话之后,客户端第一次发起请求登录账户,服务器自动把cookie信息保存在session对象中,发起第二次请求时requests 自动把session中的cookie信息发送给服务器,使之保持通信状态。

项目实战

最后是一个实战项目,如何用 requests 实现知乎自动登录并给用户发私信,我会在下一篇文章中进行讲解。

总结

好了,以上就是这篇文章的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
Python中的pprint折腾记
Jan 21 Python
简单介绍Python的轻便web框架Bottle
Apr 08 Python
Python环境下搭建属于自己的pip源的教程
May 05 Python
Python实现代码统计工具(终极篇)
Jul 04 Python
Python实现的快速排序算法详解
Aug 01 Python
Python之ReportLab绘制条形码和二维码的实例
Jan 15 Python
Python实现读取字符串按列分配后按行输出示例
Apr 17 Python
详解Python装饰器
Mar 25 Python
python 直接赋值和copy的区别详解
Aug 07 Python
python实现的接收邮件功能示例【基于网易POP3服务器】
Sep 11 Python
Pytorch 使用CNN图像分类的实现
Jun 16 Python
Python如何实现大型数组运算(使用NumPy)
Jul 24 Python
Python操作使用MySQL数据库的实例代码
May 25 #Python
python爬虫入门教程--快速理解HTTP协议(一)
May 25 #Python
用生成器来改写直接返回列表的函数方法
May 25 #Python
Python随机读取文件实现实例
May 25 #Python
利用Anaconda完美解决Python 2与python 3的共存问题
May 25 #Python
Python实现的简单dns查询功能示例
May 24 #Python
Python向日志输出中添加上下文信息
May 24 #Python
You might like
php将mysql数据库整库导出生成sql文件的具体实现
2014/01/08 PHP
php调用nginx的mod_zip模块打包ZIP文件
2014/06/11 PHP
CodeIgniter常用知识点小结
2016/05/26 PHP
jQuery 对象中的类数组操作
2009/04/27 Javascript
我用的一些Node.js开发工具、开发包、框架等总结
2014/09/25 Javascript
JavaScript link方法入门实例(给字符串加上超链接)
2014/10/17 Javascript
基于javascript实现窗口抖动效果
2016/01/03 Javascript
微信支付 JS API支付接口详解
2016/07/11 Javascript
老生常谈jacascript DOM节点获取
2017/04/17 Javascript
详解AngularJs ui-router 路由的简单介绍
2017/04/26 Javascript
Javascript中的async awai的用法
2017/05/17 Javascript
JScript实现地址选择功能
2017/08/15 Javascript
vue 属性拦截实现双向绑定的实例代码
2018/10/24 Javascript
iview实现select tree树形下拉框的示例代码
2018/12/21 Javascript
vue-for循环嵌套操作示例
2019/01/28 Javascript
利用JS响应式修改vue实现页面的input值
2019/09/02 Javascript
javascript实现移动端触屏拖拽功能
2020/07/29 Javascript
python实现bucket排序算法实例分析
2015/05/04 Python
python验证码识别的实例详解
2016/09/09 Python
Python探索之实现一个简单的HTTP服务器
2017/10/28 Python
PyQt5打开文件对话框QFileDialog实例代码
2018/02/07 Python
python 获取一个值在某个区间的指定倍数的值方法
2018/11/12 Python
Python使用sorted对字典的key或value排序
2018/11/15 Python
Python openpyxl 遍历所有sheet 查找特定字符串的方法
2018/12/10 Python
python函数超时自动退出的实操方法
2020/12/28 Python
优秀干部获奖感言
2014/01/31 职场文书
四个太阳教学反思
2014/02/01 职场文书
教师远程培训感言
2014/03/06 职场文书
信息技术毕业生自荐信范文
2014/03/13 职场文书
给妈妈洗脚活动方案
2014/08/16 职场文书
党的群众路线教育实践活动心得体会(企业)
2014/11/03 职场文书
2017元旦晚会开幕词
2016/03/03 职场文书
考生诚信考试承诺书(2016版)
2016/03/25 职场文书
十大动画制作软件,Adobe产品上榜两款,第一是行业标准软件
2022/03/18 杂记
HDFS免重启挂载新磁盘
2022/04/06 Servers
MySQL查询日期时间
2022/05/15 MySQL