我试图缩小此网页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>]
View source也显示0,所以我理解为什么BeautifulSoup也返回0。
任何人都知道获取当前值的任何其他方法吗?
答案 0 :(得分:7)
您的方法存在的问题是页面首先加载视图,然后执行常规请求以刷新页面。如果您查看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访问它而没有任何问题。
更多信息:
答案 1 :(得分:6)
基于@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秒发一次请求。
根据需要使用此代码,扩展它或其他任何内容。希望这有帮助!
答案 2 :(得分:0)
您可以使用selenium抓取包含javascript添加的动态内容的网页。
Stretch