【问题标题】:Problem with scraping make my trip flight data using cheerio刮问题使我的旅行航班数据使用cheerio
【发布时间】:2020-11-13 14:52:13
【问题描述】:

我正在为一个项目抓取 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.js web-scraping axios cheerio


    【解决方案1】:

    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响应所有需要的数据的端点。

    【讨论】:

    • 能否请您链接一些示例或教程,以便我更好地理解?我找不到您提到的那个特定脚本。抱歉再次询问!
    • 例如,如果您使用的是 Firefox,请阅读他们的教程developer.mozilla.org/en-US/docs/Tools 您可以使用“网络监视器”找到航班 API 的链接——它是一个核心工具(您对如何解析任何特定站点的调查应该从这里开始)
    【解决方案2】:

    我认为 Cheerio 工作得很好,我会建议再次检查 HTML 并找到一个新元素、类或其他要搜索的东西。

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

    试着找一些更特别的东西来过滤。

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

    【讨论】:

    • 这个类的组合是存在的,我确信这一点。我猜@madzohan 提到的可能是原因。你能再看看代码吗:)
    • 你将不得不使用不同的网站来完成这项任务,因为所有的航班数据都是通过 JavaScript 呈现的,这使得它几乎不可能被轻易废弃。当您找到您的网站时,请转到源代码或检查特定元素并执行相同的功能并进行一些小的更改以使其正常工作,祝您好运!
    猜你喜欢
    • 2014-08-31
    • 2014-08-10
    • 1970-01-01
    • 2014-02-26
    • 1970-01-01
    • 1970-01-01
    • 2011-05-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多