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

本文涉及的产品
实时数仓Hologres,5000CU*H 100GB 3个月
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
实时计算 Flink 版,5000CU*H 3个月
简介: 在现代网页开发中,复杂的HTML结构给爬虫技术带来挑战。传统的解析库难以应对,而Cheerio和jsdom在Node.js环境下提供了强大工具。本文探讨如何在复杂HTML结构中精确提取数据,结合代理IP、cookie、user-agent设置及多线程技术,提升数据采集的效率和准确性。通过具体示例代码,展示如何使用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网站的具体示例,展示了如何将采集到的数据进行有效的归类和统计。这种组合方式适用于复杂的网页解析场景,可以帮助开发者在面对高难度任务时,轻松实现高效的数据提取。
    这种方法特别适用于需要处理大量分类数据的爬虫任务,有助于更快地获取并分析所需信息。如果你在爬虫开发过程中遇到类似的难题,不妨尝试本文介绍的方法,或许会有意想不到的收获!
相关文章
|
15天前
|
移动开发 前端开发 HTML5
Twaver-HTML5基础学习(20)数据容器(3)_数据的批量加载(节省性能方法)
本文介绍了Twaver HTML5中数据的批量加载方法,通过使用`box.startBatch()`可以在大量数据加载时提高性能。文章通过示例代码展示了如何在React组件中使用批量加载功能,以减少界面重绘次数并提升效率。
33 1
Twaver-HTML5基础学习(20)数据容器(3)_数据的批量加载(节省性能方法)
|
15天前
|
XML 存储 JSON
Twaver-HTML5基础学习(19)数据容器(2)_数据序列化_XML、Json
本文介绍了Twaver HTML5中的数据序列化,包括XML和JSON格式的序列化与反序列化方法。文章通过示例代码展示了如何将DataBox中的数据序列化为XML和JSON字符串,以及如何从这些字符串中反序列化数据,重建DataBox中的对象。此外,还提到了用户自定义属性的序列化注册方法。
30 1
|
14天前
数据解析之xpath 太6了
数据解析之xpath 太6了
|
15天前
|
XML 移动开发 JSON
Twaver-HTML5基础学习(18)数据容器(1)_增删查改、遍历数据容器、包含网元判断
本文介绍了Twaver HTML5中的数据容器(DataBox),包括如何进行增删查改操作、遍历数据容器以及判断网元是否存在于数据容器中。DataBox用于管理所有的网元对象,如ElementBox、LayerBox、AlarmBox等,并通过示例代码展示了其常用方法的使用。
30 1
Twaver-HTML5基础学习(18)数据容器(1)_增删查改、遍历数据容器、包含网元判断
|
10天前
|
消息中间件 canal 关系型数据库
Maxwell:binlog 解析器,轻松同步 MySQL 数据
Maxwell:binlog 解析器,轻松同步 MySQL 数据
77 11
|
1天前
|
前端开发 Python
解析数据的Beautiful Soup 模块(二)
解析数据的Beautiful Soup 模块(二)
|
2天前
|
前端开发 JavaScript
pyquery:一个灵活方便的 HTML 解析库
pyquery:一个灵活方便的 HTML 解析库
6 1
|
15天前
|
数据采集 存储 JavaScript
构建您的第一个Python网络爬虫:抓取、解析与存储数据
【9月更文挑战第24天】在数字时代,数据是新的金矿。本文将引导您使用Python编写一个简单的网络爬虫,从互联网上自动抓取信息。我们将介绍如何使用requests库获取网页内容,BeautifulSoup进行HTML解析,以及如何将数据存储到文件或数据库中。无论您是数据分析师、研究人员还是对编程感兴趣的新手,这篇文章都将为您提供一个实用的入门指南。拿起键盘,让我们开始挖掘互联网的宝藏吧!
|
15天前
|
存储 JavaScript Java
使用NekoHTML解析HTML并提取META标签内容
关于NekoHTML的代码样例,这里提供一个简单的示例,用于展示如何使用NekoHTML来解析HTML文档并提取其中的信息。请注意,由于NekoHTML的具体实现和API可能会随着版本更新而有所变化,以下代码仅供参考。 ### 示例:使用NekoHTML解析HTML并提取META标签内容 ```java import org.cyberneko.html.parsers.DOMParser; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NodeList; import org.xml
|
15天前
|
移动开发 前端开发 JavaScript
Twaver-HTML5基础学习(3)基本数据元素(Data)其他功能函数以及组Group
本文介绍了Twaver HTML5中Data类的其他功能函数,如获取和操作子网元的方法,以及组(Group)的概念和使用。文章通过示例代码展示了如何在React组件中创建组、添加图元到组中,并通过toChildren函数获取满足特定条件的图元。
27 0
Twaver-HTML5基础学习(3)基本数据元素(Data)其他功能函数以及组Group

推荐镜像

更多