實(shí)現(xiàn)自動(dòng)化數(shù)據(jù)抓?。菏褂肗ode.js操控鼠標(biāo)點(diǎn)擊與位置坐標(biāo)

爬蟲代理

在當(dāng)今信息爆炸的時(shí)代,自動(dòng)化數(shù)據(jù)抓取技術(shù)(也稱為“網(wǎng)絡(luò)爬蟲”)對(duì)于數(shù)據(jù)分析與信息挖掘具有重要的作用。本文將介紹如何利用Node.js實(shí)現(xiàn)自動(dòng)化數(shù)據(jù)抓取,并通過控制鼠標(biāo)點(diǎn)擊與位置坐標(biāo)的方式,采集頁(yè)面上指定的新聞數(shù)據(jù)。我們將使用代理IP、設(shè)置User-Agent與Cookie等手段,以提高爬蟲的效率與隱蔽性。特別適用于需要規(guī)避IP封鎖、突破頻率限制的新聞熱點(diǎn)數(shù)據(jù)抓取。

## 一、概述

Node.js作為一種高效的JavaScript運(yùn)行時(shí)環(huán)境,提供了豐富的包與API,適合處理爬蟲任務(wù)。我們將結(jié)合`puppeteer`與代理IP技術(shù)實(shí)現(xiàn)一個(gè)簡(jiǎn)單的自動(dòng)化數(shù)據(jù)抓取工具。目標(biāo)網(wǎng)站為“澎湃新聞”(https://www.thepaper.cn),我們將自動(dòng)打開網(wǎng)頁(yè),模擬鼠標(biāo)點(diǎn)擊以采集頁(yè)面信息,并將新聞內(nèi)容按分類進(jìn)行整理。

### 涉及的技術(shù)要點(diǎn)

+ **Puppeteer**:控制瀏覽器行為,模擬鼠標(biāo)點(diǎn)擊、鍵盤輸入等操作。

+ **代理IP**:通過代理IP減少被網(wǎng)站封鎖的風(fēng)險(xiǎn),這里我們將使用16yun的代理服務(wù)。

+ **User-Agent與Cookie**:通過設(shè)置請(qǐng)求頭,模仿正常用戶行為,提高抓取的效率與隱蔽性。

## 二、實(shí)現(xiàn)細(xì)節(jié)

### 1. 安裝依賴

首先,確保系統(tǒng)已安裝Node.js,然后通過npm安裝相關(guān)包:

```bash

npm install puppeteer axios

```

### 2. 代碼實(shí)現(xiàn)

以下代碼實(shí)現(xiàn)了從澎湃新聞首頁(yè)抓取新聞熱點(diǎn)并歸類整理的流程。代碼中加入了代理IP、User-Agent和Cookie的配置。

```javascript

const puppeteer = require('puppeteer');

// 代理IP配置 億牛云爬蟲代理 www.16yun.cn

const proxyHost = '代理服務(wù)器域名';? // 請(qǐng)?zhí)鎿Q為16yun提供的代理服務(wù)器域名

const proxyPort = '代理服務(wù)器端口';? // 請(qǐng)?zhí)鎿Q為16yun提供的代理端口

const proxyUsername = '代理用戶名';? // 請(qǐng)?zhí)鎿Q為16yun提供的用戶名

const proxyPassword = '代理密碼';? ? // 請(qǐng)?zhí)鎿Q為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',? // 根據(jù)需要替換

? ? ? ? value: 'cookie_value',

? ? ? ? domain: '.thepaper.cn'

? ? }

];

// 目標(biāo)網(wǎng)站

const targetUrl = 'https://www.thepaper.cn';

(async () => {

? ? // 啟動(dòng)瀏覽器并設(shè)置代理

? ? const browser = await puppeteer.launch({

? ? ? ? headless: false,? // 顯示瀏覽器窗口便于調(diào)試

? ? ? ? args: [

? ? ? ? ? ? `--proxy-server=http://${proxyHost}:${proxyPort}`

? ? ? ? ]

? ? });

? ? const page = await browser.newPage();

? ? // 設(shè)置User-Agent

? ? await page.setUserAgent(userAgent);

? ? // 設(shè)置Cookie

? ? await page.setCookie(...cookies);

? ? // 輸入代理認(rèn)證信息

? ? await page.authenticate({ username: proxyUsername, password: proxyPassword });

? ? // 訪問目標(biāo)頁(yè)面

? ? await page.goto(targetUrl, { waitUntil: 'networkidle2' });

? ? // 等待頁(yè)面加載完成

? ? await page.waitForSelector('.news_content');? // 假設(shè)新聞內(nèi)容在此CSS選擇器中

? ? // 模擬鼠標(biāo)點(diǎn)擊某個(gè)分類標(biāo)簽(例如“熱點(diǎn)”)

? ? const categorySelector = '.some-category-selector'; // 替換為實(shí)際的分類按鈕選擇器

? ? if (await page.$(categorySelector) !== null) {

? ? ? ? await page.click(categorySelector);

? ? ? ? console.log('點(diǎn)擊了新聞分類標(biāo)簽');

? ? ? ? await page.waitForTimeout(2000);? // 等待頁(yè)面加載新內(nèi)容

? ? }

