我曾经从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>?
。
有什么主意我可以通过熊猫和请求解决HTTP错误429吗?
答案 0 :(得分:0)
向您发出请求的Web服务器抛出错误,几乎可以肯定是因为您发出请求的速度太快,而他们不喜欢它。这不是因为您的代码错误。
您尝试修复它没有多大意义-List<Map<String, Object>> data = getData();
Map<String, List<Object>> result = new HashMap<>();
for (Map<String, Object> element: data) {
element.forEach((key, val) -> {
if (result.containsKey(key))
result.get(key).add(val);
else
result.put(key, Arrays.asList(val));
});
}
允许您像使用文件对象一样使用内存中的字符串。将其作为参数传递给StringIO
并不是真正的用例-您应该像以前一样使用requests.get
,因为requests.get(grab_csv, ...
期望.get()
参数能够是一个字符串。
我将咨询您使用的API文档(如果有的话),并放慢您的请求速度以使其符合限制。
有一个简洁的Python包(恰当地命名为url
),可让您装饰函数以实施速率限制:https://pypi.org/project/ratelimit/