自动将数据输入网页并下载结果

Automatically input data into webpage and download the result

我正在尝试自动将值输入到此网页 http://predict.habhub.org/ 并下载按下 运行 预测按钮时创建的结果 csv 文件。 我希望能够多次执行此操作(初始参数的 90 种不同组合),我可以使 for 循环正常,但无法使用代码将此信息输入网站。

altitudes = [32000, 33000, 34000]
ascentRates = [3.0, 3.5, 4.0, 4.5, 5.0, 5.5]
descentRates = [11, 13, 15, 17, 19]


for altitude in altitudes:

    for ascent in ascentRates:

        for descent in descentRates:
            print(altitude)
            print(ascent)
            print(descent)
            print("")

这可能真的很简单,但是,由于我的编程知识有限,我真的不知道从哪里开始。我试图用 python(urllib/requests) 来做到这一点,但我没有取得任何进展。希望有人能给我指出正确的方向。

requests 模块是(可以说是唯一)涉及 HTTP 和 Python 的正确选择。 在这种情况下,您需要 "POST"(上传)您的数据到服务器(参见 requests documentation)。

现在您必须弄清楚 "POSTed" 从哪里获取什么样的数据。例如,使用 Chrome 的 Web 检查器,您可以看到以下数据已发布到 http://predict.habhub.org/ajax.php?action=submitForm

launchsite=Other&lat=52.2135&lon=0.0964&initial_alt=0&hour=21&min=48&second=0&day=23&month=6&year=2017&ascent=5&burst=30000&drag=5&submit=Run+Prediction

您现在必须创建一个可以输入 requests.post() 的有效负载字典。在这个字典中,您可以将值调整为您想要发送到服务器的任何值(请注意,该表单使用与示例数据不同的标识符:burst = altitude,drag = descentRate):

import requests
payload = {'launchsite': 'Other', 'lat': '52.2135', 'lon': '0.0964', 'initial_alt': '0', 'hour': '21', 'min': '48', 'second': '0', 'day': '23', 'month': '6', 'year': '2017', 'ascent': '5', 'burst': '30000', 'drag': '5', 'submit': 'Run+Prediction'}
url = 'http://predict.habhub.org/ajax.php?action=submitForm'
r = requests.post(url, payload)

如果一切顺利,您应该已经收到一些包含您的 uuid 的 json 数据,您可以按如下方式提取这些数据:

uuid = r.json()['uuid']

现在您可以下载并存储您的 csv 数据:

csv_url = 'http://predict.habhub.org/preds/{}/flight_path.csv'.format(uuid)
r = requests.get(csv_url)
with open('flight_path.csv', 'w') as f:
    f.write(r.text)

表彰Jkm解决了我的困境!

对于遇到类似问题的任何人,这里是我的最终代码:

import requests
import json



#The date must be in the future for this to work!

launchSite = 'Other'  #Don't change this line
latitude = 39.0063
longitude = -104.8841
launchAltitude = 2212
launchHour = 15 #For colorado add 6hrs to local time(MDT)
launchMinute = 0
launchSecond = 0
launchDay = 24
launchMonth = 6 #this must be a number(ie June = 6)
launchYear = 2017
ascentRates = [3.0, 3.5, 4.0, 4.5, 5.0, 5.5]
burstAltitudes = [32000, 33000, 34000]
descentRates = [11, 13, 15, 17, 19]





for burstAltitude in burstAltitudes:

    for ascent in ascentRates:

        for descent in descentRates:
            print(burstAltitude)
            print(ascent)
            print(descent)
            print("")
            payload = {'launchsite': launchSite, 'lat': latitude, 'lon': longitude, 'initial_alt': launchAltitude, 'hour': launchHour,
                       'min': launchMinute, 'second': launchSecond, 'day': launchDay, 'month': launchMonth, 'year': launchYear, 'ascent': ascent,
                       'burst': burstAltitude, 'drag': descent, 'submit': 'Run+Prediction'}
            url = 'http://predict.habhub.org/ajax.php?action=submitForm'
            r = requests.post(url, payload)
            print(r.text)

            uuid = r.json()['uuid']

            csv_url = 'http://predict.habhub.org/preds/{}/flight_path.csv'.format(uuid)
            r = requests.get(csv_url)
            name = 'burst=' + str(burstAltitude) +' ascent=' + str(ascent) + ' descent=' + str(descent)
            with open('predicted_%s.csv' % name, 'w') as f:
                f.write(r.text)