有没有一种方法可以在不使用Selenium和Web浏览器的情况下从网站下载csv数据?

时间:2020-10-06 17:45:40

标签: javascript python-3.x url automation

我想自动从特定网站(通过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?

还附上它的快照:

Download_Button_Inspect_Element_snap

2 个答案:

答案 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"] ])