实现自动化数据抓取:使用Node.js操控鼠标点击与位置坐标

news/2024/11/8 12:03:02/

<a class=爬虫代理" />

在当今信息爆炸的时代,自动化数据抓取技术(也称为“网络爬虫”)对于数据分析与信息挖掘具有重要的作用。本文将介绍如何利用Node.js实现自动化数据抓取,并通过控制鼠标点击与位置坐标的方式,采集页面上指定的新闻数据。我们将使用代理IP、设置User-Agent与Cookie等手段,以提高爬虫的效率与隐蔽性。特别适用于需要规避IP封锁、突破频率限制的新闻热点数据抓取

一、概述

Node.js作为一种高效的JavaScript运行时环境,提供了丰富的包与API,适合处理爬虫任务。我们将结合puppeteer代理IP技术实现一个简单的自动化数据抓取工具。目标网站为“澎湃新闻”(https://www.thepaper.cn),我们将自动打开网页,模拟鼠标点击以采集页面信息,并将新闻内容按分类进行整理。

涉及的技术要点

  • Puppeteer:控制浏览器行为,模拟鼠标点击、键盘输入等操作。
  • 代理IP:通过代理IP减少被网站封锁的风险,这里我们将使用16yun的代理服务。
  • User-Agent与Cookie:通过设置请求头,模仿正常用户行为,提高抓取的效率与隐蔽性。

二、实现细节

1. 安装依赖

首先,确保系统已安装Node.js,然后通过npm安装相关包:

npm install puppeteer axios

2. 代码实现

以下代码实现了从澎湃新闻首页抓取新闻热点并归类整理的流程。代码中加入了代理IP、User-Agent和Cookie的配置。

const puppeteer = require('puppeteer');// 代理IP配置 亿牛云爬虫代理 www.16yun.cn
const proxyHost = '代理服务器域名';  // 请替换为16yun提供的代理服务器域名
const proxyPort = '代理服务器端口';  // 请替换为16yun提供的代理端口
const proxyUsername = '代理用户名';   // 请替换为16yun提供的用户名
const proxyPassword = '代理密码';     // 请替换为16yun提供的密码// User-Agent和Cookie配置
const userAgent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36';
const cookies = [{name: 'cookie_name',  // 根据需要替换value: 'cookie_value',domain: '.thepaper.cn'}
];// 目标网站
const targetUrl = 'https://www.thepaper.cn';(async () => {// 启动浏览器并设置代理const browser = await puppeteer.launch({headless: false,  // 显示浏览器窗口便于调试args: [`--proxy-server=http://${proxyHost}:${proxyPort}`]});const page = await browser.newPage();// 设置User-Agentawait page.setUserAgent(userAgent);// 设置Cookieawait page.setCookie(...cookies);// 输入代理认证信息await page.authenticate({ username: proxyUsername, password: proxyPassword });// 访问目标页面await page.goto(targetUrl, { waitUntil: 'networkidle2' });// 等待页面加载完成await page.waitForSelector('.news_content');  // 假设新闻内容在此CSS选择器中// 模拟鼠标点击某个分类标签(例如“热点”)const categorySelector = '.some-category-selector'; // 替换为实际的分类按钮选择器if (await page.$(categorySelector) !== null) {await page.click(categorySelector);console.log('点击了新闻分类标签');await page.waitForTimeout(2000);  // 等待页面加载新内容}// 选择并点击一个新闻标题,模拟进入新闻详情页面const newsTitleSelector = '.news_content .news_title';  // 假设新闻标题在此选择器中const newsTitle = await page.$(newsTitleSelector);if (newsTitle !== null) {const boundingBox = await newsTitle.boundingBox();  // 获取元素的位置信息await page.mouse.move(boundingBox.x + boundingBox.width / 2, boundingBox.y + boundingBox.height / 2);  // 移动鼠标到新闻标题await page.mouse.click(boundingBox.x + boundingBox.width / 2, boundingBox.y + boundingBox.height / 2);  // 模拟点击console.log('点击了新闻标题,进入新闻详情页面');await page.waitForTimeout(2000);  // 等待详情页面加载}// 抓取新闻详情页面中的内容const newsData = await page.evaluate(() => {const titleElement = document.querySelector('.news_content .news_title');  // 替换为详情页面中的标题选择器const contentElement = document.querySelector('.news_content .news_body');  // 替换为详情页面中的正文选择器return {title: titleElement ? titleElement.innerText : '',content: contentElement ? contentElement.innerText : ''};});console.log('抓取的新闻详情数据:', newsData);// 关闭浏览器await browser.close();
})();

3. 代码解析

  • 代理IP配置:使用16yun代理IP服务(域名、端口、用户名、密码),通过page.authenticate()方法设置认证信息,保证访问来自代理IP
  • 鼠标点击操作:使用 <font style="color:rgb(0, 0, 0);">page.click()</font> 或者通过 <font style="color:rgb(0, 0, 0);">page.mouse.move()</font><font style="color:rgb(0, 0, 0);">page.mouse.click()</font> 精确模拟鼠标移动并点击。
  • 控制鼠标移动位置:通过获取元素的边界信息 (<font style="color:rgb(0, 0, 0);">boundingBox</font>) 精确定位鼠标点击位置,模仿真实用户的点击行为。
  • 等待页面响应:在点击后使用 <font style="color:rgb(0, 0, 0);">waitForTimeout</font> 短暂等待,确保页面内容加载完成,以便下一步抓取。

三、效果与应用

通过此方案,我们可以在澎湃新闻等新闻门户网站上自动化获取热点新闻数据,并进行归类整理,为后续的数据分析和热点追踪奠定基础。对于新闻热点的时效性需求,这种基于代理IP与用户模拟的爬虫方案能够有效提升数据抓取的稳定性与准确性。

在实际应用中,可以进一步将抓取的数据存储至数据库中,以便后续的数据分析与展示。此外,设置抓取频率与周期性更新机制,也可以对新闻热点的变化趋势进行长时间监控。

四、总结

本文通过Node.js、Puppeteer及代理IP等技术实现了自动化新闻数据抓取的流程。该方案适用于高频率、连续性的数据抓取任务。


http://www.ppmy.cn/news/1545350.html

相关文章

Jenkins找不到maven构建项目

有的可能没有出现maven这个选项 解决办法&#xff1a;需要安装Maven项目插件 输入​Maven Integration plugin​

Android 音视频合成经验总结

刚刚实现了音视频合成的需求&#xff0c;趁热打铁记录一下遇到的问题 需求描述&#xff1a; 将给定的音频及视频合成一个视频&#xff0c;如果音频时长小于视频&#xff0c;则重复播放&#xff1b;如果大于视频时长则截取到视频结束。 采用的是MediaMuxer、MediaCodec原生方…

vue3 css的样式如果background没有,如何覆盖有background的样式

在Vue 3中&#xff0c;如果你想要覆盖一个有background样式的元素&#xff0c;你可以使用更具体的CSS选择器来提升你的样式规则的优先级&#xff0c;或者使用!important规则。 .some-class { background: url(path/to/image.jpg) no-repeat center center; } 你可以通过提供一…

linux网络编程自定义协议和多进程多线程并发-TCP编程

1.三次握手及后面过程 计算机A是客户端, B是服务端 1.1三次握手&#xff1a; 1客户端给服务端SYN报文 2服务端返回SYNACK报文 3客户端返回ACK报文 客户端发完ACK后加入到服务端的维护队列中&#xff0c;accept()调用后就能和客户端建立连接&#xff0c;然后建立通讯 1.2关闭…

C++ 线程初始化编译报错

这是一个很简单的开启一个线程, 用于演示一个线程和生命周期之间的错误,但是还没有把这个错误暴露出来, 就遇见了一个编译问题. 线程中执行指定逻辑的代码 线程的执行方法, 声明写在了ThreadRun.h 实现写在 ThreadRun.cpp中. class ThreadRun { public: void func(); };void T…

java访问华为网管软件iMaster NCE的北向接口时传递参数问题

上一篇文章介绍了利用《java访问华为网管软件iMaster NCE的北向接口》的一般性步骤&#xff0c;这里详细介绍其中一个读取性能数据的示例。原因是读取华为网管软件北向接口&#xff0c;完全找不到可供参考的例子。如果不需要传递什么参数&#xff0c;就能获取到结果&#xff0c…

特征检测与特征匹配方法笔记+代码分享

在一幅图像中&#xff0c;总能发现其独特的像素点&#xff0c;这些点可以被视为该图像的特征&#xff0c;我们称之为特征点。在计算机视觉领域中&#xff0c;基于特征点的图像特征匹配是一项至关重要的任务&#xff0c;因此&#xff0c;如何定义并识别一幅图像中的特征点显得尤…

【vue2.0入门】认识vue工程

目录 引言一、工程目录介绍1. package.json文件2. src\App.vue3. src\components 文件夹4. src\assets 文件夹5. node_modules 文件夹6. 其他 二、安装 vuejs devtools 插件1. 下载插件2. 配置插件3. 使用插件 三、总结 引言 本系列教程旨在帮助一些零基础的玩家快速上手前端开…