Nodejs 用cheerio实现爬虫案例DOM操作,怎么解决动态分页href????

Nodejs 用cheerio实现爬虫案例DOM操作,怎么解决动态分页href????

<div class=“panav clearfix”> <div class=“paginator”> <span class=“tn-page-prev tn-page-thumb”><<</span> <span class=“tn-page-number tn-selected”>1</span> <a href=“javascript:;” onclick=“videos_page(2); return false;” class=“tn-page-number”>2</a> <a href=“javascript:;” onclick=“videos_page(3); return false;” class=“tn-page-number”>3</a> <a href=“javascript:;” onclick=“videos_page(4); return false;” class=“tn-page-number”>4</a> <a href=“javascript:;” onclick=“videos_page(5); return false;” class=“tn-page-number”>5</a> <a href=“javascript:;” onclick=“videos_page(6); return false;” class=“tn-page-number”>6</a> <a href=“javascript:;” onclick=“videos_page(7); return false;” class=“tn-page-number”>7</a> <a href=“javascript:;” onclick=“videos_page(8); return false;” class=“tn-page-number”>8</a>

<span class=“tn-page-break”>…</span> <a href=“javascript:;” onclick=“videos_page(188); return false;” class=“tn-page-number”>188</a> <a href=“javascript:;” onclick=“videos_page(2); return false;” class=“tn-page-thumb tn-page-next”>>></a></div> </div>

像这种分页是js动态加载数据的,request怎么去获取a标签href!!!!


3 回复

在使用Node.js进行网页爬取时,遇到动态分页的情况确实会增加难度。cheerio是一个轻量级的库,用于解析HTML,类似于jQuery,但它并不能直接处理JavaScript生成的内容。因此,对于动态加载的数据,我们需要借助其他工具,比如puppeteer来模拟浏览器行为。

使用Puppeteer获取动态分页链接

puppeteer可以用来打开一个网页,并执行JavaScript来触发页面上的事件,例如点击分页按钮。以下是一个简单的示例,演示如何使用puppeteer来抓取所有分页链接:

const puppeteer = require('puppeteer');

async function fetchPageLinks() {
    const browser = await puppeteer.launch();
    const page = await browser.newPage();

    // 导航到目标页面
    await page.goto('https://example.com');

    // 模拟点击分页按钮
    for (let i = 2; i <= 8; i++) {
        await page.click(`.tn-page-number:nth-child(${i})`);
        await page.waitForTimeout(1000); // 等待页面加载完成

        // 获取当前页面的HTML源码并解析
        const content = await page.content();
        const $ = require('cheerio').load(content);

        // 提取当前页的所有链接
        $('a.tn-page-number').each((index, element) => {
            console.log($(element).attr('onclick'));
        });
    }

    await browser.close();
}

fetchPageLinks().catch(console.error);

解释

  1. 启动浏览器:首先,我们使用puppeteer.launch()启动一个无头浏览器实例。
  2. 导航到目标页面:使用page.goto(url)方法导航到需要抓取的网页。
  3. 模拟点击分页按钮:通过循环和page.click(selector)方法模拟点击分页按钮。这里我们假设分页按钮是从第二个开始的。
  4. 等待页面加载:使用page.waitForTimeout(ms)等待页面加载完成。
  5. 提取链接:获取当前页面的HTML源码后,使用cheerio.load()加载HTML并提取所需的链接信息。

请注意,上述代码仅作为一个基本示例,实际应用中可能需要根据具体网站的结构进行调整。此外,频繁地访问同一个网站可能会触发反爬机制,建议遵守网站的robots.txt文件规定,并适当添加延迟以避免被封禁。


a href=“javascript:;” onclick=“videos_page(2); return false;” class=“tn-page-number” 2</a> a href=“javascript:;” onclick=“videos_page(3); return false;” class=“tn-page-number” 3</a>

为了处理这种动态分页的情况,我们需要解析onclick事件中的函数调用来提取实际的分页链接。这通常涉及到一些额外的工作,因为这些链接不是直接在HTML中提供的。下面是一种可能的方法来实现这一点。

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

function extractPageLinks(html) {
    const $ = cheerio.load(html);
    let pageLinks = [];

    $('.tn-page-number').each((index, element) => {
        const onclick = $(element).attr('onclick');
        if (onclick) {
            // 提取onclick事件中的数字作为页面编号
            const pageNum = onclick.match(/videos_page\((\d+)\)/)[1];
            pageLinks.push(pageNum);
        }
    });

    return pageLinks;
}

// 示例请求
request('URL_TO_YOUR_PAGE', (err, response, html) => {
    if (!err && response.statusCode === 200) {
        const links = extractPageLinks(html);
        console.log(links); // 输出提取到的所有页面链接
    }
});

这段代码首先使用cheerio加载HTML文档,并查找所有具有类名tn-page-number<a>标签。然后,它解析每个标签上的onclick属性,从中提取出实际的分页数字,并将其存储在一个数组中。这种方法假设所有的分页链接都是通过类似videos_page()的JavaScript函数触发的,且该函数的参数就是页面编号。如果实际情况有所不同,可能需要调整正则表达式以匹配正确的部分。

回到顶部