我想自动从特定网站(通过Python)进行数据下载过程,但是不能使用Selenium或浏览器,因为代码将安排在服务器上,而硒和浏览器选项均不可用。
我尝试使用 pyautogui 软件包执行自动执行鼠标移动的python代码n单击下载文件,但是由于服务器不允许打开浏览器选项而无法正常工作(而且我无法也使用硒,这将是理想的选择)
附加以下代码:
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')
在实现此目标的其他方式上,我需要一些帮助。鉴于上述限制,我该如何自动执行文件下载,以便在服务器端运行/安排一个.py文件来自动执行此过程。
我尝试遵循 @Olvin Roght的答案,但是找不到csv的触发函数或文件源: Is there any way to download csv file from “website button click” using Python?
还附上它的快照:
答案 0 :(得分:0)
对于@epascarello的上述评论,看来数据是通过Javascript在客户端生成的。
我怎么知道这个?使用Chrome的开发人员控制台,我切换到“网络”标签,单击“下载CSV”按钮,然后观察了它的工作-或没有的工作。它没有向服务器发出CSV文件请求。
这意味着Selenium / WebDriver可能是从CDC下载此数据的唯一选择。这可能很困难并且容易中断,所以我可能建议使用其他数据来源:《纽约时报》 in a GitHub repository公开了其数据。
答案 1 :(得分:0)
在这种情况下,我建议您首先找到用于获取数据的API。通过快速的网络检查,我发现数据是从https://covid.cdc.gov/covid-data-tracker/COVIDData/getAjaxData?id=ed_trend_data
获取的。您可以在开发者控制台的“网络”标签中查看所有传出的请求。
您可以通过向网址发送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"] ])