欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > IT业 > 如何使用Cheerio与jsdom解析复杂的HTML结构进行数据提取

如何使用Cheerio与jsdom解析复杂的HTML结构进行数据提取

2024/10/24 15:15:23 来源:https://blog.csdn.net/ip16yun/article/details/141855751  浏览:    关键词:如何使用Cheerio与jsdom解析复杂的HTML结构进行数据提取

亿牛云代理.png

背景介绍

在现代网页开发中,HTML结构往往非常复杂,包含大量嵌套的标签和动态内容。这给爬虫技术带来了不小的挑战,尤其是在需要精确提取特定数据的场景下。传统的解析库可能无法有效处理这些复杂的结构,而JavaScript环境下的Cheerio和jsdom提供了强大的工具,帮助开发者在Node.js环境中高效解析和处理HTML文档。

问题陈述

如何在复杂的HTML结构中精确地提取数据,成为了许多爬虫开发者面临的核心问题。特别是在面对需要代理IP、cookie和user-agent设置以及高效多线程处理的需求时,如何将这些技术合理整合在一起,以确保数据的准确性和采集的高效性,是本文要探讨的重点。

解决方案

使用Cheerio和jsdom可以在Node.js环境中高效解析和操作HTML文档。这两个库各有特点:Cheerio提供了类似jQuery的API,方便处理DOM,而jsdom则更接近真实的浏览器环境,适合处理需要执行JavaScript的动态内容。结合代理IP、cookie、user-agent设置,以及多线程技术,可以显著提高数据采集的效率和可靠性。

案例分析

下面我们将通过一个具体的示例来演示如何使用Cheerio和jsdom解析复杂的HTML结构,并结合代理IP、cookie和user-agent的设置,实现高效的数据提取和归类统计。

示例代码
const axios = require('axios');
const cheerio = require('cheerio');
const { JSDOM } = require('jsdom');
const HttpsProxyAgent = require('https-proxy-agent');
const { spawn } = require('child_process');
const os = require('os');// 代理配置 - 使用亿牛云爬虫代理服务 www.16yun.cn
const proxy = {host: 'proxy.16yun.cn', // 代理域名port: 8000, // 代理端口auth: {username: 'your_username', // 代理用户名password: 'your_password'  // 代理密码}
};// 创建代理Agent
const proxyAgent = new HttpsProxyAgent(`http://${proxy.auth.username}:${proxy.auth.password}@${proxy.host}:${proxy.port}`);// 设置cookie和user-agent
const headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36','Cookie': 'your_cookie_here'
};// 待解析的URL
const url = 'http://www.soufun.com.cn';// 多线程处理函数
function fetchData() {return new Promise((resolve, reject) => {axios.get(url, { headers, httpsAgent: proxyAgent }).then(response => {const dom = new JSDOM(response.data);const $ = cheerio.load(dom.window.document);// 使用Cheerio选择器提取数据const propertyList = [];$('div.property-item').each((i, el) => {const property = {title: $(el).find('h2').text().trim(),price: $(el).find('.price').text().trim(),location: $(el).find('.location').text().trim(),type: $(el).find('.type').text().trim()};propertyList.push(property);});resolve(propertyList);}).catch(error => reject(error));});
}// 创建多线程
function createWorkers(workerCount) {const workers = [];for (let i = 0; i < workerCount; i++) {const worker = spawn(os.platform() === 'win32' ? 'cmd' : 'sh', [], {stdio: 'inherit'});worker.on('message', fetchData);workers.push(worker);}return workers;
}// 启动多线程采集并进行数据归类和统计
async function startScraping(workerCount) {const workers = createWorkers(workerCount);const results = await Promise.all(workers.map(worker => fetchData()));// 归类和统计数据const categorizedData = {};results.flat().forEach(property => {const type = property.type;if (!categorizedData[type]) {categorizedData[type] = [];}categorizedData[type].push(property);});// 打印统计结果for (const type in categorizedData) {console.log(`房产类型: ${type}`);console.log(`数量: ${categorizedData[type].length}`);console.log('详细信息:', categorizedData[type]);console.log('---');}
}// 调用多线程爬虫
startScraping(4); // 启动4个线程
代码解析
  1. 目标网站更改:将url变量更改为http://www.soufun.com.cn,这使得爬虫针对新的目标网站进行数据采集。
  2. 数据提取:在fetchData函数中,使用Cheerio选择器提取房产信息,包括title(房产标题)、price(价格)、location(地点)和type(房产类型)。这些信息被存储在propertyList数组中。
  3. 数据归类和统计
    • 将提取到的房产信息按type(房产类型)进行归类,每个房产类型对应一个数组,数组中包含所有该类型的房产信息。
    • 统计每种房产类型的数量,并输出详细的统计结果。
  4. 多线程处理:保持了原有的多线程架构,通过并发请求提高数据采集效率。
结论

本文介绍了如何结合Cheerio和jsdom解析复杂的HTML结构,并通过代理IP、cookie、user-agent的设置,以及多线程技术,提升数据采集的效率和准确性。通过对http://www.soufun.com.cn网站的具体示例,展示了如何将采集到的数据进行有效的归类和统计。这种组合方式适用于复杂的网页解析场景,可以帮助开发者在面对高难度任务时,轻松实现高效的数据提取。
这种方法特别适用于需要处理大量分类数据的爬虫任务,有助于更快地获取并分析所需信息。如果你在爬虫开发过程中遇到类似的难题,不妨尝试本文介绍的方法,或许会有意想不到的收获!

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com