使用了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.get
:aiohttp.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密集型任务。通过并发地发起网络请求,程序无需在每个请求上顺序等待,从而大大提高了效率。