Requests库的基本方法和使用详解 Python最常用的请求模块

鳄鱼君

发表文章数:642

Vieu四代商业主题

高扩展、安全、稳定、响应式布局多功能模板。

¥69 现在购买
首页 » Python » Requests库的基本方法和使用详解 Python最常用的请求模块

这个库相对于urllib来说比较好用,Requests是用Python语言编写,基于urllib,采用Apache2 Licensed 开源协议的HTTP库。它比urllib更加简洁,可以节约大量的工作,完全满足HTTP测试需求,pycharm的安装推荐使用命令: pip install --default-timeout=5000 requests ,进行安装

requests的基本使用

 
import requests
response = requests.get('http://www.baidu.com')
print(response.status_code)  # 查看状态码
#text属性返回字符串 源码中是猜测编码,所以结果可能会乱码
print(response.text)
#content属性返回bytes,需要解码
print(response.content.decode('utf-8'))
print(response.cookies)
print(response.headers) 

我们可以练习一下使用面向对象的写法:

import requests
class RequestGet(object):
    def __init__(self):
        url='https://baidu.com'
        headers={'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:72.0) Gecko/20100101 Firefox/72.0'}
        self.response=requests.get(url,headers=headers)#接收请求头参数
    def content(self):
        data=self.response.content.decode('utf-8')
        #获取请求头
        request_headers=self.response.request.headers
        print(request_headers)
        #获取响应头
        response_headers=self.response.headers
        print(response_headers)
        #响应状态码
        code=self.response.status_code
        print(code)
        #请求的cookie
        request_cookie=self.response.request._cookies
        print(request_cookie)
        #响应的cookie
        response_cookie=self.response.cookies
        print(response_cookie)
RequestGet().content()

response.cookies是CookieJar类型,可以使用requests.utils.dict_from_cookiejar,能够实现把cookiejar对象转化为字典

requests的请求方式

使用requests可以发送以下几种请求:

import requests
requests.post('http://httpbin.org/post')
requests.put('http://httpbin.org/put')
requests.delete('http://httpbin.org/delete')
requests.head('http://httpbin.org/get')
requests.options('http://httpbin.org/get')
#请求完成之后取网站查看一下

GET请求

相比于urlopen来说,requests库使用get请求的时候不用再注意参数包含中文,我们这里还举百度搜索美女的列子,经过观察你会发现搜索美女之后的url

import requests
url='https://www.baidu.com/s?'
data={'wd':'美女',}
headers={
    'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:72.0) Gecko/20100101 Firefox/72.0',
}
response=requests.get(url,headers=headers,params=data) #参数params接收字典并转译
print(response.text)#text会出现乱码,因为是猜测网页编码,大部分都猜不正确
print(response.content.decode())

params参数接收的是需要尽行拼接url的值,一般url中包含有固定的参数,常见的就是百度搜索的url地址。

解析json

有时候返回的数据不是html,而是json数据,requests提供了解析json数据的方法,我们来看一下代码:

import requests
headers={
    'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:72.0) Gecko/20100101 Firefox/72.0',
}
url='https://api.github.com/user'
response=requests.get(url,headers=headers)
#这个url返回的内容不是html,而是标准的json
print(response.json()) #返回dict,方便我们后面准确提取内容
print(response.content.decode())#这种方式也可以得到结果,但是类型是str,再往后就没有办法提取内容了

获取二进制数据
前面提到过content属性,一般text属性不好用,就使用content属性,该属性会返回二进制文件,我们对于文本在decode一下就得到想要的结果,对于图片和视频来说,我们就只需要content属性即可。比方说我们想要下载一张图片,这里自己挑选一张喜欢的图片尝试:

import requests
response=requests.get('图片url')
data=response.content
with open('妹子.jpg','wb') as f:
    f.write(data)

POST请求

import requests
data={
    'name':'e1yu',
    'age':1
}
headers={
    'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:70.0) Gecko/20100101 Firefox/70.0'
}
response=requests.post('http://httpbin.org/post',data=data,headers=headers)
print(response.json())

UA复制的时候需要注意不要带…。对于response响应的信息,我们可以来根据状态码进行判断,状态码为200表示为正常的响应,可以进行下一步操作,代码参考:

import requests
response=requests.get('http://baidu.com')
exit() if not response.status_code==requests.codes.ok else print('Request Successfuily')
#exit() if not response.status_code==200 else print('Request Successfuily')

