python - 如何从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
,Outlets
或number of stores
,Weighted Avg
从上述尝试中,我无法获得这样的输出数据帧。我应该如何正确获取数据?任何人都可以建议在熊猫中这样做吗?任何想法?
解决方案
您必须添加查询参数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)