抓取问题使我的旅行航班数据使用 cheerio

Problem with scraping make my trip flight data using cheerio

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

我正在使用 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));

我认为 cheerio 工作得很好,我会建议再次检查 HTML 并找到一个新元素,class 或其他要搜索的内容。

当我进入给定的 url 时,我没有找到任何组合的 .fli-list.one-way。

试着找一些更具体的东西来过滤。

如果您仍然需要帮助,我可以尝试自己抓取并发送一些代码给您

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 应用程序......以这种方式是不可能的:) 提供的网址之间的主要区别:

  • 第二个网页(是的,只是一个页面,不是像makemytrip这样的js应用)'https://arstechnica.com/gadgets/'回复你一个完整的内容

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

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