有没有一种方法可以在不使用 Selenium 和 Web 浏览器的情况下从网站下载 csv 数据?
Is there a way to download csv data from websites without using Selenium and Web Browser?
我想从特定网站自动执行数据下载过程(通过 Python),但不能使用 Selenium 或浏览器,因为代码将安排在 selenium 和浏览器选项均不可用的服务器上.
我尝试使用 pyautogui 包的 python 代码来自动移动鼠标 n 单击以下载文件,但它不起作用,因为服务器不允许打开一个浏览器选项(我也不能使用 Selenium,这将是理想的选择)
附上下面的代码:
import time
import webbrowser
url = 'https://covid.cdc.gov/covid-data-tracker/#ed-visits'
#Open URL in a new tab, if a browser window is already open*
webbrowser.open_new_tab(url)
print(pyautogui.size())
time.sleep(5)
pyautogui.moveTo(1275, 655, duration = 5)
pyautogui.click()
time.sleep(5)
pyautogui.press('down')
pyautogui.press('enter')
我想在实现此目标的其他方法上获得一些帮助。鉴于上述限制,我如何自动下载文件,这样我 run/schedule 服务器端的 .py 文件就可以自动执行此过程。
我尝试按照 @Olvin Roght 的 回答,但找不到触发函数或 csv 的文件源:
同时附上照片:
Download_Button_Inspect_Element_snap
关于@epascarello 上面的评论,看起来数据是通过Javascript在客户端生成的。
我怎么知道的?使用 Chrome 的开发人员控制台,我切换到“网络”选项卡,单击“下载 CSV”按钮,然后观察它做了什么 - 或者更确切地说,它 没有做什么 做。它没有向服务器请求 CSV 文件。
这意味着 Selenium/WebDriver 可能是您从 CDC 下载此数据的唯一选择。这可能很困难并且容易出错,所以我可以建议一个不同的数据来源:纽约时报已经提供了他们的数据 in a GitHub repository.
在这种情况下,我建议首先找到 API 来获取数据。通过快速网络检查,我发现数据是从 https://covid.cdc.gov/covid-data-tracker/COVIDData/getAjaxData?id=ed_trend_data
获取的。您可以在开发者控制台的网络选项卡中查看所有传出请求。
您可以通过向 URL 发送 GET 请求来获取 JSON 数据,然后将 JSON 转换为 CSV。
import requests, csv
# Fetch data
data = requests.get("https://covid.cdc.gov/covid-data-tracker/COVIDData/getAjaxData?id=ed_trend_data").json()["ed_trend_data"]
with open("data.csv", "w") as file:
# Open CSV writer
csv_file = csv.writer(file, lineterminator='\n')
# Write heading
csv_file.writerow([ "Geography", "Date", "Syndrome", "Percent" ])
# Write data to CSV
for item in data:
csv_file.writerow([ item["Geography"], item["Date"], item["Indicator"], item["Percent"] ])
我想从特定网站自动执行数据下载过程(通过 Python),但不能使用 Selenium 或浏览器,因为代码将安排在 selenium 和浏览器选项均不可用的服务器上.
我尝试使用 pyautogui 包的 python 代码来自动移动鼠标 n 单击以下载文件,但它不起作用,因为服务器不允许打开一个浏览器选项(我也不能使用 Selenium,这将是理想的选择)
附上下面的代码:
import time
import webbrowser
url = 'https://covid.cdc.gov/covid-data-tracker/#ed-visits'
#Open URL in a new tab, if a browser window is already open*
webbrowser.open_new_tab(url)
print(pyautogui.size())
time.sleep(5)
pyautogui.moveTo(1275, 655, duration = 5)
pyautogui.click()
time.sleep(5)
pyautogui.press('down')
pyautogui.press('enter')
我想在实现此目标的其他方法上获得一些帮助。鉴于上述限制,我如何自动下载文件,这样我 run/schedule 服务器端的 .py 文件就可以自动执行此过程。
我尝试按照 @Olvin Roght 的 回答,但找不到触发函数或 csv 的文件源:
同时附上照片:
Download_Button_Inspect_Element_snap
关于@epascarello 上面的评论,看起来数据是通过Javascript在客户端生成的。
我怎么知道的?使用 Chrome 的开发人员控制台,我切换到“网络”选项卡,单击“下载 CSV”按钮,然后观察它做了什么 - 或者更确切地说,它 没有做什么 做。它没有向服务器请求 CSV 文件。
这意味着 Selenium/WebDriver 可能是您从 CDC 下载此数据的唯一选择。这可能很困难并且容易出错,所以我可以建议一个不同的数据来源:纽约时报已经提供了他们的数据 in a GitHub repository.
在这种情况下,我建议首先找到 API 来获取数据。通过快速网络检查,我发现数据是从 https://covid.cdc.gov/covid-data-tracker/COVIDData/getAjaxData?id=ed_trend_data
获取的。您可以在开发者控制台的网络选项卡中查看所有传出请求。
您可以通过向 URL 发送 GET 请求来获取 JSON 数据,然后将 JSON 转换为 CSV。
import requests, csv
# Fetch data
data = requests.get("https://covid.cdc.gov/covid-data-tracker/COVIDData/getAjaxData?id=ed_trend_data").json()["ed_trend_data"]
with open("data.csv", "w") as file:
# Open CSV writer
csv_file = csv.writer(file, lineterminator='\n')
# Write heading
csv_file.writerow([ "Geography", "Date", "Syndrome", "Percent" ])
# Write data to CSV
for item in data:
csv_file.writerow([ item["Geography"], item["Date"], item["Indicator"], item["Percent"] ])