使用 Cheerio 和 Node.js 进行网络搜刮 2024

news2024/10/6 10:40:02

Web scraping 是一种强大的技术,用于从网站提取数据,广泛应用于数据分析、市场研究和内容聚合。截至2024年,利用 Cheerio 和 Node.js 进行 web scraping 仍然是一种流行且高效的方法。本文将深入探讨使用 Cheerio 和 Node.js 进行 web scraping 的过程,提供全面的指南和实用示例。

目录

  • Cheerio是什么?
  • 前提条件
  • 项目设置
  • Cheerio的选择器API
  • 编写抓取脚本
  • 运行脚本
  • 使用Cheerio进行网页抓取的挑战
  • 处理网页抓取中的CAPTCHA
  • 处理动态页面
  • 结论

Cheerio是什么?

Cheerio是一个快速、灵活、轻量的jQuery实现,专为服务器端应用设计。它允许开发人员使用熟悉的jQuery语法在Node.js环境中解析和操作HTML文档。与基于浏览器的工具不同,Cheerio不执行实际的网页渲染,而是直接操作HTML字符串,使其在许多抓取任务中异常高效。顺便说一下,Puppeteer 是一个很好的Cheerio抓取替代方案。

前提条件

在深入代码之前,请确保您的系统上已安装Node.js和npm(Node Package Manager)。如果尚未安装,您可以从Node.js官方网站下载并安装。

项目设置

第一步:创建新项目目录

首先,为您的项目创建一个新目录并将其初始化为一个Node.js项目:

mkdir web-scraping
cd web-scraping
npm init -y

-y标志会自动回答所有提示,设置一个默认的package.json文件。

第二步:安装依赖项

接下来,安装必要的依赖项,包括用于发出HTTP请求的axios和用于解析HTML的cheerio

npm install axios cheerio

Cheerio的选择器API

Cheerio是一个快速、灵活和轻量的核心jQuery实现,专为服务器设计。它允许您在Node.js环境中使用jQuery样式的语法来操作HTML文档。

以下是Cheerio选择器API的详细说明和代码示例:

  1. 加载HTML文档

    const cheerio = require('cheerio');
    const html = `
      <html>
        <head>
          <title>Example</title>
        </head>
        <body>
          <h1 class="title">Hello, world!</h1>
          <div id="content">
            <p>This is a paragraph.</p>
            <a href="https://example.com">Link</a>
          </div>
        </body>
      </html>
    `;
    const $ = cheerio.load(html);
    
  2. 选择元素

    • 元素选择器

      const h1 = $('h1'); // 选择所有<h1>元素
      console.log(h1.text()); // 输出:Hello, world!
      
    • 类选择器

      const title = $('.title'); // 选择class="title"的元素
      console.log(title.text()); // 输出:Hello, world!
      
    • ID选择器

      const content = $('#content'); // 选择id="content"的元素
      console.log(content.html()); // 输出:<p>This is a paragraph.</p><a href="https://example.com">Link</a>
      
    • 属性选择器

      const link = $('a[href="https://example.com"]'); // 选择具有特定href属性的<a>元素
      console.log(link.text()); // 输出:Link
      
  3. 遍历和操作元素

    • 遍历元素

      $('p').each((index, element) => {
        console.log($(element).text()); // 输出每个<p>元素的文本内容
      });
      
    • 修改元素内容

      $('h1.title').text('New Title'); // 修改<h1>元素的文本内容
      console.log($('h1.title').text()); // 输出:New Title
      
    • 添加和删除元素

      $('#content').append('<p>Another paragraph.</p>'); // 在#content中添加一个新的<p>元素
      console.log($('#content').html()); // 输出:<p>This is a paragraph.</p><a href="https://example.com">Link</a><p>Another paragraph.</p>
      
      $('a').remove(); // 删除所有<a>元素
      console.log($('#content').html()); // 输出:<p>This is a paragraph.</p><p>Another paragraph.</p>
      

这些示例展示了如何使用Cheerio的选择器API在Node.js环境中选择、遍历和操作HTML元素,类似于jQuery。

编写抓取脚本

在您的项目目录中创建一个名为scraper.js的文件。该文件将包含从目标网站抓取数据的脚本。将以下代码添加到scraper.js中:

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

// 目标URL
const url = 'https://example.com';

async function fetchData() {
  try {
    // 发出HTTP请求以获取HTML内容
    const { data } = await axios.get(url);
    // 将HTML文档加载到Cheerio中
    const $ = cheerio.load(data);

    // 从HTML中提取数据
    const title = $('title').text();
    const headings = [];
    $('h1, h2, h3').each((index, element) => {
      headings.push($(element).text());
    });

    // 输出提取的数据
    console.log('Title:', title);
    console.log('Headings:', headings);
  } catch (error) {
    console.error('Error fetching data:', error);
  }
}

