首页 > 解决方案 > 如何从python中的url正确获取数据帧?

问题描述

我想从 USDA 网站自动获取数据,我对数据选择的几个类别特别感兴趣。为此,我尝试了以下方法:

import io
import requests
import pandas as pd

url = 'https://www.marketnews.usda.gov/mnp/ls-report-retail?&repType=summary&portal=ls&category=Retail&species=BEEF&startIndex=1'

query_list = {"Report Type":"item","species":"BEEF","portal":"ls","category":"Retail", "Regions":"National", "Grades":"ALL", "Cut": "All", "Dates_from":"2019-03-01", "Dates_to":"2021-02-01"}
req = requests.get(url, params=query_list)
df = pd.read_csv(io.StringIO(req.text), sep="\s\s+", engine="python")
df.to_csv("usda_report.csv")

但我无法获得我想要的预期数据帧,这是我尝试运行以上尝试后的输出:

ParserError: Expected 1 fields in line 117, saw 2. 错误可能是由于使用多字符分隔符时忽略引号引起的。

期望的输出

我需要通过这些查询来进行正确的数据选择:Category = "Retail"; Report Type = "Item"; Species = "Beef"; Region(s) = "National"; Dates_from = "2019-03-01"; Dates_to = "2021-02-15".

理想情况下,我想传递这些查询并希望获得以下数据帧(数据帧的头部):

在此处输入图像描述

更新

在我想要的输出中,我需要这些列:Date, Region, Grade, Cut, Retail Items,Outletsnumber of stores,Weighted Avg

从上述尝试中,我无法获得这样的输出数据帧。我应该如何正确获取数据?任何人都可以建议在熊猫中这样做吗?任何想法?

标签: pythonpandasdataframe

解决方案


您必须添加查询参数format=text才能从此网站获取 csv 格式的数据。

url = 'https://www.marketnews.usda.gov/mnp/ls-report-retail'
query_list = {
    "format":"text", 
    "repType":"item",
    "species":"BEEF",
    "portal":"ls",
    "region":"NATIONAL",
    "cut":"0",
    "repDate":"03/01/2019", 
    "endDate":"02/01/2021",
}
req = requests.get(url, params=query_list)
df = pd.read_csv(io.StringIO(req.text), sep="\s\s+", engine="python")

您可能需要进一步修改查询参数。您可以通过浏览器使用该网站并更改所需的过滤器。然后你可以在 javascript 终端中使用这个命令将 url 中的当前查询参数转换为 json。

JSON.stringify(Object.fromEntries(new URLSearchParams(location.search)), null, 2)

推荐阅读