3. requests 请求库

requests 请求库

requests库建立在urllib库的基础上,是一个处理HTTP请求的第三方库,最大的优点是程序编写的过程更接近正常URL访问过程。

基本用法

GET请求

  • requests.get()函数的参数url链接必须采用HTTP或HTTPS方式访问
  • 调用requests.get()函数后,返回一个Response对象代表响应

Response对象的属性(4个)

属性 描述
status_code HTTP请求的响应状态码
text HTTP响应内容的字符串形式
encoding HTTP响应内容的编码方式
content HTTP响应内容的二进制形式

Response对象的方法(2个)

方法 描述
json 解析HTTP响应内容包含的JSON格式数据(若有)
raise_for_status 如果响应状态码不是200,则产生异常
  • requests.get()函数可通过params参数构造URL以传递某些数据,数据以字符串字典的形式提供
  • requests.get()函数可通过timeout参数设定请求超时时间
import requests

headers = {
    'User-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'
    }

r = requests.get('http://www.baidu.com',headers = headers) # 通过headers参数传递头信息(多用于避免被某些网页禁止抓取)

print(type(r)) # <class 'requests.models.Response'>
print(type(r.status_code)) # <class 'int'>
print(r.status_code) # 200(或404等)
print(r.encoding) # ISO-8859-1(或utf-8等)
print(type(r.text)) # <class 'str'>
print(r.text) # 响应内容的文本形式
print(type(r.content)) # <class 'bytes'>
print(r.content) # 响应内容的二进制形式(图片、音频和视频等文件可通过该方法获取) 

POST请求

import requests

url = 'https://httpbin.org/post'
data = {'key':'value'}
r = requests.post('url',data = data)
print(r.text) # 返回结果中from部分即为提交数据

响应

  • 除了使用text和content获取响应内容外,还有多种属性和方法可获得响应的其他信息
import requests

headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'
    }

params = {'wd':'requests'}

r = requests.get('https://www.baidu.com/s',headers = headers,params = params,timeout = 10)

print(type(r.cookies)) # <class 'requests.cookies.RequestsCookieJar'>
print(r.cookies) 
print(type(r.headers)) # <class 'requests.structures.CaseInsensitiveDict'>
print(r.headers) 
print(type(r.url)) # <class 'str'>
print(r.url) # https://www.baidu.com/s?wd=requests
print(type(r.history)) # <class 'list'>
print(r.history) # []

高级用法

文件上传

  • requests可模拟提数据
import requests

files = {'file':open('favion.ico','rb')}

r = requests.post('http://httpbin.org/post',files = files)
print(r.text) # 文件上传部分由files字段标识

Cookies

import requests

r = requests.get('https://www.baidu.com')
print(r.cookies)

headers = {
    'Cookie':'略',
    'Host':'www.baidu.com',
    'Upgrade-Insecure-Requests':'1',
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'
    }

# 将cookies设置到headers
q = requests.get('https://www.baidu.com')
print(q.text)
  • 通过r.cookies的方式获取Cookies
  • 将Cookies设置到Headers参数中发送请求
  • 也可通过cookies参数单独设置Cookies(需利用split()方法分割cookies,并利用set()方法设置每个cookies的key与value)

会话维持

  • 利用Session对象实现会话维持
  • Session对象可模拟在一个浏览器打开同一站点的不同页面,常用于模拟登陆成功后的下一步操作
import requests

url_1 = '……'
url_2 = '……'
# 同一站点的不同页面

s = requests.Session()
s.get(url_1)
r = s.get(url_2)

SSL证书验证

  • requests可以为 HTTPS 请求验证 SSL 证书
  • requests的SSL验证默认开启(verify参数默认为True)
  • 可通过verify参数传入可信任的CA证书文件的文件夹路径
  • 若证书验证失败,Requests会抛出SSLError
import requests

r = requests.get('https://www.12306.cn',verify=False)  # verify参数设置为False可避免SSLError,但会返回一个警告
print(r.status_code)

'''
Warning (from warnings module):
  File "C:\Users\CC\AppData\Local\Programs\Python\Python36\lib\site-packages\urllib3\connectionpool.py", line 858
    InsecureRequestWarning)
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
'''

代理设置

  • 可通proxies参数过为任意请求方法配置单个请求
  • 若代理需使用HTTP Basic Auth,可用 http://user:password@host语法
  • 为某个特定的连接方式或主机设置代理,使用scheme://hostname作为key,从而针对指定的连接方式或主机进行匹配
import requests

proxies = {
        'http': 'http://10.10.1.10:3128',
        'https': 'http://10.10.1.10:1080',
        }

'''
代理使用HTTP Basic Auth
proxies = {
        'http': 'http://user:pass@10.10.1.10:3128/',
        }
        
针对指定的连接方式或主机设置代理        
proxies = {'http://10.20.1.128': 'http://10.10.1.10:5323'} 
'''

requests.get("http://example.org", proxies=proxies)

超时设置

  • 为了防止服务器不能及时响应,可设置一个超时时间,超过该时间未响应即报错
  • requests通过timeout参数进行超时设置,默认为None(永久等待)
  • timeout值将会用作connect和read二者的timeout,如需分别制定则传入一个元组
import requests

r = requests.get('https://github.com', timeout=5)
q = requests.get('https://github.com', timeout=(3.05, 25))  # 分别制定connect和read二者的timeout

身份验证

  • requests提供HTTPBasicAuth类进行身份验证
  • 身份验证时可直接传入一个包含username和passport的元组,它会默认使用HTTPBasicAuth类进行身份验证
  • 验证成功返回200状态码,验证失败则返回401状态码
import requests

url = '……'
r = requests.get(url,auth=('username','password'))
print(r.status_code)  #200或401
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,884评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,347评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,435评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,509评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,611评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,837评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,987评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,730评论 0 267
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,194评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,525评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,664评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,334评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,944评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,764评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,997评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,389评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,554评论 2 349

推荐阅读更多精彩内容