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 装饰器功能以及函数参数使用介绍
Jan 27 Python
python爬虫教程之爬取百度贴吧并下载的示例
Mar 07 Python
Python复制目录结构脚本代码分享
Mar 06 Python
django 开发忘记密码通过邮箱找回功能示例
Apr 17 Python
Python数据持久化shelve模块用法分析
Jun 29 Python
Python 3.6打包成EXE可执行程序的实现
Oct 18 Python
把vgg-face.mat权重迁移到pytorch模型示例
Dec 27 Python
Python PyPDF2模块安装使用解析
Jan 19 Python
Python如何基于Tesseract实现识别文字功能
Jun 05 Python
python中_del_还原数据的方法
Dec 09 Python
python解决12306登录验证码的实现
Apr 18 Python
python中requests库+xpath+lxml简单使用
Apr 29 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
用 PHP5 轻松解析 XML
2006/12/04 PHP
php中获取远程客户端的真实ip地址的方法
2011/08/03 PHP
PHP判断指定时间段的2个方法
2014/03/14 PHP
PHP向socket服务器收发数据的方法
2015/01/24 PHP
PHPMailer ThinkPHP实现自动发送邮件功能
2018/06/10 PHP
document.createElement()用法
2013/03/13 Javascript
jQuery定义背景动态切换效果的方法
2015/03/23 Javascript
详解JavaScript基本类型和引用类型
2015/12/09 Javascript
Easyui form combobox省市区三级联动
2016/01/13 Javascript
非常漂亮的相册集 使用jquery制作相册集
2016/04/28 Javascript
浅谈angularjs $http提交数据探索
2017/01/20 Javascript
Vue计算属性的使用
2017/08/04 Javascript
Vue-Router2.X多种路由实现方式总结
2018/02/09 Javascript
vue使用jsonp抓取qq音乐数据的方法
2018/06/21 Javascript
Vue中控制v-for循环次数的实现方法
2018/09/26 Javascript
vue中引入第三方字体文件的方法示例
2018/12/17 Javascript
小程序开发中如何使用async-await并封装公共异步请求的方法
2019/01/20 Javascript
vue 验证码界面实现点击后标灰并设置div按钮不可点击状态
2019/10/28 Javascript
JS面向对象之单选框实现
2020/01/17 Javascript
[01:23]2019完美世界全国高校联赛(春季赛)合肥全国总决赛
2019/06/10 DOTA
Python通过递归遍历出集合中所有元素的方法
2015/02/25 Python
windows10系统中安装python3.x+scrapy教程
2016/11/08 Python
Python机器学习算法之k均值聚类(k-means)
2018/02/23 Python
Python实现定时执行任务的三种方式简单示例
2019/03/30 Python
解决pycharm运行程序出现卡住scanning files to index索引的问题
2019/06/27 Python
python字符串Intern机制详解
2019/07/01 Python
使用Python将xmind脑图转成excel用例的实现代码(一)
2020/10/12 Python
Piercing Pagoda官网:耳环、戒指、项链、手链等
2020/09/28 全球购物
岗位职责定义及内容
2013/11/08 职场文书
《乡愁》教学反思
2014/02/18 职场文书
中国在我心中演讲稿
2014/09/13 职场文书
慰问信格式规范
2015/03/23 职场文书
2015年挂职干部工作总结
2015/05/14 职场文书
起诉意见书范文
2015/05/19 职场文书
Angular性能优化之第三方组件和懒加载技术
2021/05/10 Javascript
教你用Java Swing实现自助取款机系统
2021/06/11 Java/Android