捕捉頁(yè)面的關(guān)鍵元素:用CSS選擇器與Puppeteer自動(dòng)抓取

爬蟲代理

### 概述

在網(wǎng)絡(luò)數(shù)據(jù)爬取中,如何精準(zhǔn)、有效地抓取網(wǎng)頁(yè)中的關(guān)鍵元素是核心問(wèn)題之一。尤其對(duì)于動(dòng)態(tài)網(wǎng)頁(yè)來(lái)說(shuō),JavaScript渲染的內(nèi)容無(wú)法通過(guò)傳統(tǒng)的靜態(tài)爬蟲工具(如 `requests`、`BeautifulSoup` 等)獲取。因此,使用能夠控制瀏覽器的自動(dòng)化工具 **Puppeteer** 就成了一種理想選擇。

本文將介紹如何利用 **Puppeteer** 結(jié)合 **CSS選擇器** 來(lái)抓取動(dòng)態(tài)網(wǎng)頁(yè)中的關(guān)鍵元素。我們以抓取 **亞航(AirAsia)** 網(wǎng)站的特價(jià)機(jī)票信息為例,使用 **代理IP** 來(lái)繞過(guò)網(wǎng)站反爬蟲策略,并通過(guò)設(shè)置 **User-Agent** 和 **Cookie** 等信息提高爬取效率。本文使用的代理服務(wù)為 **爬蟲代理**。

### Puppeteer 介紹

**Puppeteer** 是 Google 推出的用于控制無(wú)頭瀏覽器(Headless Browser)的 Node.js 庫(kù)。它可以用于:

+ 自動(dòng)化網(wǎng)頁(yè)操作(如模擬點(diǎn)擊、輸入、截圖等)

+ 抓取動(dòng)態(tài)渲染的數(shù)據(jù)

+ 網(wǎng)站性能測(cè)試

### 項(xiàng)目環(huán)境準(zhǔn)備

在開始之前,請(qǐng)確保您的開發(fā)環(huán)境已經(jīng)安裝了以下工具:

+ Node.js

+ Puppeteer

您可以通過(guò)以下命令安裝 Puppeteer:

```bash

npm install puppeteer

```

### 詳細(xì)實(shí)現(xiàn)步驟

#### 1. 代碼結(jié)構(gòu)概述

我們將通過(guò)以下步驟完成對(duì)亞航特價(jià)機(jī)票信息的抓?。?/p>

+ 初始化 Puppeteer 并設(shè)置代理 IP

+ 訪問(wèn)亞航官網(wǎng),并設(shè)置 User-Agent 和 Cookie

+ 使用 CSS 選擇器定位特價(jià)機(jī)票信息

+ 抓取并輸出特價(jià)機(jī)票價(jià)格和航班信息

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