url状态码为200,判断不是200,为False,所以执行else语句的内容,exit()函数 为终止程序,其实两个方法是一样的,只不过一个使用的是状态码的名字,一个使用的是状态码数字,我找了一些状态码的名字,供大家参考,话说是不是闲的慌,放着状态码数字不用非要用状态码名字🤣

100:('continue',)
101:('switching_protocols',)
102:('processing',)
103:('checkpoint',)
122:('uri_too_lang','requset_uri_too_lang',)
200:('ok','okay','all_ok','all_good','\\o/',)
201:('created',)
202:('accepted',)
203:('non_authoritative_info','non_authoritative_information',)
204:('no_content',)
205:('reset_content','reset',)
206:('partial_content','partial',)
207:('multi_status','multiple_status','multi_stati','multiple_stati')
208:('already_reported',)
226:('im_used')

300:('multiple_choices',)
301:('moved_permanently','moved','\\o-',)
302:('found',)
303:('see_other','other',)
304:('not_modified',)
305:('use_proxy',)
306:('switch_proxy',)
307:('temporary_redirect','temporary_moved','temporary')
308:('permanent_redirect','resume_incomplete','resume')

400:('bad_request','bad',)
401:('unauthorized',)
402:('payment_required','payment',)
403:('forbidden',)
404:('not_found','-o-',)
405:('method_not_allowed','not_allowed',)
406:('not_acceptable',)
407:('proxy_authentication_required','proxy_auth','proxy_authentication',)
408:('request_timeout','timeout',)
409:('conflict',)
410:('gone',)
411:('length_required',)
412:('precondition_failed','precondition',)
413:('request_entity_too_large',)
414:('request_uri_too_large',)
415:('unsupported_media_type','unsupported_media','media_type',)
416:('requested_range_not_satisfiable','requested_range','range_not_satisfiable',)
417:('expectation_failed',)
418:('im_a_teapot','teapot','i_am_a_teapot',)
421:('misdirected_request',)
422:('unprocessable_entity','unprocessable',)
423:('locked',)
424:('failed_dependency','dependency',)
425:('unordered_collection','unordered',)
426:('upgrade_required','upgrade',)
428:('precondition_required','precondition',)
429:('too_many_requests','too_many',)
431:('header_fields_too_large','fields_too_large',)
444:('no_response','none',)
449:('retry_with','retry',)
450:('blocked_by_windows_parental_controls','parental_controls',)
451:('unavailable_for_legal_reasons','legal_reasons',)
499:('client_closed_requset',)

500:('internal_server_error','server_error','/o\\',)
501:('not_implemented',)
502:('bad_gateway',)
503:('service_unavailable','unavailable',)
504:('gateway_timeout',)
505:('http_version_not_supported','http_version',)
506:('variant_also_negotiates',)
507:('insufficient_storage',)
509:('bandwidth_limit_exceeded','bandwidth',)
510:('not_extended',)
511:('network_authentication_required','network_auth','network_authentication',)

状态码的名字选择其中一个就可以了,比方说上面200或者‘OK’

requests的高级操作

文件上传

import requests
files={'file':open('2ffc5646b429450cdc2f73548b82e17d_900.jpg','rb')}
response=requests.post('http://httpbin.org/post',files=files)
print(response.text)
#图片是我们上面下载的

携带Cookies请求

我们可以使用下面的方式,直接把cookie放到请求头里面,结果也是成功的

import requests
url='https://i.taobao.com/my_taobao.htm'
headers={
    'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:72.0) Gecko/20100101 Firefox/72.0',
    'Cookie':'登录之后去个人中心找'
}
response=requests.get(url,headers=headers)
data=response.content
with open('day-02.html','wb') as f:
    f.write(data)

requests.get方法有个专门的cookies参数,我们也可以使用下面的这种方式来操作:

import requests
url='https://i.taobao.com/my_taobao.htm'
headers={
    'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:72.0) Gecko/20100101 Firefox/72.0',
}
#cookie字符串
cookies='thw=cn; t=9d595; mt=ci=118_1; UM_distinctid=16f6; ....'
cookie_dict={}
#需要把cookies转换为字典
cookie_list=cookies.split(';')#;切割
for cookie in cookie_list:#切割之后得到一个list
    cookie_dict[cookie.split('=')[0]]=cookie.split('=')[1] #字典的key为遍历之后索引为0,value为1
