HTTPX异步,提速150倍

使用了Https,大大提升了大量网络io请求时的速度

def get_majors_school_list():
    with open("./data/majors_list.json", "r") as f:
        majors_list = json.load(f)
    for major in majors_list:
        major_code = major.get("major_code")
        major_name = major.get("major_name")
        way = major.get("way")
        url = f""
        headers = {
            "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36"
        }
        response = requests.get(url, headers=headers)
        result = response.json().get("data").get("results")
        major["school_list"] = result
        # 按专业名称保存
        with open(f"./data/majors_school_list/{major_code}_{major_name}_{way}.json", "w") as f:
            f.write(json.dumps(majors_list, ensure_ascii=False))
import json
import aiohttp
import asyncio

async def fetch_major_data(session, major):
    major_code = major.get("major_code")
    major_name = major.get("major_name")
    way = major.get("way")
    url = f""
    headers = {
        "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36"
    }
    async with session.get(url, headers=headers) as response:
        result = await response.json()
        major["school_list"] = result.get("data").get("results")
        # 按专业名称保存
        with open(f"./data/majors_school_list/{major_code}_{major_name}_{way}.json", "w") as f:
            f.write(json.dumps(major, ensure_ascii=False))

async def get_majors_school_list():
    with open("./data/majors_list.json", "r") as f:
        majors_list = json.load(f)
    
    async with aiohttp.ClientSession() as session:
        tasks = [fetch_major_data(session, major) for major in majors_list]
        await asyncio.gather(*tasks)

# asyncio.run 是 Python 3.7+ 中的新方式来运行异步程序
asyncio.run(get_majors_school_list())

导入模块

pythonCopy code

import json import aiohttp import asyncio

  • json:用于处理 JSON 数据。
  • aiohttp:用于异步 HTTP 网络请求。
  • asyncio:Python 的异步I/O框架,用于编写并发代码。

异步函数定义

pythonCopy code

async def fetch_major_data(session, major):

  • async def:定义一个异步函数。这允许函数内部使用 await 表达式,并使函数执行非阻塞。

构建请求 URL 和头部

pythonCopy code

major_code = major.get("major_code") major_name = major.get("major_name") way = major.get("way") url = f"" headers = { "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36" }

  • 提取专业信息,构建 API 请求的 URL 和 headers。

发起异步网络请求

pythonCopy code

async with session.get(url, headers=headers) as response:

  • async with:上下文管理器,用于异步操作。这里用于执行异步的 HTTP GET 请求。
  • session.getaiohttp.ClientSession 对象的 get 方法,用于发起 GET 请求。它是异步的,返回一个 response 对象。

处理响应数据

pythonCopy code

result = await response.json() major["school_list"] = result.get("data").get("results")

  • await:等待异步操作完成。这里等待的是 response.json(),它异步地将响应内容转换为 JSON 对象。
  • 解析 JSON 数据,并将解析后的数据保存到 major 字典中。

保存数据到文件

pythonCopy code

with open(f"./data/majors_school_list/{major_code}_{major_name}_{way}.json", "w") as f: f.write(json.dumps(major, ensure_ascii=False))

  • 将包含学校列表的 major 字典保存为 JSON 文件。

驱动整个异步流程

pythonCopy code

async def get_majors_school_list(): with open("./data/majors_list.json", "r") as f: majors_list = json.load(f) async with aiohttp.ClientSession() as session: tasks = [fetch_major_data(session, major) for major in majors_list] await asyncio.gather(*tasks)

  • 定义另一个异步函数来读取专业列表,然后为列表中的每个专业创建一个异步任务。
  • aiohttp.ClientSession():创建一个 HTTP 会话,用于发起请求。
  • asyncio.gather:并发运行所有的异步任务。

执行异步主函数

pythonCopy code

asyncio.run(get_majors_school_list())

  • asyncio.run:运行最高级别的入口点 “main” 函数,这里是 get_majors_school_list()。这是 Python 3.7+ 中推荐的方式来运行异步程序。

这段代码展示了如何使用 Python 的异步编程来高效地处理网络I/O密集型任务。通过并发地发起网络请求,程序无需在每个请求上顺序等待,从而大大提高了效率。

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