requests库的基本用法

什么是Requests库

Requests 是使用Python语言编写,基于urllib,采用Apache2 Licensed开源协议的HTTP库。 它比urllib库更加方便,可以节约我们大量的工作,完全满足HTTP测试需求。 一句话—Python实现的简单易用的HTTP库。

requests的安装

pip install requests

实例引入

这里使用requests向百度发送get请求,并输出状态码和cookie信息:

import requests

response = requests.get('http://www.baidu.com')
print(response.status_code)
# print(response.text)
print(response.cookies)
200
<RequestsCookieJar[<Cookie BDORZ=27315 for .baidu.com/>]>

各种请求方式

使用requests可以很简单的发送各种请求,相比urllib库来说,方便很多。

import requests

requests.post('http://httpbin.org/post')
requests.put('http://httpbin.org/put')
requests.head('http://httpbin.org/head')
requests.delete('http://httpbin.org/delete')
<Response [200]>

基本的GET请求

import requests

response = requests.get('http://httpbin.org/get')
print(response.text)  # response.text返回响应体的源码
{"args":{},"headers":{"Accept":"*/*","Accept-Encoding":"gzip, deflate","Connection":"close","Host":"httpbin.org","User-Agent":"python-requests/2.18.4"},"origin":"117.139.10.7","url":"http://httpbin.org/get"}

带参数的GET请求

将一个字典传入params来构造params参数,params是一个构造URL的参数,可以使用它来动态构造URL

import requests

data = {    'name':'gemmey',    'age':22}
response = requests.get('http://httpbin.org/get', params=data)
print(response.text)
{"args":{"age":"22","name":"gemmey"},"headers":{"Accept":"*/*","Accept-Encoding":"gzip, deflate","Connection":"close","Host":"httpbin.org","User-Agent":"python-requests/2.18.4"},"origin":"117.172.26.83","url":"http://httpbin.org/get?name=gemmey&age=22"}

解析JSON

response.text返回的大都是json格式的内容,我们可以使用response.json()方法进行解析。效果和json.loads(response.text)是一样的

import requestsimport json