fetchData();

代码解释

  1. 导入模块:脚本首先导入axioscheerio模块。
  2. 定义目标URL:定义要抓取的目标网站的URL。
  3. 获取数据fetchData函数使用axios发出HTTP GET请求到目标URL。响应数据(HTML内容)随后加载到Cheerio中。
  4. 解析HTML:使用Cheerio的jQuery样式语法,脚本提取<title>标签和所有<h1><h2><h3>标签的内容。
  5. 输出结果:提取的数据记录在控制台中。

运行脚本

要执行抓取脚本,请在终端中运行以下命令:

node scraper.js

如果一切设置正确,您应该会在控制台中看到抓取到的网页标题和所有标题标签的内容。

使用Cheerio进行网页抓取的挑战

虽然Cheerio在网页抓取方面具有许多优势,但它也存在一些开发人员可能遇到的挑战:

  1. 动态网站和JavaScript:Cheerio的一大挑战是处理依赖JavaScript的动态网站。现代网站通常使用JavaScript在初始页面加载后动态加载内容。由于Cheerio解析的是静态HTML,它可能无法捕获动态生成的内容,这会限制抓取的效果。

  2. 反抓取措施:网站采用各种反抓取技术来阻止自动化数据提取:

    • CAPTCHA:主要问题是设计用来区分人类和机器人用户的CAPTCHA,要求用户完成图像识别或文本输入等任务。
    • IP封锁:网站可能会封锁与抓取活动相关的IP地址,以防止过多的请求。
    • 用户代理检测:检测非标准或可疑的用户代理有助于网站识别和封锁抓取程序。
    • 动态网页:使用动态JavaScript内容生成的网站可能会带来挑战,因为内容可能无法通过Cheerio的静态解析直接访问。

作为网页抓取开发人员,了解这些挑战对于有效地解决它们至关重要。针对这些问题有许多缓解解决方案的策略,在接下来的部分中,我们将解释如何通过解决验证码问题和处理动态页面来解决抓取中的两大问题:

处理网页抓取中的CAPTCHA

CAPTCHA在网页抓取中构成了重大挑战,因为它们旨在区分人类和机器人。当遇到时,您的抓取脚本必须高效地解决它们,以继续进行抓取任务。对于可扩展的网页抓取工作,像CapSolver这样的解决方案提供高精度和快速的CAPTCHA解决能力。

集成CAPTCHA解决方案

各种CAPTCHA解决服务可以集成到您的抓取脚本中。这里,我们重点介绍CapSolver:

步骤1:注册CapSolver

首先,导航到CapSolver用户面板并注册您的账户。

步骤2:获取您的API密钥

注册后,从主页面板中获取您的API密钥。

CapSolver API Key

CapSolver集成示例代码

将CapSolver集成到您的网页抓取或自动化项目中非常简单。以下是一个使用CapSolver API的Python示例:

# pip install requests
import requests
import time

# TODO: set your config
api_key = "YOUR_API_KEY"  # your CapSolver API key
site_key = "6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-"  # target site's reCAPTCHA site key
site_url = ""  # URL of your target site


def solve_captcha():
    payload = {
        "clientKey": api_key,
        "task": {
            "type": 'ReCaptchaV2TaskProxyLess',
            "websiteKey": site_key,
            "websiteURL": site_url
        }
    }
    res = requests.post("https://api.capsolver.com/createTask", json=payload)
    resp = res.json()
    task_id = resp.get("taskId")
    if not task_id:
        print("Failed to create task:", res.text)
        return
    print(f"Got taskId: {task_id} / Retrieving result...")

    while True:
        time.sleep(3)  # delay
        payload = {"clientKey": api_key, "taskId": task_id}
        res = requests.post("https://api.capsolver.com/getTaskResult", json=payload)
        resp = res.json()
        status = resp.get("status")
        if status == "ready":
            return resp.get("solution", {}).get('gRecaptchaResponse')
        if status == "failed" or resp.get("errorId"):
            print("Solution failed! Response:", res.text)
            return


captcha_token = solve_captcha()
print(captcha_token)

此脚本演示了如何利用CapSolver的API来解决reCAPTCHA挑战。将此类解决方案集成到您的抓取项目中,通过自动化CAPTCHA解决,提高了效率,简化了数据提取过程。

处理动态页面

对于通过JavaScript加载动态内容的网页,您可能需要使用像puppeteer这样的无头浏览器。Puppeteer可以模拟真实用户浏览网页,从而允许您抓取只有在JavaScript执行后才出现的内容。

Puppeteer示例

以下是如何将Puppeteer与Cheerio结合使用的简短示例:

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

