前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python网络请求-requests、JSON转换

Python网络请求-requests、JSON转换

作者头像
码客说
发布2021-11-29 09:19:11
7.5K0
发布2021-11-29 09:19:11
举报
文章被收录于专栏:码客码客

网络请求

在 Python 众多的 HTTP 客户端中,最有名的莫过于requestsaiohttphttpx

在不借助其他第三方库的情况下,requests只能发送同步请求;aiohttp只能发送异步请求;httpx既能发送同步请求,又能发送异步请求。

那么怎么选择呢

  • 只发同步请求用requests,但可配合多线程变异步。
  • 只发异步请求用aiohttp,但可以配合await变同步。
  • httpx可以发同步请求也可以异步,但是请求速度同步略差于requests,异步略差于aiohttp

Asyncio 的强大。但是,任何一种方案都不是完美的,都存在一定的局限性,Asyncio 同样如此。

实际使用中,想用好 Asyncio,特别是发挥其强大的功能,很多情况下必须得有相应的 Python 库支持。

比如

requests 库并不兼容 Asyncio,而 aiohttp 库兼容。

requests

这里先说requests

安装依赖

pip install requests

响应

响应的类型

#获取接口返回的字符串数据
r.text

#获取接口返回的json数据,即直接将json格式的数据转换为json对象
r.json()

#获取接口返回的二进制数据,假设二进制数据如果为图片可以继续转换成图片
r.content

#获取原始套接字,使用r.raw请在 requests 请求中加上参数 stream=True
r.raw

获取请求响应的其他信息

#获取状态码
r.status_code

#获取请求的url
r.url

#获取指定cookies信息
r.cookies['token']

#获取访问服务器返回给我们的响应头部信息
r.headers

#获取指定访问服务器返回给我们的响应头部信息
r.headers['Content-Type']

#获取发送到服务器的请求的头部的信息
r.request.headers

请求

GET请求

get请求:

res = requests.get(url,data=data,cookies=cookie,headers=header,verify=False,files=file)

data可传可不传,data是字典格式。

如果url是https的话,加上verify=False。如果url是http的话,可不加。

示例1

import requests

if __name__ == '__main__':
    r = requests.get("https://www.psvmc.cn")
    print(r.text)

示例2

import requests

if __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请求

url_post = "https://www.psvmc.cn/login.json"

#不包含任何参数的请求
r = requests.post(url_post)

#不包含任何参数的请求,设置超时10s,timeout不设置则默认60s
r = requests.post(url_post,timeout=10)

#携带参数的请求,dict_param为参数字典,默认data=dict_param,使用data=则表示post的是form请求
#即 application/x-www-form-urlencoded 。
r = requests.post(url_post, data=dict_param)

#携带参数的请求,dict_param为参数字典,使用json=则表示post的是json请求
r = requests.post(url_post, json=dict_param)

#携带参数的请求,body传字符串,这里是JSON字符串。
r = requests.post(url_post, data=json.dumps(dict_param))

#携带参数的请求,dict_param为参数字典,设置超时10s,并携带headers属性
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)'
    })

#post请求上传文件
url = 'http://apinum/upload/post'
files = {'file': open('report.xls', 'rb')}
r = requests.post(url, files=files)

其他类型请求

r = requests.put(url, data =dict_param)
r = requests.delete(url)
r = requests.head(url)
r = requests.options(url)

代理

跨域的时候可以考虑代理访问,不管是post请求还是get请求,只需要添加proxies即可。

客户端开发时不用考虑跨域问题,没有必要设置代理访问。

proxies = {
  "http": "http://10.10.1.10:3128",
  "https": "http://10.10.1.10:1080",
}
requests.get(url_get, proxies=proxies)

查看代理是否有效

和telnet作用一样

import telnetlib

if __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

安装依赖

pip install aiohttp

示例

import aiohttp
import asyncio


async def main():
    async with aiohttp.ClientSession() as client:
        resp = await client.post(
            'https://www.psvmc.cn/login.json',
            json={'keyword': '123'}
        )
        result = await resp.text()
        print(result)


loop = asyncio.get_event_loop()
loop.run_until_complete(main())

报错

RuntimeError: Event loop is closed

asyncio.run(main())

更改为

loop = asyncio.get_event_loop()
loop.run_until_complete(main())

异步请求

import asyncio
import aiohttp
import time


async def download_one(url):
    async with aiohttp.ClientSession() as session:
        async with session.get(url) as resp:
            print('Read {} from {}'.format(resp.content_length, url))


async def download_all(sites):
    tasks = [asyncio.ensure_future(download_one(site)) for site in sites]
    await asyncio.gather(*tasks)


def main():
    sites = [
        'https://www.psvmc.cn/index.html',
        'https://www.psvmc.cn/login.json',
        'https://www.psvmc.cn/userlist.json'
    ]
    start_time = time.perf_counter()

    loop = asyncio.get_event_loop()
    try:
        loop.run_until_complete(download_all(sites))
    finally:
        if loop.is_running():
            loop.close()
    end_time = time.perf_counter()
    print('Download {} sites in {} seconds'.format(
        len(sites), end_time - start_time))


if __name__ == '__main__':
    main()

httpx

详情:https://cloud.tencent.com/developer/article/1907289

JSON

字符串转对象

import json

# 一些 JSON:
x =  '{ "name":"Bill", "age":63, "city":"Seatle"}'

# 解析 x:
y = json.loads(x)

# 结果是 Python 字典:
print(y["age"])

对象转字符串

import json

# Python 对象(字典):
x = {
  "name": "Bill",
  "age": 63,
  "city": "Seatle"
}

# 转换为 JSON:
y = json.dumps(x)

# 结果是 JSON 字符串:
print(y)

当 Python 转换为 JSON 时,Python 对象会被转换为 JSON(JavaScript)等效项:

Python

JSON

dict

Object

list

Array

tuple

Array

str

String

int

Number

float

Number

True

true

False

false

None

null

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-11-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 网络请求
  • requests
    • 响应
      • 请求
        • GET请求
        • POST请求
        • 其他类型请求
      • 代理
        • 查看代理是否有效
    • 异步请求
      • aiohttp
        • httpx
        • JSON
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档