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),作者:爱吃西瓜的番茄酱

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

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

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 每天学习一点儿算法--选择排序

    很多算法只有在数据经过排序后才管用,比如我们之前学习的二分查找。当然,很多语言都内置了排序算法,比如Python中的sort()函数和sorted()函数。我们...

    爱吃西瓜的番茄酱
  • 学习SQL【10】-SQL高级处理

    所谓高级处理,从用户的角度来讲,就是那些对数值进行排序,计算销售总额等我们熟悉的处理;从SQL的角度来讲,就是近几年才添加的新功能,这些新功能使得SQL的工作范...

    爱吃西瓜的番茄酱
  • 学习SQL【4】-聚合与排序

    随着表中记录(数据行)的不断积累,存储数据逐渐增加,有时我们可能希望计算出这些数据的合计值或者平均值等,这个时候就需要使用SQL语句的汇总操作等方法。 一:对表...

    爱吃西瓜的番茄酱
  • 爬虫小白:03.requests的使用

    安装:pip install requests 导包:import requests

    见贤思齊
  • 爬虫值requests库

    人生不如戏
  • 视频动画 | 什么是插入排序?

    插入排序是比较简单也比较直接的一种排序算法。它是从一堆数据中取出一个数据并将它插入到已排序的数据中合适的位置。

    我脱下短袖
  • Python 生成器 generator

    举例: def gen(): for i in range(10): x = yield i print(x) g=ge() print(g.send(None...

    py3study
  • HBase 集成 Phoenix 构建二级索引实践

    Phoenix 在 HBase 生态系统中占据了非常重要的地位,本文主要包括以下几方面内容:

    create17
  • .NET Core 如何判断程序是否在远程桌面(RDP)下运行

    由于疫情的关系,很久没发文章了。今天终于稳定下来在家办公,抽空分享一个刚学会的技巧。最近在家办公的程序员可能避免不了要用远程桌面,那么问题来了,你的 .NET ...

    Edi Wang
  • Python入门三部曲(二)

    如果不确定使用del语句还是pop()方法,有一个简单的标准:如果你要从列表中删除的一个元素,且不再以任何方式使用它,就使用del语句;如果你要在删除元素后还能...

    叫我龙总

扫码关注云+社区

领取腾讯云代金券