如何使用 Python 抓取实时流数据?

新手上路,请多包涵

我试图抓取此网页的航班数量 https://www.flightradar24.com/56.16,-49.51

数字在下图中突出显示: 在此处输入图像描述

该数字每 8 秒更新一次。

这是我用 BeautifulSoup 尝试的:

 import requests
from bs4 import BeautifulSoup
import time

r=requests.get("https://www.flightradar24.com/56.16,-49.51")
c=r.content
soup=BeautifulSoup(c,"html.parser")
value=soup.find_all("span",{"class":"choiceValue"})
print(value)

但这总是返回 0:

 [<span class="choiceValue" id="menuPlanesValue">0</span>]

查看源代码也显示 0,所以我明白为什么 BeautifulSoup 也返回 0。

任何人都知道任何其他方法来获取当前值?

原文由 multigoodverse 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 809
2 个回答

您的方法的问题在于页面首先加载视图,然后执行定期请求以刷新页面。如果您查看 Chrome 开发人员控制台中的网络选项卡(例如),您将看到对 https://data-live.flightradar24.com/zones/fcgi/feed.js?bounds=59.09,52.64 的请求 ,-58.77,-47.71&faa=1&mlat=1&flarm=1&adsb=1&gnd=1&air=1&vehicles=1&estimated=1&maxage=7200&gliders=1&stats=1

响应是常规的 json:

 {
  "full_count": 11879,
  "version": 4,
  "afefdca": [
    "A86AB5",
    56.4288,
    -56.0721,
    233,
    38000,
    420,
    "0000",
    "T-F5M",
    "B763",
    "N641UA",
    1473852497,
    "LHR",
    "ORD",
    "UA929",
    0,
    0,
    "UAL929",
    0
  ],
  ...
  "aff19d9": [
    "A12F78",
    56.3235,
    -49.3597,
    251,
    36000,
    436,
    "0000",
    "F-EST",
    "B752",
    "N176AA",
    1473852497,
    "DUB",
    "JFK",
    "AA291",
    0,
    0,
    "AAL291",
    0
  ],
  "stats": {
    "total": {
      "ads-b": 8521,
      "mlat": 2045,
      "faa": 598,
      "flarm": 152,
      "estimated": 464
    },
    "visible": {
      "ads-b": 0,
      "mlat": 0,
      "faa": 6,
      "flarm": 0,
      "estimated": 3
    }
  }
}

我不确定这个 API 是否以任何方式受到保护,但似乎我可以使用 curl 毫无问题地访问它。

更多信息:

原文由 André Laszlo 发布,翻译遵循 CC BY-SA 3.0 许可协议

所以根据@Andre 的发现,我写了这段代码:

 import requests
from bs4 import BeautifulSoup
import time

def get_count():
    url = "https://data-live.flightradar24.com/zones/fcgi/feed.js?bounds=59.09,52.64,-58.77,-47.71&faa=1&mlat=1&flarm=1&adsb=1&gnd=1&air=1&vehicles=1&estimated=1&maxage=7200&gliders=1&stats=1"

    # Request with fake header, otherwise you will get an 403 HTTP error
    r = requests.get(url, headers={'User-Agent': 'Mozilla/5.0'})

    # Parse the JSON
    data = r.json()
    counter = 0

    # Iterate over the elements to get the number of total flights
    for element in data["stats"]["total"]:
        counter += data["stats"]["total"][element]

    return counter

while True:
    print(get_count())
    time.sleep(8)

代码应该是自我解释的,它所做的一切都是每 8 秒打印一次实际飞行计数 :)

注: 数值与网站上的数值相似,但不完全相同。这是因为 Python 脚本和网站不太可能同时发送请求。如果您想获得更准确的结果,例如每 4 秒发出一次请求即可。

根据需要使用此代码,扩展它或其他任何东西。希望这可以帮助!

原文由 linusg 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题