python利用openaq的api key抓取阿根廷(AR)国家的所有数据

本人编程小白,经老师要求现在正在利用python对openaq网站的api进行数据抓取,有API key,但是抓取超过一定数量,比如10000左右就会各种报错。出现了Request failed with status code: 408,Request failed with status code: 500错误。下面是代码

import requests
import csv
import json

url = "https://api.openaq.org/v2/measurements?date_from=2000-01-01T00%3A00%3A00Z&date_to=2023-09-13T17%3A43%3A00Z&limit=10000000&page=1&offset=0&sort=desc&radius=1000&country=AR&order_by=datetime"
api_key = "apikey"

headers = {"accept": "application/json","X-API-Key":api_key}

response = requests.get(url, headers=headers, timeout=30)

if response.status_code == 200:
    data = response.json()

    # 保存为CSV文件
    filename = "aaa.txt"
    fields = ["locationId", "location", "parameter", "value",  "time", "lat", "lon"]
    results = data["results"]

    rows = []

    for result in results:
        row = [
            result["locationId"],
            result["location"],
            result["parameter"],
            result["value"],
            result["date"]["utc"],
            result["coordinates"]["latitude"],
            result["coordinates"]["longitude"],
        ]
        rows.append(row)

    with open(filename, mode="w", newline="", encoding="utf-8") as file:
        writer = csv.writer(file)
        writer.writerow(fields)
        writer.writerows(rows)

    print("Data saved to", filename)
else:
    print("Request failed with status code:", response.status_code)

尝试修改date_from、date_to这2个参数,不要跨度那么大,一次查询1年的,然后将每次返回结果放入变量中,最后在一次性写入csv文件中

一下查询这么多年服务器不做限制,如题注所说的有290w条数据,一下返回这么多数据可能会导致服务器奔溃(500)什么的

ps:大致获取阿根廷2016年到2023年数据,大概290万条

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632

【以下回答由 GPT 生成】

首先,你的代码中有一些问题需要解决。你可以参考以下建议来优化代码并解决报错问题:

  1. 超时问题:你的代码中设置了超时时间为30秒,但是报错显示 "Request failed with status code: 408",这意味着在30秒的时间内没有获得响应。你可以通过增加超时时间来解决这个问题,比如将超时时间设置为60秒。

python response = requests.get(url, headers=headers, timeout=60)

  1. 数据量限制问题:你设置了数据量限制为10000000,这可能会导致服务器负载过高而无法获取数据。建议将数据量限制调整为更小的数量,比如10000。

python url = "https://api.openaq.org/v2/measurements?date_from=2000-01-01T00%3A00%3A00Z&date_to=2023-09-13T17%3A43%3A00Z&limit=10000&page=1&offset=0&sort=desc&radius=1000&country=AR&order_by=datetime"

  1. 保存文件类型问题:你在代码中将结果保存为 ".txt" 文件,但实际上你打算保存为 CSV 格式的文件。建议将文件名的扩展名更正为 ".csv"。

python filename = "aaa.csv"

通过上述改进后,你的代码应该能够更流畅地运行。不过需要注意的是,由于数据量可能较大,所以该代码可能需要一些时间才能完成请求和保存操作。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^