Python HTTP 错误 429(请求过多)

Python HTTP error 429 (Too Many Requests)

我曾经从 URL 中获取 CSV 文件,然后将该 CSV 文件直接放入 Pandas 数据框,如下所示:

import pandas as pd

grab_csv = 'https://XXXX.XX/data.csv'
pd_data = pd.read_csv(grab_csv).drop(columns=['Column 1', 'Column 2', 'Column 3', 'Column 4', 'Column 4', 'Column 5', 'Column 6', 'Column 7'])

从今天开始,我得到了urllib.error.HTTPError: HTTP Error 429: Too Many Requests。我为修复它所做的尝试:

import pandas as pd
import requests
from io import StringIO

grab_csv = 'https://XXXX.XX/data.csv'

headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36'}
        
res_grab_data = requests.get(StringIO(grab_csv), headers=headers).text

pd_data = pd.read_csv(res_grab_data).drop(columns=['Column 1', 'Column 2', 'Column 3', 'Column 4', 'Column 4', 'Column 5', 'Column 6', 'Column 7'])

这一次,我收到错误 requests.exceptions.MissingSchema: Invalid URL '<_io.StringIO object at 0x0000012B7C622A20>': No schema supplied. Perhaps you meant http://<_io.StringIO object at 0x0000012B7C622A20>?

知道如何使用 pandas 和请求解决 HTTP 错误 429 吗?

错误是由您向其发出请求的网络服务器抛出的,几乎可以肯定是因为您发出请求的速度太快而他们不喜欢。这不是因为你的代码有错误。

您修复它的尝试没有多大意义 -- StringIO 允许您像使用文件对象一样使用 in-memory 字符串。将它作为参数传递给 requests.get 并不是真正有效的用例——您应该像以前一样使用 requests.get(grab_csv, ...,因为 .get() 期望 url 参数是一个字符串。

我会查阅您使用的 API 文档(如果有的话),并降低您的请求速度以符合它们的限制。

有一个整洁的 Python 程序包(恰如其分地命名为 ratelimit),可让您修饰函数以实施速率限制:https://pypi.org/project/ratelimit/