? ? // 選擇并點(diǎn)擊一個(gè)新聞標(biāo)題,模擬進(jìn)入新聞詳情頁(yè)面

? ? const newsTitleSelector = '.news_content .news_title';? // 假設(shè)新聞標(biāo)題在此選擇器中

? ? 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);? // 移動(dòng)鼠標(biāo)到新聞標(biāo)題

? ? ? ? await page.mouse.click(boundingBox.x + boundingBox.width / 2, boundingBox.y + boundingBox.height / 2);? // 模擬點(diǎn)擊

? ? ? ? console.log('點(diǎn)擊了新聞標(biāo)題,進(jìn)入新聞詳情頁(yè)面');

? ? ? ? await page.waitForTimeout(2000);? // 等待詳情頁(yè)面加載

? ? }

? ? // 抓取新聞詳情頁(yè)面中的內(nèi)容

? ? const newsData = await page.evaluate(() => {

? ? ? ? const titleElement = document.querySelector('.news_content .news_title');? // 替換為詳情頁(yè)面中的標(biāo)題選擇器

? ? ? ? const contentElement = document.querySelector('.news_content .news_body');? // 替換為詳情頁(yè)面中的正文選擇器

? ? ? ? return {

? ? ? ? ? ? title: titleElement ? titleElement.innerText : '',

? ? ? ? ? ? content: contentElement ? contentElement.innerText : ''

? ? ? ? };

? ? });

? ? console.log('抓取的新聞詳情數(shù)據(jù):', newsData);

? ? // 關(guān)閉瀏覽器

? ? await browser.close();

})();

```

### 3. 代碼解析

+ **代理IP配置**:使用16yun的代理IP服務(wù)(域名、端口、用戶名、密碼),通過`page.authenticate()`方法設(shè)置認(rèn)證信息,保證訪問來自代理IP。

+ **<font style="color:rgb(0, 0, 0);">鼠標(biāo)點(diǎn)擊操作</font>**<font style="color:rgb(0, 0, 0);">:使用</font><font style="color:rgb(0, 0, 0);"> </font>`<font style="color:rgb(0, 0, 0);">page.click()</font>`<font style="color:rgb(0, 0, 0);"> </font><font style="color:rgb(0, 0, 0);">或者通過</font><font style="color:rgb(0, 0, 0);"> </font>`<font style="color:rgb(0, 0, 0);">page.mouse.move()</font>`<font style="color:rgb(0, 0, 0);"> </font><font style="color:rgb(0, 0, 0);">和</font><font style="color:rgb(0, 0, 0);"> </font>`<font style="color:rgb(0, 0, 0);">page.mouse.click()</font>`<font style="color:rgb(0, 0, 0);"> </font><font style="color:rgb(0, 0, 0);">精確模擬鼠標(biāo)移動(dòng)并點(diǎn)擊。</font>

+ **<font style="color:rgb(0, 0, 0);">控制鼠標(biāo)移動(dòng)位置</font>**<font style="color:rgb(0, 0, 0);">:通過獲取元素的邊界信息 (</font>`<font style="color:rgb(0, 0, 0);">boundingBox</font>`<font style="color:rgb(0, 0, 0);">) 精確定位鼠標(biāo)點(diǎn)擊位置,模仿真實(shí)用戶的點(diǎn)擊行為。</font>

+ **<font style="color:rgb(0, 0, 0);">等待頁(yè)面響應(yīng)</font>**<font style="color:rgb(0, 0, 0);">:在點(diǎn)擊后使用 </font>`<font style="color:rgb(0, 0, 0);">waitForTimeout</font>`<font style="color:rgb(0, 0, 0);"> 短暫等待,確保頁(yè)面內(nèi)容加載完成,以便下一步抓取。</font>

## 三、效果與應(yīng)用

通過此方案,我們可以在澎湃新聞等新聞門戶網(wǎng)站上自動(dòng)化獲取熱點(diǎn)新聞數(shù)據(jù),并進(jìn)行歸類整理,為后續(xù)的數(shù)據(jù)分析和熱點(diǎn)追蹤奠定基礎(chǔ)。對(duì)于新聞熱點(diǎn)的時(shí)效性需求,這種基于代理IP與用戶模擬的爬蟲方案能夠有效提升數(shù)據(jù)抓取的穩(wěn)定性與準(zhǔn)確性。

在實(shí)際應(yīng)用中,可以進(jìn)一步將抓取的數(shù)據(jù)存儲(chǔ)至數(shù)據(jù)庫(kù)中,以便后續(xù)的數(shù)據(jù)分析與展示。此外,設(shè)置抓取頻率與周期性更新機(jī)制,也可以對(duì)新聞熱點(diǎn)的變化趨勢(shì)進(jìn)行長(zhǎng)時(shí)間監(jiān)控。

## 四、總結(jié)

本文通過Node.js、Puppeteer及代理IP等技術(shù)實(shí)現(xiàn)了自動(dòng)化新聞數(shù)據(jù)抓取的流程。該方案適用于高頻率、連續(xù)性的數(shù)據(jù)抓取任務(wù)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容