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 @   ShineLe  阅读(78)  评论(0编辑  收藏  举报
编辑推荐:
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
阅读排行:
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
点击右上角即可分享
微信分享提示