1

我曾经从 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 吗?

4

1 回答 1

1

该错误是由您发出请求的 Web 服务器引发的,几乎可以肯定是因为您发出请求的速度太快而且他们不喜欢它。这不是因为您的代码中的错误。

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

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

有一个简洁的 Python 包(恰当地命名ratelimit),可以让您装饰您的函数以强制执行速率限制:https ://pypi.org/project/ratelimit/

于 2020-11-03T17:06:22.583 回答