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

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 sitedef 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)returnprint(f"Got taskId: {task_id} / Retrieving result...")while True:time.sleep(3)  # delaypayload = {"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)returncaptcha_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.mzph.cn/diannao/28860.shtml

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

相关文章

SRAM和DRAM

1.SRAM&#xff08;静态RAM&#xff09; 把存放一个二进制位的物理器件称为存储元&#xff0c;它是存储器最基本的构件。 地址码相同的多个存储元构成一个存储单元。 存储单元的集合构成存储体。 静态RAM的存储元是用双稳态触发器&#xff08;六晶体管MOS&#xff09;来记忆…

C#结合JS 修改解决 KindEditor 弹出层问题

目录 问题现象 原因分析 范例运行环境 解决问题 修改 kindeditor.js C# 服务端更新 小结 问题现象 KindEditor 是一款出色的富文本HTML在线编辑器&#xff0c;关于编辑器的详细介绍可参考我的文章《C# 将 TextBox 绑定为 KindEditor 富文本》&#xff0c;这里我们讲述在…

人工智能不是一根魔杖——它有内在的问题

人工智能不是一根魔杖——它有内在的问题&#xff0c;很难解决&#xff0c;而且可能很危险 到目前为止&#xff0c;我们都听说过很多关于人工智能(AI)的事情。你可能已经使用过无数可用的人工智能工具。对一些人来说&#xff0c;人工智能就像一根预测未来的魔杖。 但人工智能…

有没有和ai聊天的软件?介绍这三款聊天软件

有没有和ai聊天的软件&#xff1f;在科技飞速发展的今天&#xff0c;人工智能&#xff08;AI&#xff09;已经渗透到我们生活的方方面面&#xff0c;其中AI聊天软件以其独特的魅力&#xff0c;赢得了越来越多用户的青睐。今天&#xff0c;我们就来一起探索三款智能聊天软件的功…

LogicFlow 学习笔记——9. LogicFlow 进阶 节点

LogicFlow 进阶 节点&#xff08;Node&#xff09; 连线规则 在某些时候&#xff0c;我们可能需要控制边的连接方式&#xff0c;比如开始节点不能被其他节点连接、结束节点不能连接其他节点、用户节点后面必须是判断节点等&#xff0c;想要达到这种效果&#xff0c;我们需要为…

Typora—适用于 Mac 和 Win 系统的优秀 Markdown 文本编辑器

Typora 是一款适用于 Mac 和 Win 系统的优秀 Markdown 文本编辑器&#xff0c;它以其简洁易用的界面和强大的功能受到了众多用户的喜爱。 首先&#xff0c;Typora 的界面设计非常简洁直观&#xff0c;没有过多繁杂的菜单和按钮&#xff0c;让用户能够专注于写作本身。它采用实时…

LVS – NAT 模式集群构建

目录 1 环境准备 1.1 准备四台服务器 1.2 IP与网关均按照下图配置 1.3 网卡配置 1.4 real server 安装 web服务 1.5 安装ipvsadm 管理工具 2 使用ipvsadm管理LVS 2.1 创建集群指定使用的算法 2.2 添加真实服务器指定工作原理 2.3 查看是否正确创建集群 2.4 开启FORWARD路由转发…

​一个高清影像下载插件

数据是GIS的血液&#xff01; 虽然我们在水经微图&#xff08;简称“微图”&#xff09;中可以下载各种各样丰富的地图数据&#xff0c;但相信大家对数据的追求是无止境的。 我们现在就来分享一下&#xff0c;如何在QGIS中下载高清卫星影像的方法。 如果你需要最新版本的QGI…

最新下载:Hype 4 mac版【软件附加安装教程】

Hype是一款强大的Mac OS平台 HTML5 创作工具&#xff0c;它可以在网页上做出赏心悦目的动画效果&#xff0c;创建丰富的网页交互动画&#xff0c;支持层、时间轴等编辑方式&#xff0c;并能很好的导出HTML5/CSS3/JavaScript&#xff0c;在台式机&#xff0c;智能手机和iPad上流…

裁剪图片的最简单方法?这四种裁剪方法真的超级简单!

裁剪图片的最简单方法&#xff1f;在丰富多彩的现代生活中&#xff0c;图片成为了我们表达、沟通甚至展示身份的重要媒介&#xff0c;然而&#xff0c;无论是出于个人审美还是专业需求&#xff0c;图片的格式和尺寸往往成为了我们不得不面对的问题&#xff0c;特别是那些未经雕…

