网络请求 在 Python 众多的 HTTP 客户端中,最有名的莫过于requests、aiohttp和httpx。
在不借助其他第三方库的情况下,
requests只能发送同步请求;
aiohttp只能发送异步请求;
httpx既能发送同步请求,又能发送异步请求。
那么怎么选择呢
只发同步请求用requests,但可配合多线程变异步。
只发异步请求用aiohttp,但可以配合await变同步。
httpx可以发同步请求也可以异步,但是请求速度同步略差于requests,异步略差于aiohttp
Asyncio 的强大。但是,任何一种方案都不是完美的,都存在一定的局限性,Asyncio 同样如此。
实际使用中,想用好 Asyncio,特别是发挥其强大的功能,很多情况下必须得有相应的 Python 库支持。
比如
requests 库并不兼容 Asyncio,而 aiohttp 库兼容。
requests 这里先说requests
安装依赖
响应 响应的类型
1 2 3 4 5 6 7 8 9 10 11 r.text r.json() r.content r.raw
获取请求响应的其他信息
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 r.status_code r.url r.cookies['token' ] r.headers r.headers['Content-Type' ] r.request.headers
请求 GET请求 get请求:
1 res = requests.get(url,data=data,cookies=cookie,headers=header,verify=False ,files=file)
data可传可不传,data是字典格式。 如果url是https的话,加上verify=False。如果url是http的话,可不加。
示例1
1 2 3 4 5 import requestsif __name__ == '__main__' : r = requests.get("https://www.psvmc.cn" ) print (r.text)
示例2
1 2 3 4 5 6 7 import requestsif __name__ == '__main__' : data = {'username' : 'admin' , 'passwd' : '123456' } r = requests.get("https://www.psvmc.cn/login.json" , params=data) print (r.status_code) print (r.json()["obj" ])
POST请求 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 url_post = "https://www.psvmc.cn/login.json" r = requests.post(url_post) r = requests.post(url_post,timeout=10 ) r = requests.post(url_post, data=dict_param) r = requests.post(url_post, json=dict_param) r = requests.post(url_post, data=json.dumps(dict_param)) r = requests.post( url_post, data=dict_param, timeout=10 , headers={ 'User-Agent' : 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X)' }) url = 'http://apinum/upload/post' files = {'file' : open ('report.xls' , 'rb' )} r = requests.post(url, files=files)
文件上传 1 2 3 4 url = 'http://apinum/upload/post' files = {'file' : open ('report.xls' , 'rb' )} r = requests.post(url, files=files)
base64 文件转Base64
1 2 3 4 5 6 7 8 9 10 11 12 13 14 import base64import iodef file_to_base64 (file_path ): with open (file_path, 'rb' ) as file: file_bytes = file.read() base64_bytes = base64.b64encode(file_bytes) base64_string = base64_bytes.decode('utf-8' ) return base64_string file_path = 'path/to/your/file.txt' base64_string = file_to_base64(file_path) print (base64_string)
上传
其他类型请求 1 2 3 4 r = requests.put(url, data =dict_param) r = requests.delete(url) r = requests.head(url) r = requests.options(url)
代理 跨域的时候可以考虑代理访问,不管是post请求还是get请求,只需要添加proxies即可。
客户端开发时不用考虑跨域问题,没有必要设置代理访问。
1 2 3 4 5 proxies = { "http" : "http://10.10.1.10:3128" , "https" : "http://10.10.1.10:1080" , } requests.get(url_get, proxies=proxies)
查看代理是否有效 和telnet作用一样
1 2 3 4 5 6 7 8 9 import telnetlibif __name__ == '__main__' : try : telnetlib.Telnet('110.242.68.4' , port='80' , timeout=3 ) except : print ('ip无效!' ) else : print ('ip有效!' )
异步请求 aiohttp 的代码与 httpx 异步模式的代码重合度90%,只不过把AsyncClient换成了ClientSession。
aiohttp https://www.psvmc.cn/article/2021-11-26-python-aiohttp.html
httpx https://www.psvmc.cn/article/2021-11-26-python-httpx.html