从依赖于交互式地图的表中收集数据

R.板

另一个刮问题。我正在尝试从以下网站抓取数据:https : //www.flightradar24.com/data/airlines/kl-klm/routes

但是,我想要获取的数据仅在您单击其中一个机场后以地图下方表格的形式显示。从该表中,我想提取一个数字,该数字指示去往每个机场的每日航班的频率。例如,如果单击巴黎戴高乐机场,然后从表格中检查国家荷兰,则该行在上一行显示td rowspan =“ 6”,在这种情况下,这表示荷航每天有6班飞往巴黎的航班。

我假设我需要使用Selenium之类的浏览器会话或类似的东西,所以我从下面的代码开始,但是由于无法定位中的机场点,所以我不确定从这里开始源代码。

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

chrome_options = Options()
chrome_options.add_argument("--headless")
chrome_options.binary_location = 'C:/Users/C55480/AppData/Local/Google/Chrome SxS/Application/chrome.exe'

driver = webdriver.Chrome(executable_path='C:/Users/C55480/.spyder-py3/going_headless/chromedriver.exe', chrome_options=chrome_options)

airlines = ['kl-klm', 'dy-nax', 'lh-dlh']

for a in airlines:
    url = 'https://www.flightradar24.com/data/airlines/' + a + '/routes'
    page = driver.get(url)

有没有一种方法可以让Selenium单击每个点并刮取每个机场的每日航班数量,然后从中找出飞往每个国家的每日航班总数?

安德森

代替使用Selenium,尝试通过直接HTTP请求获取所需的数据:

import requests
import json

s = requests.session()
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:52.0) Gecko/20100101 Firefox/52.0"}
r = s.get("https://www.flightradar24.com/data/airlines/kl-klm/routes", headers=headers)

可以在如下所示的脚本节点中找到每个机场的数据

<script>var arrRoutes=[{"airport1":{"country":"Denmark","iata":"AAL","icao":"EKYT","lat":57.092781,"lon":9.849164,"name":"Aalborg Airport"}...]</script>

要从arrRoutes变量获取JSON

my_json = json.loads(r.text.split("arrRoutes=")[-1].split(", arrDates=")[0])

您需要获取"iata"每个机场的缩写(键的):

abbs_list = []
for route in my_json:
    if route["airport1"]["country"] == "Netherlands":
        abbs_list.append(route["airport2"]["iata"])

输出print(abbs_list)应该像['AAL', 'ABZ'...]

现在,我们可以请求每个机场的数据:

url = "https://www.flightradar24.com/data/airlines/kl-klm/routes?get-airport-arr-dep={}"
for abbr in abbs_list:
    cookie = r.cookies.get_dict()
    headers = {"User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:52.0) Gecko/20100101 Firefox/52.0",
               "Content-Type": "application/json",
               "x-fetch": "true"}
    response = s.get(url.format(abbr), cookies=cookie, headers=headers).json()
    print(abbr, ": ", response["arrivals"]["Netherlands"]["number"]["flights"])

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章