Python在尝试2个变量时处理错误



我正在尝试使用python脚本自动从苹果网站收集移动数据。我遇到的一个大障碍是,每次运行脚本时,我都要尝试两个变量的错误。csv url结构如下:

https://covid19-static.cdn-apple.com/covid19-mobility-data/2208HotfixDev**22**/v3/en-us/applemobilitytrends-**2022-03-03**'.csv

我标记为粗体的2个变量-HotfixDev##和日期。据我所知,如果不尝试,也没有办法知道(他们似乎不会每天更新(。

我使用以下代码来处理尝试日期变量时的错误:

def get_url(estimated):
aapl_dl_date = estimated - dt.timedelta(days=1)
url2 = aapl_dl_date.strftime("%Y-%m-%d")
full_url = url1+url2+url3

return full_url
while True:
try:
url = get_url(estimated)
df = pd.read_csv(url)
print('using link: ',url)
break
except HTTPError:
estimated = estimated - dt.timedelta(days=1)

(估计值是一个变量,以字符串形式包含今天的日期(这很好。现在我意识到HotfixDev##也是一个变量。最初,我的想法是,对于每一次约会,做一些循环,经历00、01…99,然后如果运气不好,就去前一天。但因为它涉及错误处理,我不知道如何堆叠它

有什么想法吗?

原来有一个索引文件列出了CSV数据文件的位置https://covid19-static.cdn-apple.com/covid19-mobility-data/current/v3/index.json.您可以使用它以编程方式访问CSV文件,而不必遍历潜在的文件名。

我通过以下过程找到了这个索引文件:

  1. 访问https://covid19.apple.com/mobility
  2. 按F12打开开发工具
  3. 转到开发人员工具中的"网络"选项卡
  4. 刷新页面

完成后,页面加载的所有资源都会列在网络选项卡中。index.json文件就是其中之一。

您可以使用此索引文件加载CSV,如下所示:

import requests
BASE_URL = "https://covid19-static.cdn-apple.com"
def fetch_index_data():
url = BASE_URL + "/covid19-mobility-data/current/v3/index.json"
response = requests.get(url)
response.raise_for_status()
return response.json()
def fetch_csv_text(base_path, csv_path):
url = BASE_URL + base_path + csv_path
response = requests.get(url)
response.raise_for_status()
return response.text
def main():
index_data = fetch_index_data()
csv_text = fetch_csv_text(
index_data["basePath"],
index_data["regions"]["en-us"]["csvPath"]
)
print(csv_text[:200])
if __name__ == "__main__":
main()

此外,看起来同样的数据也可以作为JSON使用,目前位于https://covid19-static.cdn-apple.com/covid19-mobility-data/2209HotfixDev8/v3/en-us/applemobilitytrends.json.这可能更容易使用。您可以通过稍微修改上面的代码来获取它。

import requests
BASE_URL = "https://covid19-static.cdn-apple.com"
def fetch_index_data():
url = BASE_URL + "/covid19-mobility-data/current/v3/index.json"
response = requests.get(url)
response.raise_for_status()
return response.json()
def fetch_mobility_data(base_path, json_path):
url = BASE_URL + base_path + json_path
response = requests.get(url)
response.raise_for_status()
return response.json()
def main():
index_data = fetch_index_data()
mobility_data = fetch_mobility_data(
index_data["basePath"],
index_data["regions"]["en-us"]["jsonPath"]
)
print(list(mobility_data.keys()))
if __name__ == "__main__":
main()

最新更新