首页 > 解决方案 > 刮问题使我的旅行航班数据使用cheerio

问题描述

我正在为一个项目抓取 Make My Trip Flight 数据,但由于某种原因它不起作用。我尝试了很多选择器,但没有一个起作用。另一方面,我也尝试用相同的逻辑抓取另一个站点,并且成功了。有人可以指出我哪里出错了吗?

我正在使用 Cheerio 和 axios

const cheerio = require('cheerio');
const axios = require('axios');

做我的旅行:

axios.get('https://www.makemytrip.com/flight/search?itinerary=BOM-DEL-14/11/2020&tripType=O&paxType=A-1_C-0_I-0&intl=false&cabinClass=E').then(urlRes => {
    const $ = cheerio.load(urlRes.data);
    $('.fli-list.one-way').each((i, el) => {
        const airway = $(el).find('.airways-name ').text();
        console.log(airway);
    });
}).catch(err => console.log(err));

该代码适用的另一个站点:

axios.get('https://arstechnica.com/gadgets/').then(urlRes => {
    const $ = cheerio.load(urlRes.data);
    $('.tease.article').each((i, el) => {
        const link = $(el).find('a.overlay').attr('href');
        console.log(link);
    });
}).catch(err => console.log(err));

标签: node.jsweb-scrapingaxioscheerio

解决方案


你应该解析的 TLDR

  • https://voyager.goibibo.com/api/v2/flights_search/find_node_by_name_v2/?search_query=DEL&limit=15&v=2

代替

  • https://www.makemytrip.com/flight/search?itinerary=BOM-DEL-14/11/2020&tripType=O&paxType=A-1_C-0_I-0&intl=false&cabinClass=E

解释(希望足够清楚)

因为您正尝试使用一个普通的 GET 请求来解析繁重的 Web 应用程序……以这种方式是不可能的 :) 提供的 url 之间的主要区别:

  • 第二个网页(是的,只是一个页面,而不是像 makemytrip 这样的 js 应用程序)“https://arstechnica.com/gadgets/”以完整的内容回复您

  • makemytrip 仅使用 js 脚本响应您,该脚本完成工作 - 加载数据等。

要解析如此复杂的网络应用程序,您应该调查(在浏览器中按 f12 -> 网络)在页面加载时在浏览器中运行的所有请求,并在脚本中重复这些请求......就像在这种情况下,您可能会注意到 API 端点响应包含所有需要的数据。


推荐阅读