更新:我已将以下脚本放在一起,以使用XML 的网址,而不使用{{中所建议的类似时间代码的后缀 3}},并报告在网站上明显波动的下行链路功率。我得到了三个小时,不变的数据。
所以看起来我需要正确构建它(时间码?授权?密码?)才能成功完成。就像我在下面的评论中所说," 我不想做任何不允许和欢迎的事情 - 美国宇航局已经有足够的挑战试图与四十年前的太空船交谈20十亿公里之外!"
def dictify(r,root=True):
"""from: https://stackoverflow.com/a/30923963/3904031"""
if root:
return {r.tag : dictify(r, False)}
d=copy(r.attrib)
if r.text:
d["_text"]=r.text
for x in r.findall("./*"):
if x.tag not in d:
d[x.tag]=[]
d[x.tag].append(dictify(x,False))
return d
import xml.etree.ElementTree as ET
from copy import copy
import urllib2
url = 'https://eyes.nasa.gov/dsn/data/dsn.xml'
contents = urllib2.urlopen(url).read()
root = ET.fromstring(contents)
DSNdict = dictify(root)
dishes = DSNdict['dsn']['dish']
dp_dict = dict()
for dish in dishes:
powers = [float(sig['power']) for sig in dish['downSignal'] if sig['power']]
dp_dict[dish['name']] = powers
print dp_dict['DSS26']
我想跟踪answer below(DSN)与之通信的航天器,比如每分钟一次。
我从我的NASA Deep Space Network的答案中学到了如何从Flight Radar 24做类似的事情,这仍然代表了我目前从网站获取数据的技能。
对于FR24,我在previous question作为一个很好的起点进行了解释。我已经在Chrome浏览器中使用开发人员工具功能打开了页面,我可以看到菜肴,航天器和相关数字数据等项目的数据是以XML格式请求的,例如
https://eyes.nasa.gov/dsn/data/dsn.xml?r=293849023
所以看起来我需要在每分钟r=
之后构造一个整数(时间码?授权?密码?)。
我的问题:使用python,我怎样才能最好地找出整数代表什么,以及如何生成它以便每分钟正确地请求一次数据?
上图:美国国家航空航天局的DSN现在页面的屏幕截图蒙太奇也参见https://eyes.nasa.gov/dsn/dsn.html
答案 0 :(得分:1)
在get参数中使用随机数(或时间戳...)会诱使浏览器真正发出请求(而不是使用浏览器缓存)。
这种方法是webdev使用的某种“黑客”,这样他们就可以确定请求确实发生了。
由于您没有使用网络浏览器,我很确定您可以完全忽略此参数,并且仍然可以获得刷新的数据。
---编辑---
实际上r
似乎是必需的,必须更新。
#!/bin/bash
wget https://eyes.nasa.gov/dsn/data/dsn.xml?r=$(date +%s) -O a.xml -nv
while true; do
sleep 1
wget https://eyes.nasa.gov/dsn/data/dsn.xml?r=$(date +%s) -O b.xml -nv
diff a.xml b.xml
cp b.xml a.xml -f
done
您无需模拟浏览器。只需将r设置为任何值并递增即可。 (或使用时间戳)
答案 1 :(得分:1)
关于更新后的问题,为什么要避免在生成r
查询字符串参数时发送它?此外,使用requests
模块,也很容易通过请求发送参数:
import time
import requests
import xml.etree.ElementTree as ET
url = 'https://eyes.nasa.gov/dsn/data/dsn.xml'
r = int(time.time() / 5)
response = requests.get(url, params={'r': r})
root = ET.fromstring(response.content)
# etc....