async function fetchData() {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  await page.goto('https://example.com');

  const content = await page.content();
  const $ = cheerio.load(content);

  const title = $('title').text();
  const headings = [];
  $('h1, h2, h3').each((index, element) => {
    headings.push($(element).text());
  });

  console.log('Title:', title);
  console.log('Headings:', headings);

  await browser.close();
}

fetchData();

此脚本启动一个无头浏览器,导航到目标URL,并在JavaScript执行后获取HTML内容。然后,它使用Cheerio解析HTML并提取所需数据。

结论

使用Cheerio和Node.js进行网页抓取是提取网站数据的强大组合。Cheerio的jQuery样式语法使得导航和操作HTML文档变得容易,而Node.js提供了处理HTTP请求和处理数据的强大环境。

然而,开发人员必须意识到动态内容和反抓取措施(如CAPTCHA)带来的挑战。集成像CapSolver这样的解决方案可以帮助克服这些障碍,确保您的抓取脚本保持高效和可靠。

希望这篇文章能帮助您在2024年开始网页抓取,并为您的项目提供有用的数据!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1831562.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

交易方法论

如何复盘,复盘哪些内容&#xff1a; 1复盘指数 2复盘板块 3复盘个股 4复盘涨停板 5跌停板 6自选股 1复盘新闻 2国家大势 3行业大势 4公司大事 5资金流向 6龙虎榜 板块强度标准 板块内至少有5只涨停板 板块连续资金流入超过3天 板块有5只以上走漂亮上升趋势 一次性关注方向不…

LangChain-ChatGLM本地搭建|报错合集(win10)

安装过程 1. 创建虚拟环境 conda create -n langchain-chatglm python3.10 conda activate langchain-chatglm2. 部署 langchain-ChatGLM git clone https://github.com/imClumsyPanda/langchain-ChatGLMpip3 install -r requirements.txt pip3 install -U gradio pip3 inst…

太速科技-FMC213V3-基于FMC兼容1.8V IO的Full Camera Link 输入子卡

FMC213V3-基于FMC兼容1.8V IO的Full Camera Link 输入子卡 一、板卡概述 该板卡为了考虑兼容1.8V电平IO&#xff0c;适配Virtex7&#xff0c;Kintex Ultrascale&#xff0c;Virtex ultrasacle FPGA而特制&#xff0c;如果要兼容原来的3.3V 也可以修改硬件参数。板卡支持1路…

【自动驾驶】ROS小车系统介绍

文章目录 小车组成轮式运动底盘的组成轮式运动底盘的分类轮式机器人的控制方式感知传感器ROS决策主控ROS介绍ROS的坐标系ROS的单位机器人电气连接变压模块运动底盘的电气连接ROS主控与传感器的电气连接运动底盘基本组成电池电机控制器与驱动器控制器与运动底盘状态数据&#xf…

记录第一次突发情况

项目场景&#xff1a; 这台云服务器主要是我学习在用&#xff0c;也不是很大&#xff0c;2核2g3M40G硬盘。 在这台服务器上&#xff0c;我主要使用了docker并且把所有的东西&#xff0c;都通过docker安装&#xff0c;比如MySQL&#xff0c;redis&#xff0c; elasticsearch。 …

视频合成渲染服务解决方案,数字人+PPT+视频云剪辑

在金融理财领域&#xff0c;一个生动、直观、专业的视频&#xff0c;往往能够在海量信息中脱颖而出&#xff0c;帮助客户更好地理解产品、把握市场动态。然而&#xff0c;传统的视频制作方式往往周期长、成本高、难以适应快速变化的市场需求。 美摄科技&#xff0c;作为行业领…

CANape使用问题记录

CANape使用问题记录 1、添加变量后无法开启测量 1、添加变量后无法开启测量 点击开启测量后&#xff0c;出现以下对话框&#xff1a; 解决方法&#xff1a; 添加新变量后&#xff0c;修改变量测量配置&#xff1b; 改为polling&#xff0c; 1000&#xff0c;即采用轮训的方法…

收入增长,再进一步丨用友BIP收入云大消费品行业收入管理联合解决方案正式发布

随着数智化时代的来临&#xff0c;消费品行业对于收款到收入侧的管理需求日益增强&#xff0c;对管理的精细度和时效性要求也越来越高。传统的收入管理模式已难以满足企业快速变化的市场需求。如何精准地预测收入、优化收入结构、提高收入管理质量&#xff0c;以及实现收入管理…

雪花算法和UUID

目录 雪花算法概念优点和不足优点:缺点:解决方案代码示例 UUID优点与不足优点不足 两种算法的比较应用场景区别 雪花算法 概念 雪花算法是一个分布式id生成算法&#xff0c;它生成的id一般情况下具有唯一性。由64位01数字组成&#xff0c;第一位是符号位&#xff0c;始终为0。…

Kubernetes集群中如何利用北极星因果指标设置正确的POD规格——CPU篇

