requests

requests。它是一个Python第三方库,处理URL资源特别方便。

GET

用with语句块通过GET访问一个网页

import requests
url='https://www.python.org'
with requests.get('https://www.python.org') as r:
    print('Status:',r.status_code)
    print('Text:',r.text)

Status: 200
Text: <!doctype html>...

由于现在很多网站都加了安全验证,可以加一个headers,其中写入'User-Agent',这里以'https://www.douban.com'为例

import requests

url='https://www.douban.com'
headers={'User-Agent':'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'}

with requests.get(url,headers=headers) as r:
    print('Status:',r.status_code)
    print('Text:',r.text)

Status: 200
Text: <!DOCTYPE HTML>...

 

对于带参数的URL,传入一个dict类型的params参数,params参数会直接传入URL中

import requests

url='https://www.douban.com'
headers={'User-Agent':'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'}
params={'q':'python','cat':'1001'}

with requests.get(url,headers=headers,params=params) as r:
        print(r.url)

https://www.douban.com/?q=python&cat=1001

这里的参数params就相当于下文中标红的data,只是不用连接编码

baseURL='https://www.baidu.com/s'
data={'wd':wd}
data=parser.urlencode(data)
URL=baserURL+data

 

requests自动检测编码,可以用encoding属性查看

r.encoding
'utf-8'

 无论响应是文本还是二进制内容,我们都可以用content属性获得bytes对象:

r.content

b'<!DOCTYPE HTML>\n<html lang="zh-cmn-Hans"... 

requests的方便之处还在于,对于特定类型的响应,对于特定类型的响应,例如JSON,可以直接通过r.json()获取,这里的r.json()相当于以前学习的urllib库的代码:

#urllib
r=res.read().decode()
r=json.loads(r)

 

POST(传入data参数)

要发送POST请求,只需要把get()方法变为post(),然后传入传入data参数作为POST请求的数据。(就像我在GET与POST最后总结中说的,GET与POST的最大区别在于,POST会传入data参数作为POST请求的数据,GET则没有data参数)

 

下述代码是一个登录豆瓣主页的POST请求

import requests
url='https://accounts.douban.com/j/mobile/login/basic'
headers={'User-Agent':'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'}
data = {
    'ck':'',
    'name': '15928637687',
    'password': '402237344',
    'remember': 'false'
}

with requests.post(url, headers=headers, data=data) as r:
    print(r.text)

 

requests默认使用application/x-www-form-urlencoded对POST数据编码。如果要传递JSON数据,可以直接传入json参数

params={'key':'value'}
r = requests.post(url , json=params) #自动序列化为JSON

类似的,上传文件需要更复杂的编码格式,但是requests把它简化为files参数

upload_files={'file':open('report.xls','rb')}
r=request.post(url,files=upload_files)

读取文件时,应该使用'rb'二进制模式读取,这样获取的bytes长度才是文件的长度

 

此外,除了用post()方法进行POST请求外,还可以用put(),delete()等,就可以以PUT或DELETE方法请求资源。

 

除了能轻松获取响应内容外,requests对获取HTTP响应的其他信息也非常简单。例如,获取响应头:可以直接通过响应的headers方法:

with requests.get(url,headers=headers) as r:
        print(r.headers)
        print(r.headers['Content-Type'])
{
'Date': 'Fri, 16 Oct 2020 04:37:40 GMT', 'Content-Type': 'text/html; charset=utf-8', ..., 'Content-Encoding': 'gzip'} text/html; charset=utf-8

requests对Cookie做了特殊处理,使我们不必解析Cookie就可以轻松获取指定的Cookie(通过Key下标的方式):

r.cookies ['ts']

'example_cookie_123456'

关于Headers和Cookie的属性访问,可以参考Python:HTTP请求头headers信息的查询

 

要在请求中传入Cookie,只需准备一个dict传入cookies参数

cookies = {'token':'12345','status':'working'}
r = requests.get(url , cookies=cookies)

 

最后,要指定超时时,传入以为单位的timeout参数

r=requests.get(url,timeout=2.5)

 

posted @ 2020-10-16 13:01  ShineLe  阅读(85)  评论(0)    收藏  举报