requests 实现了 HTTP 协议中绝大部分功能,它提供的功能包括 Keep-Alive、连接池、Cookie持久化、内容自动解压、HTTP代理、SSL认证等很多特性,下面这篇文章主要给大家介绍了python爬虫入门中关于优雅的HTTP库requests的相关资料,需要的朋友可以参考下。
前言

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(<a rel``=``"external nofollow"` `href``=``"[https://foofish.net/](https://foofish.net/)"``>https:``/``/``foofish.net<``/``a>)`

|

响应内容

请求返回的值是一个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](http://httpbin.org/post)'``, data` `=` `{``'key'``:``'value'``})``>>> r` `=` `requests.put(``'[http://httpbin.org/put](http://httpbin.org/put)'``, data` `=` `{``'key'``:``'value'``})``>>> r` `=` `requests.delete(``'[http://httpbin.org/delete](http://httpbin.org/delete)'``)``>>> r` `=` `requests.head(``'[http://httpbin.org/get](http://httpbin.org/get)'``)``>>> r` `=` `requests.options(``'[http://httpbin.org/get](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](http://fav.foofish.net/)"``, params` `=` `args)``>>> response.url``'[http://fav.foofish.net/?p=4&s=2](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](http://httpbin.org/post)"``, data``=``payload)`|

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

|

 | `>>>` `import` `json``>>> url` `=` `'[http://httpbin.org/post](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](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](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](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](socks5://127.0.0.1:1080)'``,``'https'``:` `'[socks5://127.0.0.1:1080](socks5://127.0.0.1:1080)'``,``}``requests.get(``'[https://foofish.net](https://foofish.net/)'``, proxies``=``proxies, timeout``=``5``)`

|

超时设置

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

|
|

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

|

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

|

`>>> r` `=` `requests.get(``"[http://www.google.coma](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爬虫入门教程--优雅的HTTP库requests(二)相关推荐

  1. Python爬虫入门教程导航帖

    转载:梦想橡皮擦 https://blog.csdn.net/hihell/article/details/86106916 **Python爬虫入门教程导航,目标100篇** 本系列博客争取把爬虫入 ...

  2. python爬虫入门教程(三):淘女郎爬虫 ( 接口解析 | 图片下载 )

    2019/10/28更新 网站已改版,代码已失效(其实早就失效了,但我懒得改...)此博文仅供做思路上的参考 代码使用python2编写,因已失效,就未改写成python3 爬虫入门系列教程: pyt ...

  3. Python爬虫入门教程:博客园首页推荐博客排行的秘密

    1. 前言 虽然博客园注册已经有五年多了,但是最近才正式开始在这里写博客.(进了博客园才知道这里面个个都是人才,说话又好听,超喜欢这里...)但是由于写的内容都是软件测试相关,热度一直不是很高.看到首 ...

  4. python入门教程百度云-Python爬虫入门教程 百度云盘下载【传智播客】

    Python爬虫入门教程 中级共10课 对实现疫情爬虫项目使用到每一个模块逐一讲解, 每个模块都伴随一个案例; 最后水到渠成, 轻松完成疫情爬虫项目.提取码:ea1n 180分钟学会爬虫入门: 1. ...

  5. python教程是用什么博客写的-Python爬虫入门教程:博客园首页推荐博客排行的秘密...

    1. 前言 虽然博客园注册已经有五年多了,但是最近才正式开始在这里写博客.(进了博客园才知道这里面个个都是人才,说话又好听,超喜欢这里...)但是由于写的内容都是软件测试相关,热度一直不是很高.看到首 ...

  6. python爬虫入门教程(二):开始一个简单的爬虫

    2019/10/28更新 使用Python3,而不再是Python2 转载请注明出处:https://blog.csdn.net/aaronjny/article/details/77945329 爬 ...

  7. Python爬虫入门教程 43-100 百思不得姐APP数据-手机APP爬虫部分

    1. Python爬虫入门教程 爬取背景 2019年1月10日深夜,打开了百思不得姐APP,想了一下是否可以爬呢?不自觉的安装到了夜神模拟器里面.这个APP还是比较有名和有意思的. 下面是百思不得姐的 ...

  8. Python 爬虫入门教程——社团授课型

    Python爬虫入门教程 基础知识 什么是HTML.CSS.JavaScript 网页往往采用html+css+js开发,html是一门标记语言 如下: <!- 将下面这句话放入html文件中, ...

  9. Python爬虫入门教程02:小说爬取

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. 前文 01.python爬虫入门教程01:豆瓣Top电影爬取 基本开发环境 Python 3 ...

最新文章

  1. 【PL/SQL的优点】
  2. 使用Java connector消费ABAP系统的函数
  3. linux实验三shell程序设计,实验三 LINUX SHELL编程
  4. 重构-改善既有代码的设计(十)--简化函数调用
  5. (18)ADS1675高速模式采样率异常解决(学无止境)
  6. 大航海北斗星导航系统V1.10
  7. [Javascript] Functor Basic Intro
  8. 翻译: 如何使用Xcode构建xcframework
  9. vue+elementui 注册验证用户名是否存在
  10. selenium 模拟浏览器刷新
  11. 大三计算机写学术论文,学院大三本科生在高水平国际会议发表学术论文
  12. hystrix实战--资源隔离技术简介
  13. 俄罗斯无线认证-FAC认证
  14. 使用python获取win10锁屏照片
  15. 使用 Python 生成迷宫
  16. 搭建微信小程序转码机器人教程
  17. telephony-apps
  18. Hello,Mr.J——唠唠叨叨年终总结
  19. Python xlrd 读取Excel数字 数字丢失精度 小数位太长 求大神的解决方法(已解决)
  20. Java总结之设计模式(工厂模式)

热门文章

  1. EfficientNetV2:更小,更快,更好的EfficientNet
  2. 没想到我提前56年感受了赛博朋克
  3. 想读博士?进来看看!
  4. Python爬虫获取文章的标题及你的博客的阅读量,评论量。所有数据写入本地记事本。最后输出你的总阅读量!
  5. 目标检测回归损失函数简介:SmoothL1/IoU/GIoU/DIoU/CIoU Loss
  6. 5 种将死的编程语言!
  7. 长期分享干货的技术大佬
  8. 超牛EXCEL操作技巧,用的好,会涨工资哦
  9. 关于如何换肤、子类化的解决方案
  10. php读取不到指定的php.ini配置