```javascript

const puppeteer = require('puppeteer');

// 配置代理IP信息 億牛云爬蟲代理加強(qiáng)版 www.16yun.cn

const proxyHost = "proxy.16yun.cn"; // 代理服務(wù)器

const proxyPort = 12345; // 代理端口

const proxyUsername = "your_username"; // 用戶名

const proxyPassword = "your_password"; // 密碼

// 自定義User-Agent

const userAgent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36';

// 設(shè)置目標(biāo)網(wǎng)站

const targetUrl = 'https://www.airasia.com/';

(async () => {

? ? // 啟動(dòng) Puppeteer 瀏覽器

? ? const browser = await puppeteer.launch({

? ? ? ? headless: true, // 設(shè)置為 true 表示無(wú)頭模式

? ? ? ? args: [

? ? ? ? ? ? `--proxy-server=${proxyHost}:${proxyPort}` // 配置16yun代理服務(wù)器

? ? ? ? ]

? ? });

? ? // 創(chuàng)建新頁(yè)面

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

? ? // 配置16yun代理的認(rèn)證信息

? ? await page.authenticate({

? ? ? ? username: proxyUsername,

? ? ? ? password: proxyPassword

? ? });

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

? ? await page.setUserAgent(userAgent);

? ? // 設(shè)置 Cookie(這里假設(shè)已有登錄 Cookie,可以通過(guò)抓包獲取)

? ? const cookies = [

? ? ? ? {

? ? ? ? ? ? name: 'sessionid',

? ? ? ? ? ? value: 'your_session_value',

? ? ? ? ? ? domain: '.airasia.com'

? ? ? ? }

? ? ];

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

? ? // 訪問(wèn)目標(biāo)網(wǎng)站

? ? await page.goto(targetUrl, {

? ? ? ? waitUntil: 'networkidle2', // 等待網(wǎng)絡(luò)空閑

? ? ? ? timeout: 60000 // 設(shè)置超時(shí)時(shí)間

? ? });

? ? // 等待特價(jià)機(jī)票列表元素加載完成

? ? await page.waitForSelector('.promotion-list', { timeout: 60000 });

? ? // 使用CSS選擇器獲取特價(jià)機(jī)票信息

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

? ? ? ? // 查找特價(jià)機(jī)票列表元素

? ? ? ? const promotions = document.querySelectorAll('.promotion-list .promotion-item');

? ? ? ? // 提取特價(jià)機(jī)票信息

? ? ? ? const data = [];

? ? ? ? promotions.forEach(item => {

? ? ? ? ? ? const flightRoute = item.querySelector('.route-info')?.innerText || '未知航線';

? ? ? ? ? ? const price = item.querySelector('.price')?.innerText || '未知價(jià)格';

? ? ? ? ? ? const flightDate = item.querySelector('.date-info')?.innerText || '未知日期';

? ? ? ? ? ? data.push({

? ? ? ? ? ? ? ? flightRoute,

? ? ? ? ? ? ? ? price,

? ? ? ? ? ? ? ? flightDate

? ? ? ? ? ? });

? ? ? ? });

? ? ? ? return data;

? ? });

? ? // 輸出抓取的數(shù)據(jù)

? ? console.log('特價(jià)機(jī)票信息:');

? ? flightData.forEach((flight, index) => {

? ? ? ? console.log(`航班 ${index + 1}:`);

? ? ? ? console.log(`? 航線: ${flight.flightRoute}`);

? ? ? ? console.log(`? 價(jià)格: ${flight.price}`);

? ? ? ? console.log(`? 日期: ${flight.flightDate}`);

? ? });

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

? ? await browser.close();

})();

```

#### 3. 代碼詳解

+ **代理配置**:?

使用爬蟲代理的用戶名、密碼,進(jìn)行身份認(rèn)證。

```javascript

await page.authenticate({

? ? username: proxyUsername,

? ? password: proxyPassword

});

```

+ **User-Agent 和 Cookie 設(shè)置**:?

配置 User-Agent 以模仿真實(shí)用戶的瀏覽器訪問(wèn),并設(shè)置 Cookie 以提高成功率。

```javascript

await page.setUserAgent(userAgent);

await page.setCookie(...cookies);

```

+ **抓取特價(jià)機(jī)票信息**:?

使用 CSS 選擇器精準(zhǔn)獲取頁(yè)面中的特價(jià)機(jī)票列表,并提取航線、價(jià)格、日期等關(guān)鍵信息。

```javascript

const promotions = document.querySelectorAll('.promotion-list .promotion-item');

```

#### 4. 結(jié)果輸出

程序執(zhí)行完成后,將會(huì)輸出類似以下格式的特價(jià)機(jī)票信息:

```plain

特價(jià)機(jī)票信息:

航班 1:

? 航線: 北京 - 曼谷

? 價(jià)格: ¥599

? 日期: 2024-12-15

航班 2:

? 航線: 上海 - 吉隆坡

? 價(jià)格: ¥499

? 日期: 2024-12-16

```

### 提高效率的優(yōu)化點(diǎn)

1. **使用代理 IP**:?

為避免 IP 被限制,我們使用了的爬蟲代理服務(wù),并動(dòng)態(tài)切換 IP。

2. **設(shè)置 User-Agent 和 Cookie**:?

模擬真實(shí)用戶的訪問(wèn)行為,提高爬取成功率。

3. **優(yōu)化選擇器和等待時(shí)間**:?

使用 `waitForSelector` 保證在元素加載完成后再進(jìn)行抓取,避免因?yàn)轫?yè)面加載問(wèn)題導(dǎo)致數(shù)據(jù)缺失。

### 結(jié)論

本文通過(guò) **Puppeteer** 和 **CSS選擇器** 實(shí)現(xiàn)了對(duì) **亞航** 網(wǎng)站特價(jià)機(jī)票信息的抓取。利用代理 IP 和自定義請(qǐng)求頭等手段,提高了爬蟲的隱蔽性和穩(wěn)定性。在實(shí)際應(yīng)用中,Puppeteer 的強(qiáng)大功能不僅限于此,它還可以幫助開發(fā)者完成更多復(fù)雜的網(wǎng)頁(yè)自動(dòng)化操作,是網(wǎng)絡(luò)爬蟲開發(fā)的有力工具。

?著作權(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)容