flink1.12.0学习笔记(一)-部署与入门

flink1.12.0学习笔记&#xff08;1&#xff09;-部署与入门 1-1-Flink概述 Flink诞生 Flink 诞生于欧洲的一个大数据研究项目 StratoSphere。该项目是柏林工业大学的一个研究性项目。早期&#xff0c; Flink 是做 Batch 计算的&#xff0c;但在 2014 年&#xff0c; StratoS…

mathtype7.6官方无需激活版安装包下载

大家好&#xff0c;今天我要和大家分享的是一款非常实用的数学工具——mathtype7.6最新版本&#xff01;&#x1f4d0; 作为一个数学专业的学生&#xff0c;我经常需要处理大量的数学公式和符号。以前我都是用手写或者电脑自带的公式编辑器&#xff0c;但是效率低下而且容易出错…

课设--学生成绩管理系统(二)

欢迎来到 Papicatch的博客 目录 &#x1f40b;引言 &#x1f988;编写目的 &#x1f988;项目说明 &#x1f40b;产品介绍 &#x1f988;产品概要说明 &#x1f988;产品用户定位 &#x1f988;产品中的角色 &#x1f40b; 产品总体业务流程图 &#x1f40b; 产品功…

装机必备-WinRAR安装教程

软件介绍&#xff1a;WinRAR 是一款功能强大的压缩包管理器&#xff0c;可用于备份数据&#xff0c;缩减电子邮件附件的大小&#xff0c;解压缩从 Internet 上下载的RAR、ZIP及其它类型文件&#xff0c;新建 RAR 及 ZIP 格式等的压缩类文件。这是我们新电脑或重装系统后必须安装…

adb常用命令详解--提升开发效率利器

文章目录 文件管理截屏与录屏logcat 使用dumpsys 相关ps 相关am 相关pm 相关wm 相关setprop 设置属性input 相关adb connect 远程无线调试其它 本文首发地址 https://h89.cn/archives/281.html 最新更新地址 https://gitee.com/chenjim/chenjimblog 博主 Linux 使用较多&#x…

04 翼型和机翼、尾翼几何选择

04 翼型和机翼、尾翼几何选择 4 -1 引言4-2 翼型的选择4-2-1 翼型的几何4-2-2 翼型的升力和阻力4-2-3 翼型选择与设计4-2-4 设计升力系数4-2-5 失速4-2-6 翼型厚度比4-2-7 关于翼型其他方面的考虑 4-3 机翼几何外形4-3-1 展弦比4-2-3 机翼后掠角4-3-3 机翼稍根比4-3-4 机翼扭转…

团结的力量:友情、互助与感恩

时间如白驹过隙&#xff0c;半载光阴转瞬即逝。回首过去的六个月&#xff0c;在CSDN平台上&#xff0c;我经历了无数的挑战和成长。在大厂和阿豪的帮助下&#xff0c;我的粉丝数终于突破了万大关。这不仅是我个人的成就&#xff0c;更是我们团结、互助和感恩精神的见证。 初识…

aardio实战篇) 下载微信公众号文章为pdf和html

首发地址&#xff1a; https://mp.weixin.qq.com/s/w6v3RhqN0hJlWYlqTzGCxA 前言 之前在PC微信逆向) 定位微信浏览器打开链接的call提过要写一个保存公众号历史文章的工具。这篇文章先写一个将文章保存成pdf和html的工具&#xff0c;后面再补充一个采集历史的工具&#xff0c…

HTTP协议版本历程

HTTP协议的发展历程 版本推出年份当前状态HTTP/0.91991年已过时HTTP/1.01996年已过时HTTP/1.11997年标准HTTP/2.02015年标准HTTP/3.02022年标准 HTTP/0.9 HTTP/0.9非常简单&#xff0c;并不涉及数据包传输&#xff0c;通过请求和响应的交换达成通信&#xff0c;请求由单行指…

SmartEDA、Multisim、Proteus大比拼:电路设计王者之争?

在电路设计领域&#xff0c;SmartEDA、Multisim和Proteus无疑是三款备受瞩目的软件工具。它们各自拥有独特的功能和优势&#xff0c;但在这场电路设计王者的竞争中&#xff0c;谁才是真正的领跑者&#xff1f;让我们深入探究这三款软件的异同&#xff0c;揭示它们各自的魅力所在…