node.js - 刮问题使我的旅行航班数据使用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));
解决方案
你应该解析的 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 端点响应包含所有需要的数据。
推荐阅读
- javascript - 使用连接键将深层嵌套对象转换为浅层对象的 Javascript 函数
- r - 循环遍历R中不同文件夹中的多个文件
- php - 使用php curl通过API上传图像不起作用
- highcharts - 如何将水平条形图与折线图结合起来?
- swift - 延迟 onDisconnect 操作(Firebase 实时数据库)
- wpf - 在 wpf 主窗口中隐藏顶部面板
- react-native - 当模态在反应式中打开时如何使背景模糊
- laravel - 使用 Laravel 重定向 Vue 应用程序
- security - 如何对其他团队隐藏 git 功能分支?
- python - 通过 Selenium 抓取维基百科表得到 SyntaxError