# #字典推导式  原理跟上面的一样
# cookie_dict={cookie.split('=')[0]:cookie.split('=')[1] for cookie in cookies.split(';')}
#cookies参数接收一个字典
response=requests.get(url,headers=headers,cookies=cookie_dict)
data=response.content
with open('day-02.html','wb') as f:
    f.write(data)

接着就是使用代码登录成功之后,自动带着有效的cookie访问个人中心的页面,这里还是参数的寻找,需要多次尝试。

import requests
#session类 可以自动保存cookie 相当于cookiejar
session=requests.session()
url='https://i.taobao.com/my_taobao.htm'
headers={
    'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:72.0) Gecko/20100101 Firefox/72.0',
}
#代码登录
login_url='https://login.taobao.com/member/login.jhtml'
login_form_data={
    "TPL_username": "淘宝用户名或者手机号",
	"TPL_password": "密码",
	"um_token": "",#该参数必须的,在登录之后的个人中心页面寻找
}
login_response=session.post(url,headers=headers,data=login_data)
#登录成功之后带着有效的cookies访问个人中心页面
data=session.get('https://i.taobao.com/my_taobao.htm',headers=headers).content
with open('day-02.html','wb') as f:
    f.write(data)

ssl证书验证

爬取不安全证书的url,一般来说https是由第三方CA证书认证的,但是某些网站虽然是https,但是它的证书不是CA证书,是自己颁布的证书,这时候我们用户去访问会提示不安全,那么我们使用爬虫去访问也是不行的,会报错requests.exceptions.SSLError这时候就需要告诉爬虫忽略掉它。

import requests
#加上参数verify之后仍然会显示警告,可以使用下面注释的方法
#from requests.packages import urllib3
#urllib3.disable_warnings()
response=requests.get('https://www.12306.cn',verify=False)
print(response.status_code)

携带代理ip请求

requests库使用代理就比较简单了,特别是带有用户名和密码的代理。

import requests
headers={
    'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:70.0) Gecko/20100101 Firefox/70.0'
}
proxies={
    'http':'115.210.67.36:9999',#http代理
    #'https':'223.199.23.10:9999',#https代理
    #代理如果有用户名和密码的情况
    #'http':'http://user:password@119.179.132.50:8060',
}
response=requests.get('https://www.baidu.com',headers=headers,proxies=proxies)
print(response.status_code)

如果你的代理不是http或者https的话,比方说是个socks,requests也支持使用这样的代理,首先pip install 'requests[socks]'安装,设置方法如下:

import requests
proxies={
    'http':'socks5://代理ip',
}
response=requests.get('https://www.baidu.com',proxies=proxies)
print(response.status_code)
#由于我没有socks代理,所以没填

超时设置

import requests
response=requests.get('https://www.taobao.com',timeout=1)
print(response.status_code)

然后可以捕获异常

import requests
from requests.exceptions import ConnectTimeout
try:
    response=requests.get('http://www.baidu.com',timeout=0.01)
    print(response.status_code)
except ConnectTimeout:
    print('Connect error')

想要捕获异常,就需要知道它是什么异常,详情查看官方文档,然后需要一个翻译助手

认证设置

有的网站可能你需要你输入用户名和密码才能访问,方法如下:

import requests
from requests.auth import HTTPBasicAuth
r=requests.get('http://',auth=HTTPBasicAuth('user','1234'))
print(r.status_code)
import requests
r=requests.get('http://',auth=('user','123'))
print(r.status_code)

我也没有找到这样的url可以做测试的,所以没填,上面的是两种方法

异常处理

import requests
from requests.exceptions import ReadTimeout,HTTPError,RequestException
try:
    response=requests.get('http://httpbin.org/get',timeout=0.1)
    print(response.status_code)
except ReadTimeout:
    print('Timeout')
except HTTPError:
    print('Http error')
except RequestException:
    print('Error')

– END –

未经允许不得转载:作者:鳄鱼君, 转载或复制请以 超链接形式 并注明出处 鳄鱼君
原文地址:《Requests库的基本方法和使用详解 Python最常用的请求模块》 发布于2019-11-10

分享到:
赞(0) 赏杯咖啡

评论 抢沙发

8 + 9 =


文章对你有帮助可赏作者一杯咖啡

支付宝扫一扫打赏

微信扫一扫打赏

Vieu4.6主题
专业打造轻量级个人企业风格博客主题!专注于前端开发,全站响应式布局自适应模板。
切换注册

登录

忘记密码 ?

您也可以使用第三方帐号快捷登录

Q Q 登 录
微 博 登 录
切换登录

注册