使用got-scraping与cheerio解析IMDB电影关联页时无法加载更多内容
解决IMDB电影关联页面“显示更多”内容无法抓取的问题
你尝试抓取IMDB电影关联页面(对应ID:tt0090887)时,遇到“显示更多”按钮加载的内容无法通过got-scraping+cheerio获取的问题,核心原因是:这些内容是动态加载的——静态HTTP请求只能拿到页面初始渲染的HTML,而“显示更多”触发的内容是通过AJAX接口异步获取的,不会包含在初始返回的HTML中,所以cheerio无法解析到这部分数据。
下面提供两种可行的解决方案:
方法1:直接调用IMDB的GraphQL接口获取全量数据
IMDB的动态内容通过GraphQL接口提供,你可以跳过页面渲染,直接请求该接口拿到完整的关联数据,效率更高。
示例代码:
const { gotScraping } = require("got-scraping"); const scrapeFullConnections = async (id) => { try { const graphqlUrl = "https://api.imdb.com/graphql"; // 定义GraphQL查询语句,按需调整字段 const query = ` query MovieConnections($titleId: ID!) { title(id: $titleId) { movieConnections { edges { node { category connections { text url } } } } } } `; const response = await gotScraping.post(graphqlUrl, { headers: { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36", "Referer": `https://www.imdb.com/title/${id}/movieconnections/`, "Content-Type": "application/json" }, json: { query: query, variables: { titleId: id } } }); const data = JSON.parse(response.body); // 处理返回的全量关联数据 console.log("完整关联数据:", data.data.title.movieConnections.edges); } catch (err) { console.error(err); } }; // 执行抓取 scrapeFullConnections("tt0090887");
方法2:用无头浏览器模拟页面渲染
如果不想研究接口逻辑,可以使用Puppeteer这类无头浏览器工具,模拟真实浏览器加载页面、执行JS并点击“显示更多”按钮,从而获取完整的DOM内容。
示例代码:
const puppeteer = require("puppeteer"); const cheerio = require("cheerio"); const scrapeWithPuppeteer = async (id) => { const browser = await puppeteer.launch(); const page = await browser.newPage(); await page.setUserAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36"); // 加载页面并等待网络空闲 await page.goto(`https://www.imdb.com/title/${id}/movieconnections/`, { waitUntil: "networkidle2" }); // 遍历并点击所有“显示更多”按钮 const showMoreButtons = await page.$$("button.ipc-btn--expand"); for (const btn of showMoreButtons) { try { await btn.click(); await page.waitForTimeout(500); // 等待内容加载完成 } catch (err) { // 忽略已被移除的按钮 continue; } } // 获取完整页面HTML const html = await page.content(); await browser.close(); // 用cheerio解析完整DOM const $ = cheerio.load(html); $(".ipc-page-grid__item") .find(".ipc-page-section") .each((index, element) => { let cat = $(element).find(".ipc-title__text > span").attr("id"); if (cat) { let conexions = []; $(element).find("ul.ipc-metadata-list > li").each((k, elem) => { const title_conex = $(elem).find("ul.ipc-inline-list > div > div > p").text().trim(); const href_conex = $(elem).find("ul.ipc-inline-list > div > div > p > a").attr("href"); conexions.push({ titol: title_conex, href: href_conex }); }); console.log(`${cat}类别:`, conexions); } }); }; // 执行抓取 scrapeWithPuppeteer("tt0090887");
内容的提问来源于stack exchange,提问作者Victor Fernandez
相关产品推荐
相关产品推荐