response = requests.get('http://httpbin.org/get')
print(type(response.text))
print(response.json())
print(json.loads(response.text))
<class 'str'>
{'args': {}, 'headers': {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Connection': 'close', 'Host': 'httpbin.org', 'User-Agent': 'python-requests/2.18.4'}, 'origin': '117.139.10.7', 'url': 'http://httpbin.org/get'}
{'args': {}, 'headers': {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Connection': 'close', 'Host': 'httpbin.org', 'User-Agent': 'python-requests/2.18.4'}, 'origin': '117.139.10.7', 'url': 'http://httpbin.org/get'}

获取二进制数据

response.content用于获取响应的二进制流内容,这种处理方式常见于爬取图片或视频的二进制文件。

import requests

response = requests.get('https://github.com/favicon.ico')
print(type(response.text), type(response.content))
print(response.status_code)
<class 'str'> <class 'bytes'>
200

然后可以将二进制内容保存为图片或者视频,只需要指定相应的格式,这里注意打开文件要使用wb格式写入。

# 将图片信息保存下来import requests

response = requests.get('https://github.com/favicon.ico')
with open('favicon.ico', 'wb') as f:
    f.write(response.content)
    f.close()

添加headers

这里将字典格式的headers信息传入给参数headers

import requests

headers = {    'user-agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64)'}
response = requests.get('https://www.zhihu.com/explore', headers=headers)
print(response.status_code)
# print(response.text)
200

基本的POST请求

将字典格式的信息传入给data参数,构造post请求,其实我们发现,requests.getrequests.post大部分参数都是要构造成字典格式的。

import requests

data = {'name':'gemmey', 'age':22}
headers = {    'user-agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64)'}
response = requests.post('http://httpbin.org/post', data=data, headers=headers)
print(response.text)
{"args":{},"data":"","files":{},"form":{"age":"22","name":"gemmey"},"headers":{"Accept":"*/*","Accept-Encoding":"gzip, deflate","Connection":"close","Content-Length":"18","Content-Type":"application/x-www-form-urlencoded","Host":"httpbin.org","User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64)"},"json":null,"origin":"117.139.10.7","url":"http://httpbin.org/post"}

响应(response)属性

import requests

headers = {    'user-agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64)'}
response = requests.get('http://jianshu.com', headers=headers)
print(type(response.status_code), response.status_code)
print(type(response.headers), response.headers)
print(type(response.url), response.url)
print(type(response.history), response.history)
<class 'int'> 200
<class 'requests.structures.CaseInsensitiveDict'> {'Date': 'Wed, 30 May 2018 06:49:54 GMT', 'Server': 'Tengine', 'Content-Type': 'text/html; charset=utf-8', 'Transfer-Encoding': 'chunked', 'X-Frame-Options': 'DENY', 'X-XSS-Protection': '1; mode=block', 'X-Content-Type-Options': 'nosniff', 'ETag': 'W/"29924b69c281f1f5708aa7338021b7da"', 'Cache-Control': 'max-age=0, private, must-revalidate', 'Set-Cookie': 'locale=zh-CN; path=/', 'X-Request-Id': '0d995087-8c71-4405-bf82-e67ba1dbcd3b', 'X-Runtime': '0.008407', 'Strict-Transport-Security': 'max-age=31536000; includeSubDomains; preload', 'Content-Encoding': 'gzip', 'X-Via': '1.1 PSbjwjBGP2uz240:4 (Cdn Cache Server V2.0), 1.1 PSzjtzsx2kf43:3 (Cdn Cache Server V2.0), 1.1 myd65:5 (Cdn Cache Server V2.0)', 'Connection': 'keep-alive', 'X-Dscp-Value': '0'}
<class 'str'> https://www.jianshu.com/
<class 'list'> [<Response [301]>, <Response [301]>]

状态码的判断

import requests

headers = {    'user-agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64)'}
response = requests.get('http://jianshu.com', headers=headers)
exit() if not response.status_code == requests.codes.ok else print('Request Successfully')
Request Successfully

高级操作

文件上传

文件上传使用POST请求,将文件信息传给参数files

import requests

files = {'file': open('favicon.ico', 'rb')}
response = requests.post('http://httpbin.org/post', files=files)
print(response.status_code)
200

获取cookie

响应response有一个cookies属性,可以直接获取响应中的cookies信息。

import requests

response = requests.get('http://www.baidu.com')
print(response.cookies)for key, value in response.cookies.items():
    print(key+ ' = ' +value)
<RequestsCookieJar[<Cookie BDORZ=27315 for .baidu.com/>]>
BDORZ = 27315

会话维持

我们通过requests.Session()方法获取服务器端的登陆状态信息。这里有两次GET请求,第一次GET是获取服务器端的登录信息,第二次GET是携带第一次获得的登录信息进行GET请求。这两次是连贯的。

import requests

s = requests.Session()
s.get('http://httpbin.org/cookies/set/number/123456789')
response = s.get('http://httpbin.org/cookies')
print(response.text)
{"cookies":{"number":"123456789"}}

证书验证

requests进行网页请求时,会自动进行网页证书的验证,如果网站证书不合法,则会抛出一个异常,比如12306官网的证书就是不合法的,如果我们像以往那样进行GET请求,则会失败。这时我们设置verify参数为False(默认为True),就是让它请求时不进行证书验证,但是这样它仍会抛出一个警告,这个我们就不用管它了。

import requests

response = requests.get('https://www.12306.cn', verify=False)
print(response.status_code)
200


D:\Anaconda\Anaconda\lib\site-packages\urllib3\connectionpool.py:858: InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings
  InsecureRequestWarning)

超时设置

timeout参数用来设置响应超时

import requests

response = requests.get('http://httpbin.org/get', timeout=1)
print(response.status_code)
200

异常处理

这里的ReadTimeout异常是HTTPError异常的子类,而HTTPError异常又是RequestException异常的子类,如果我们要简写捕捉异常的代码,我们可以直接写一个RequestException就可以捕捉到requests的所有可能异常。

import requests
from requests.exceptions import ReadTimeout, HTTPError, RequestException

try:
    response = requests.get('http://httpbin.org/get', timeout=0.5)
    print(response.status_code)
except ReadTimeout:
    print('TIME OUT')
except HTTPError:
    print('HTTP ERROR')
except RequestException:
    print('error')
200

每天学习一点点,每天进步一点点。

推荐阅读: 比较基础的urllib库来了解一下 Python常用库整理

原文发布于微信公众号 - 一个爱吃西瓜的程序员(youcoding)

原文发表时间:2018-06-01

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏along的开发之旅

Java Web之Tomcat目录结构和Web应用

如果Servlet版本小于3.0, 或者您不希望使用注解, 那么可以在web.xml中配置您的servlet程序, 一个最简单的实例如下:

1202
来自专栏抠抠空间

爬虫值requests库

1490
来自专栏Python中文社区

Python多进程抓取全国邮政编码和长途区号

由于Python设计的限制(就是咱们常用的CPython)最多只能用满1个CPU核心。Python提供了非常好用的多进程包multiprocessing,你只需...

2689
来自专栏散尽浮华

nginx负载均衡(5种方式)、rewrite重写规则及多server反代配置梳理

Nginx除了可以用作web服务器外,他还可以用来做高性能的反向代理服务器,它能提供稳定高效的负载均衡解决方案。nginx可以用轮询、IP哈希、URL哈希等方式...

7866
来自专栏Linux驱动

第4阶段——制作根文件系统之分析init进程(2)

本节目标: (1) 了解busybox(init进程和命令都放在busybox中) (2) 创建SI工程,分析busybox源码来知道init进程做了哪些事情 ...

2559
来自专栏三木的博客

Make

###一、make的功能: make是一个用来维护程序模块关系和生产可执行文件的工具,他可以根据程序修改的情况重新编译链接生成的中间代码或最终的可执行文件。执行...

20810
来自专栏程序员宝库

使用 Node.js 开发简单的脚手架工具

像我们熟悉的 vue-cli,react-native-cli 等脚手架,只需要输入简单的命令 vue init webpack project,即可快速帮我们...

1702
来自专栏FreeBuf

Cookiel劫持测试工具 – Cookie Injecting Tools

Cookie Injecting Tools 是一款简单的开源cookie利用工具,是Chrome浏览器上开发的一个扩展插件,能够灵活地进行SQL注入测试,编辑...

2727
来自专栏程序员阿凯

一条大河波浪宽 -- 数据库连接池实现

1174
来自专栏青玉伏案

Git知识总览(六) Git分支中的远程操作实践

前几篇博客陆陆续续的讲了好多关于Git操作的内容, 其中在上篇博客聊了《Git中的merge、rebase、cherry-pick以及交互式rebase》,本篇...

35411

扫码关注云+社区

领取腾讯云代金券