• 滑動(dòng)驗(yàn)證碼:需要模擬滑動(dòng)的操作,如 Geetest。

    image

  • 點(diǎn)擊驗(yàn)證碼:需要用戶(hù)點(diǎn)擊特定的圖像區(qū)域,如交通標(biāo)志、汽車(chē)等。

    image

  • 行為驗(yàn)證碼:通過(guò)監(jiān)測(cè)用戶(hù)行為(如鼠標(biāo)軌跡)來(lái)判定是否為人類(lèi)。

    image

  • 特殊復(fù)雜驗(yàn)證:如語(yǔ)音、郵箱、手機(jī)短信、二維碼掃描等

    image

  • 1.2 破解策略

    常見(jiàn)的破解策略有:

    1. 手動(dòng)輸入:適合少量數(shù)據(jù)抓取,但不適合全自動(dòng)化。
    2. 第三方驗(yàn)證碼識(shí)別服務(wù):如 2Captcha、AntiCaptcha 等,通過(guò)自動(dòng)化服務(wù)來(lái)識(shí)別驗(yàn)證碼。
    3. 自動(dòng)化模擬用戶(hù)行為:使用 Playwright 的鼠標(biāo)和鍵盤(pán) API 來(lái)模擬用戶(hù)行為。
    4. 復(fù)用登錄信息:通過(guò)保存并復(fù)用瀏覽器登錄狀態(tài)(如 cookies)來(lái)跳過(guò)驗(yàn)證碼。

    2. 手動(dòng)輸入驗(yàn)證碼 – 最簡(jiǎn)單的解決方案

    對(duì)于一些頻繁遇到驗(yàn)證碼的頁(yè)面,手動(dòng)輸入驗(yàn)證碼雖然簡(jiǎn)便,但無(wú)法完全自動(dòng)化。適用于少量數(shù)據(jù)抓取場(chǎng)景。

    2.1 適用場(chǎng)景

    2.2 解決方法

    當(dāng)遇到驗(yàn)證碼時(shí),手動(dòng)輸入后繼續(xù)抓取。此方法簡(jiǎn)單直接,但顯然無(wú)法適應(yīng)大規(guī)模爬取。在 Playwright 中,可以使用

    page.pause()

    方法暫停腳本執(zhí)行,等待手動(dòng)輸入驗(yàn)證碼。

    2.3 示例

    const { chromium } = require('playwright');
    (async () => {
      const browser = await chromium.launch({ headless: false });
      const page = await browser.newPage();
      await page.goto('https://www.example.com/login');
      // 輸入用戶(hù)名和密碼
      await page.fill('#username', 'your-username');
      await page.fill('#password', 'your-password');
      // 暫停腳本,等待手動(dòng)輸入驗(yàn)證碼
      console.log('請(qǐng)?jiān)跒g覽器中手動(dòng)輸入驗(yàn)證碼,然后按回車(chē)?yán)^續(xù)...');
      await page.pause();
      // 點(diǎn)擊登錄按鈕
      await page.click('#login-button');
      await browser.close();
    })();

    3. 使用第三方驗(yàn)證碼識(shí)別服務(wù)

    使用第三方驗(yàn)證碼識(shí)別服務(wù)(如 2CaptchaAnti-Captcha)來(lái)自動(dòng)識(shí)別驗(yàn)證碼。

    3.1 適用場(chǎng)景:

    3.2 實(shí)現(xiàn)方法

    1. 注冊(cè)并獲取 API 密鑰(如 2Captcha)。
    2. 截取驗(yàn)證碼圖片。
    3. 上傳圖片進(jìn)行識(shí)別,并返回驗(yàn)證碼文本。
    4. 輸入驗(yàn)證碼并提交。

    3.3 示例:使用 2Captcha 識(shí)別驗(yàn)證碼

    const { chromium } = require('playwright');
    const axios = require('axios');
    const fs = require('fs');
    const path = require('path');
    (async () => {
      const browser = await chromium.launch({ headless: false });
      const page = await browser.newPage();
      // 打開(kāi)包含驗(yàn)證碼的頁(yè)面
      await page.goto('https://example.com/captcha');
      // 截取驗(yàn)證碼圖片
      const captchaImg = await page.locator('.captcha-image').screenshot();
      fs.writeFileSync(path.join(__dirname, 'captcha.png'), captchaImg);
      // 使用 2Captcha API 進(jìn)行驗(yàn)證碼識(shí)別
      const captchaResult = await solveCaptchaWith2Captcha('YOUR_API_KEY', 'captcha.png');
      // 輸入驗(yàn)證碼
      await page.fill('#captcha-input', captchaResult);
      await page.click('#submit-button');
      console.log('驗(yàn)證碼已解決并提交');
      await browser.close();
    })();
    
    async function solveCaptchaWith2Captcha(apiKey, imagePath) {
      const image = fs.readFileSync(path.join(__dirname, imagePath));
      const response = await axios.post(http://2captcha.com/in.php?key=${apiKey}&method=userrecaptcha&body=${image}, image);
      const captchaId = response.data.request;
      // 查詢(xún)識(shí)別結(jié)果
      const result = await axios.get(http://2captcha.com/res.php?key=${apiKey}&action=get&id=${captchaId});
      return result.data.request;
    }

    4. 自動(dòng)化模擬用戶(hù)行為 – 解決滑動(dòng)、點(diǎn)擊驗(yàn)證碼

    有些驗(yàn)證碼(如 GeetestreCAPTCHA)通過(guò)模擬用戶(hù)行為來(lái)驗(yàn)證是否為人類(lèi)。這些驗(yàn)證碼類(lèi)型要求用戶(hù)執(zhí)行某些操作(如滑動(dòng)條、點(diǎn)擊指定區(qū)域等),我們可以使用 Playwright 來(lái)模擬這些用戶(hù)行為,繞過(guò)驗(yàn)證碼。

    4.1 適用場(chǎng)景

    4.2 解決方法:

    mouse.move()

    、

    mouse.down()

    mouse.up()

    等函數(shù)模擬用戶(hù)的滑動(dòng)或點(diǎn)擊行為。

    4.3 示例:模擬滑動(dòng)驗(yàn)證碼

    const { chromium } = require('playwright');
    (async () => {
      const browser = await chromium.launch({ headless: false });
      const page = await browser.newPage();
      // 打開(kāi)包含滑動(dòng)驗(yàn)證碼的頁(yè)面
      await page.goto('https://www.geetest.com/demo');
      // 等待驗(yàn)證碼加載
      await page.waitForSelector('.geetest_canvas_bg');
      // 獲取滑動(dòng)驗(yàn)證碼元素
      const slideElement = await page.locator('.geetest_slider_button');
      // 模擬滑動(dòng)動(dòng)作
      const box = await slideElement.boundingBox();
      const startX = box.x + box.width / 2;
      const startY = box.y + box.height / 2;
      await page.mouse.move(startX, startY);
      await page.mouse.down();
      await page.mouse.move(startX + 200, startY, { steps: 20 });
      await page.mouse.up();
      console.log('滑動(dòng)驗(yàn)證碼已解決');
      await browser.close();
    })();

    5. 復(fù)用登錄信息,繞過(guò)驗(yàn)證碼

    在一些網(wǎng)站中,驗(yàn)證碼通常只出現(xiàn)在登錄或注冊(cè)時(shí)。為了避免每次都遇到驗(yàn)證碼,我們可以通過(guò)保存并復(fù)用瀏覽器的登錄狀態(tài)來(lái)繞過(guò)驗(yàn)證碼。

    5.1 適用場(chǎng)景

    5.2 實(shí)現(xiàn)方法

    使用 PlaywrightstorageState 功能保存登錄狀態(tài),并在后續(xù)腳本中復(fù)用。

    1. 登錄并保存登錄狀態(tài) (Cookies)。
    2. 在后續(xù)請(qǐng)求中加載 Cookies,跳過(guò)驗(yàn)證碼。

    5.3 示例:保存和復(fù)用 Cookies

    const { chromium } = require('playwright');
    
    // 保存登錄狀態(tài)
    (async () => {
      const browser = await chromium.launch({ headless: false });
      const context = await browser.newContext();
      const page = await context.newPage();
      await page.goto('https://www.example.com/login');
      await page.fill('#username', 'your-username');
      await page.fill('#password', 'your-password');
      await page.click('#login-button');
      // 保存登錄狀態(tài)
      await context.storageState({ path: 'login_state.json' });
      await browser.close();
    })();
    
    // 復(fù)用登錄狀態(tài)
    (async () => {
      const browser = await chromium.launch({ headless: false });
      const context = await browser.newContext({ storageState: 'login_state.json' });
      const page = await context.newPage();
      await page.goto('https://www.example.com');
      console.log(await page.content());
      await browser.close();
    })();

    6. Playwright Connect – 復(fù)用瀏覽器會(huì)話(huà)

    6.1 適用場(chǎng)景

    6.2 實(shí)現(xiàn)方法

    playwright.chromium.connect_over_cdp()

    連接到已打開(kāi)的 Chromium 瀏覽器實(shí)例,復(fù)用登錄狀態(tài),可以避免每次啟動(dòng)瀏覽器時(shí)都要重新登錄或解決驗(yàn)證碼。

    6.3 示例代碼

    const { chromium } = require('playwright');
    (async () => {
      // 連接到已打開(kāi)的 Chromium 瀏覽器實(shí)例
      const browser = await chromium.connectOverCDP('http://localhost:9222');
      const context = browser.contexts()[0];
      const page = context.pages()[0];
      await page.goto('https://www.example.com');
      console.log(await page.content());
      await browser.close();
    })();

    7. 總結(jié)

    在爬蟲(chóng)開(kāi)發(fā)中,驗(yàn)證碼是一個(gè)常見(jiàn)的反爬蟲(chóng)手段。面對(duì)驗(yàn)證碼,我們可以通過(guò)以下策略應(yīng)對(duì):

    對(duì)于更深入的技術(shù),如何復(fù)用登錄信息以及使用

    connect_over_cdp()

    方法,我們將在后續(xù)的專(zhuān)題文章中進(jìn)一步展開(kāi)討論。如果你覺(jué)得本系列教程對(duì)你有幫助,還請(qǐng) 點(diǎn)個(gè)贊,關(guān)個(gè)注,下次更新不迷路!

    原文轉(zhuǎn)載自:https://mp.weixin.qq.com/s/g-AdKRA-Sn9nqbI8jUiohA

    上一篇:

    DeepSeek API 升級(jí),支持續(xù)寫(xiě)、FIM、Function Calling、JSON Output

    下一篇:

    高顏值的 DeepSeek 開(kāi)源客戶(hù)端Lobe Chat
    #你可能也喜歡這些API文章!

    我們有何不同?

    API服務(wù)商零注冊(cè)

    多API并行試用

    數(shù)據(jù)驅(qū)動(dòng)選型,提升決策效率

    查看全部API→
    ??

    熱門(mén)場(chǎng)景實(shí)測(cè),選對(duì)API

    #AI文本生成大模型API

    對(duì)比大模型API的內(nèi)容創(chuàng)意新穎性、情感共鳴力、商業(yè)轉(zhuǎn)化潛力

    25個(gè)渠道
    一鍵對(duì)比試用API 限時(shí)免費(fèi)

    #AI深度推理大模型API

    對(duì)比大模型API的邏輯推理準(zhǔn)確性、分析深度、可視化建議合理性

    10個(gè)渠道
    一鍵對(duì)比試用API 限時(shí)免費(fèi)