python36異步任務 獲取ip地址的地理位置

# encoding: utf-8

import asyncio
import requests
import functools

url = "http://ip.zxinc.org/api.php"

params_list = []  # 存放全部要查詢的參數
with open("IPv6.txt", 'r', encoding='utf-8') as f:
    for ip in f:
        ip = ip.strip()
        payload = {"type": "json", "ip": ip}
        params_list.append(payload)


def save_result(res):  # task回調函數
    print(res)
    params, response = res.result()  # 這就是get_ip_location函數的返回值,經過異步任務的result函數獲取

    if response.status_code == 500:
        with open("save_result22.txt", "a+", encoding="utf-8") as f1:
            f1.write(params["ip"] + " = 地址有誤" + "\n")
    else:
        result = response.json()
        country = result["data"]["country"]
        with open("save_result22.txt", "a+", encoding="utf-8") as f1:
            f1.write(params["ip"] + " = " + country + "\n")


async def get_ip_location(param):  # 發送get請求
    print("start ", param)
    # param = {"type": "json", "ip": "1.1.1.1"}  param是requests.get的參數
    loop = asyncio.get_event_loop()
    try:
        # 要使用await, 必須將第三方包轉爲awaitable對象
        response = await loop.run_in_executor(None, functools.partial(requests.get, url=url, params=param))
        return param, response
    except Exception as e:
        return param, e

tasks = []
for param in params_list:
    task = asyncio.ensure_future(get_ip_location(param))  # 1.建立異步任務
    task.add_done_callback(save_result)  # 2.給任務添加回調函數
    tasks.append(task)
loop = asyncio.get_event_loop()  # 3.建立事件循環
loop.run_until_complete(asyncio.wait(tasks))  # 4.執行全部異步任務
相關文章
相關標籤/搜索