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)
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性