爬虫之Resquests模块的使用(二)
Requests
Requests模块
Requests模块是一个用于网络访问的模块,其实类似的模块有很多,比如urllib,urllib2,httplib,httplib2,他们基本都提供相似的功能。
在上一篇我们已经使用urllib模块
而Requests会比urllib更加方便,可以节约我们大量的工作,它更加强大,所以更建议使用Requests。
各种请求方式
requests里提供各种请求方式
HTTP定义了与服务器进行交互的不同方式, 其中, 最基本的方法有四种: GET, POST, PUT, DELETE; 一个URL对应着一个网络上的资源, 这四种方法就对应着对这个资源的查询, 修改, 增加, 删除四个操作.上面的程序用到的requests.get()来读取指定网页的信息, 而不会对信息就行修改, 相当于是"只读". requests库提供了HTTP所有基本的请求方式, 都是一句话搞定。
requests请求方法
请求示例
r = requests.get(‘https://github.com/timeline.json’) # GET请求 r = requests.post(“http://httpbin.org/post”) # POST请求 r = requests.put(“http://httpbin.org/put”) # PUT请求 r = requests.delete(“http://httpbin.org/delete”) # DELETE请求 r = requests.head(“http://httpbin.org/get”) # HEAD请求 r = requests.options(“http://httpbin.org/get” ) # OPTIONS请求
以上方法均是在此方法的基础上构建
requests.request(method, url, **kwargs)
返回值属性
import requests respone=requests.get('http://www.jianshu.com') # respone属性 print(respone.text)# 所请求网页的内容 print(respone.content) print(respone.status_code) #返回状态码 print(respone.headers)# 网页的头 print(respone.cookies)# 网页的cookie内容 print(respone.cookies.get_dict()) print(respone.cookies.items()) print(respone.url) # 实际的网址 print(respone.history) print(respone.encoding) # 所请求网页的编码方式
GET请求:requests.get(url)
import requests response = requests.get('http://httpbin.org/get') # 返回一个实例,包含了很多的信息
print(response.text) # 所请求网页的内容
带参数的GET请求:requests.get(url, param=None)
通常我们会通过httpbin.org/get?key=val方式传递。Requests模块允许使用params关键字传递参数,以一个字典来传递这些参数。
比如我们想传递key1=value1,key2=value2到http://httpbin.org/get里面
构造的url:http://httpbin.org/get?key1=value1&key2=value2
1 2 3 4 5 6 7 | import requests data = { "key1" : "key1" , "key2" : "key2" } response = requests.get( "http://httpbin.org/get" ,params = data) print (response.url) |
运行结果如下
1 2 3 4 | C:\Pycham\venv\Scripts\python.exe C: / Pycham / demoe3.py http: / / httpbin.org / get?key1 = key1&key2 = key2 Process finished with exit code 0 |
可以看到,参数之间用&隔开,参数名和参数值之间用=隔开。
上述两种的结果是相同的,通过params参数传递一个字典内容,从而直接构造url。
注意:通过传参字典的方式的时候,如果字典中的参数为None则不会添加到url上。
POST请求:requests.post(url, data=data)
requests.post()用法与requests.get()完全一致,特殊的是requests.post()有一个data参数,用来存放请求体数据
注意:同样的在发送post请求的时候也可以和发送get请求一样通过headers参数传递一个字典类型的数据
1 2 3 4 5 6 7 8 | import requests data = { "name" : "zhaofan" , "age" : 23 } response = requests.post( "http://httpbin.org/post" ,data = data) print (response.text) |
运行结果如下:
可以看到参数传成功了,然后服务器返回了我们传的数据。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | C:\Pycham\venv\Scripts\python.exe C: / Pycham / demoe3.py { "args" : {}, "data" : "", "files" : {}, "form" : { "age" : "23" , "name" : "zhaofan" }, "headers" : { "Accept" : "*/*" , "Accept-Encoding" : "gzip, deflate" , "Connection" : "close" , "Content-Length" : "19" , "Content-Type" : "application/x-www-form-urlencoded" , "Host" : "httpbin.org" , "User-Agent" : "python-requests/2.19.1" }, "json" : null, "origin" : "218.200.145.68" , "url" : "http://httpbin.org/post" } |
定制请求头和cookie信息
import requests import json data = {'some': 'data'} cookie = {'key':'value'} headers = {'content-type': 'application/json', 'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:22.0) Gecko/20100101 Firefox/22.0'} r = requests.post('https://api.github.com/some/endpoint', data=data, headers=headers,cookies =cookie) print(r.text)
设置请求超时与代理
import requests import json data = {'some': 'data'} proxies = {'http':'ip1','https':'ip2' } r = requests.post('https://api.github.com/some/endpoint', data=data,proxies=proxies,timeout = 1) print(r.text)
传送json格式数据
有时候我们需要传送的信息不是表单形式的,需要我们传JSON格式的数据过去,所以我们可以用 json.dumps() 方法把表单数据序列化
1 2 3 4 5 6 7 | import json import requests url = 'http://httpbin.org/post' data = { 'some' : 'data' } r = requests.post(url, data = json.dumps(data)) print r.text |
运行结果如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | C:\Pycham\venv\Scripts\python.exe C: / Pycham / demoe3.py { "args" : {}, "data" : "{\"some\": \"data\"}" , "files" : {}, "form" : {}, "headers" : { "Accept" : "*/*" , "Accept-Encoding" : "gzip, deflate" , "Connection" : "close" , "Content-Length" : "16" , "Host" : "httpbin.org" , "User-Agent" : "python-requests/2.19.1" }, "json" : { "some" : "data" }, "origin" : "218.200.145.68" , "url" : "http://httpbin.org/post" } |
上传文件
如果想要上传文件,那么直接用 file 参数即可
1 2 3 4 5 6 | import requests url = 'http://httpbin.org/post' files = { 'file' : open ( 'test.txt' , 'rb' )} r = requests.post(url, files = files) print r.text |
运行结果如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | { "args" : {}, "data" : "", "files" : { "file" : "Hello World!" }, "form" : {}, "headers" : { "Accept" : "*/*" , "Accept-Encoding" : "gzip, deflate" , "Content-Length" : "156" , "Content-Type" : "multipart/form-data; boundary=7d8eb5ff99a04c11bb3e862ce78d7000" , "Host" : "httpbin.org" , "User-Agent" : "python-requests/2.9.1" }, "json" : null, "url" : "http://httpbin.org/post" } |
解析json
1 2 3 4 5 6 | import requests import json response = requests.get( 'http://httpbin.org/get' ) <br>res1 = json.loads(response.text) #太麻烦 res2 = response.json() #直接获取json数据 print (res1 = = res2) #True |
那r.text和r.content的区别是什么呢?
r.text是unicode编码的响应内容(r.text is the content of the response in unicode)
r.content是字符编码的响应内容(r.content is the content of the response in bytes)
text属性会尝试按照encoding属性自动将响应的内容进行转码后返回,如果encoding为None,requests会按照chardet(这是什么?)猜测正确的编码
如果你想取文本,可以通过r.text, 如果想取图片,文件,则可以通过r.content
针对响应内容是二进制文件(如图片)的场景,content属性获取响应的原始内容(以字节为单位)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?