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!!!!
在使用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);
解释
- 启动浏览器:首先,我们使用
puppeteer.launch()
启动一个无头浏览器实例。 - 导航到目标页面:使用
page.goto(url)
方法导航到需要抓取的网页。 - 模拟点击分页按钮:通过循环和
page.click(selector)
方法模拟点击分页按钮。这里我们假设分页按钮是从第二个开始的。 - 等待页面加载:使用
page.waitForTimeout(ms)
等待页面加载完成。 - 提取链接:获取当前页面的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>