在 Kubernetes 容量规划中&#xff0c;追求的是集群的稳定性和资源使用效率之间的平衡&#xff1a; 资源分配过多会造成浪费。 资源分配过少则会导致用户请求时延上升&#xff0c;影响集群的稳定性。 背景 公众号之前翻译了一篇 Sysdig 的文章&#xff0c;Kubernetes 容量规…

玩转nRF52840-DK开发套件(2)

介绍如何在Windows操作系统上使用Arm Keil MDK。Arm Keil MDK附带Arm C/C编译器和Vision集成开发环境&#xff08;IDE&#xff09;&#xff0c;以及所有nRF5SDK的版本提供了现成的Keil项目。 1. 安装最新的 nRF5 SDK. 链接&#xff1a;nRF5 SDK - nordicsemi.com 点击Download&…

泰迪智能科技董事长张良均荣获“2024年广东软件风云榜新锐企业家”

6月13日&#xff0c;在广州举办2024年粤港澳软件产业高质量发展大会、第十二届粤港云计算大会暨第七届粤港澳ICT大会。大会以“培育信息技术新质生产力&#xff0c;打造粤港澳发展创新引擎”为主题&#xff0c;研讨基础软件、云计算、人工智能等新一代技术的新态势、新应用&…

14.编写自动化测试(上)

标题 一、如何编写测试1.1 一些概念1.2 测试函数剖析1.3 使用assert!宏检查结果1.4 使用assert_eq!和assert_ne!宏来测试相等1&#xff09; assert_eq!2&#xff09; assert_ne! 1.5 使用 should_panic 检查 panic 二、将 Result<T, E> 用于测试 一、如何编写测试 1.1 一…

解决外网404:清除DNS缓存并配置host主机使用知名公共DNS服务

在 Windows 上清除/刷新 DNS 缓存 对于所有Windows版本&#xff0c;清除DNS缓存的过程都是相同的。你需要使用管理员权限打开命令提示符并运行ipconfig /flushdns。 浏览器清除DNS缓存 大多数现代的Web浏览器都有一个内置的DNS客户端&#xff0c;以防止每次访问该网站时…

vscode字符多行自动增长插件。

多行字符自动增长插件CharAutoIncre 当你使用shiftalt选中了多行,并输入了’1’,这时这几行都变成了’1’. 这时你可以选中&#xff08;shift左键&#xff09;为’1’的这几行, 接下来按下shiftaltq此时’1’变为了’12345’自增长的样式。 同时本插件支持字符’a-z,A-Z’。 目…

高考没考好焦虑怎么选计算机专业!一篇告诉你,推荐三个风口专业!想学计算机怎么选大学专业

高考成绩揭晓&#xff0c;几家欢喜几家愁。对于那些未能如愿考取理想分数的同学来说&#xff0c;未来似乎蒙上了一层阴影。尤其是在计算机专业如此热门的今天&#xff0c;低分考生是否还有机会在这个领域找到一席之地&#xff1f;本文将为你揭秘&#xff0c;即使高考成绩不理想…

Nature Microbiology丨VITA单细菌转录组测序技术助力深入解析奶牛瘤胃微生物组功能异质性

瘤胃微生物组一直以来都是研究相对不足但又极其复杂的微生物生态系统之一。瘤胃微生物能够有效降解植物纤维&#xff0c;将其转化为高质量的蛋白质产品&#xff0c;在这一过程中&#xff0c;由于微生物强烈的发酵&#xff0c;还会产生大量气体&#xff0c;其成分主要包括二氧化…

自动化产线设备联网,协同打造5G智慧工厂

1、需求背景 随着信息技术、物联网、人工智能等领域的飞速发展&#xff0c;智慧工厂成为制造业升级和转型的关键方向。在智慧工厂中&#xff0c;产线设备之间的实时通信和协同操作可以提高整个生产流程的自动化水平。 提升生产效率 通过稳定的网络连接&#xff0c;保证设备之…

编码在网络安全中的应用和原理

前言:现在的网站架构复杂&#xff0c;大多都有多个应用互相配合&#xff0c;不同应用之间往往需要数据交互&#xff0c;应用之间的编码不统一&#xff0c;编码自身的特性等都很有可能会被利用来绕过或配合一些策略&#xff0c;造成一些重大的漏洞。 什么是编码&#xff0c;为什…

软件功能测试和性能测试包括哪些测试内容?又有什么联系和区别?

软件功能测试和性能测试是保证软件质量和稳定性的重要手&#xff0c;无论是验证软件的功能正确性&#xff0c;还是评估软件在负载下的性能表现&#xff0c;这些测试都是必不可少的。 一、软件功能测试   软件功能测试是指对软件的各项功能进行验证和确认&#xff0c;确保软件…