स्क्रैपिंग ब्राउज़र और क्लाउडफ्लेयर
यह तकनीकी दस्तावेज़ बताता है कि क्लाउडफ्लेयर द्वारा स्थापित विभिन्न सुरक्षा चुनौतियों को कैसे संभालने के लिए स्क्रैपलेस स्क्रैपिंग ब्राउज़र और स्क्रैपलेस वेब अनलॉकर टूल्स का उपयोग करें। प्रमुख विशेषताओं में क्लाउडफ्लेयर JS चुनौती, क्लाउडफ्लेयर टर्नस्टाइल को दरकिनार करना और क्लाउडफ्लेयर द्वारा संरक्षित सामग्री तक पहुँचने के लिए जावास्क्रिप्ट रेंडरिंग को निष्पादित करना शामिल है। यह दस्तावेज़ प्रासंगिक पृष्ठभूमि ज्ञान, सुविधा परिचय, परिचालन चरण और कोड उदाहरण स्पष्टीकरण प्रदान करेगा।
क्लाउडफ्लेयर चुनौतियों और सुरक्षा परतों को समझना
क्लाउडफ्लेयर, एक लोकप्रिय वेब सुरक्षा और प्रदर्शन सेवा, मुख्य रूप से वेबसाइटों को दुर्भावनापूर्ण या अप्रत्याशित ट्रैफ़िक से बचाती है, जैसे कि बॉट्स और स्कैनर। इसके लिए, क्लाउडफ्लेयर विभिन्न पता लगाने और रक्षा तंत्र लागू करता है, जिसमें शामिल हैं, लेकिन सीमित नहीं हैं:
1. JS चुनौती (जावास्क्रिप्ट चुनौती): आगंतुक के ब्राउज़र को यह सत्यापित करने के लिए विशिष्ट जावास्क्रिप्ट कोड निष्पादित करने की आवश्यकता होती है कि यह मानक कार्यक्षमता के साथ एक वैध ब्राउज़र वातावरण है।
2. टर्नस्टाइल CAPTCHA विकल्प: मानव उपयोगकर्ताओं और बॉट्स के बीच अंतर करने के लिए एक कम घुसपैठ करने वाला सत्यापन तंत्र।
3. ब्राउज़र फ़िंगरप्रिंटिंग: आगंतुकों की पहचान और ट्रैक करने के लिए ब्राउज़र और डिवाइस की तकनीकी विशेषताओं (जैसे, उपयोगकर्ता-एजेंट, स्क्रीन रिज़ॉल्यूशन, स्थापित फ़ॉन्ट्स, प्लगइन्स) को इकट्ठा करता और विश्लेषण करता है।
4. दर सीमा: एक विशिष्ट समय के भीतर एक ही स्रोत (जैसे, आईपी पता) से अनुरोधों की संख्या की निगरानी और सीमा निर्धारित करता है ताकि बल प्रयोग या संसाधन दुरुपयोग को रोका जा सके।
ये सुरक्षा परतें बुनियादी HTTP अनुरोध पुस्तकालयों, साधारण स्क्रिप्ट या अनुचित रूप से कॉन्फ़िगर किए गए हेडलेस ब्राउज़रों को क्लाउडफ्लेयर द्वारा संरक्षित वेबसाइटों तक पहुँचने से रोकती हैं, जिसके परिणामस्वरूप सत्यापन विफलताएँ और पहुँच अस्वीकृति होती है।
क्लाउडफ्लेयर JS चुनौती और अन्य चुनौतियों के बीच अंतर
क्लाउडफ्लेयर JS चुनौती की विशिष्टता इसकी सत्यापन विधि में है। इसे केवल उपयोगकर्ताओं को एक सरल इंटरैक्टिव कार्य पूरा करने की आवश्यकता नहीं होती है (जैसे, छवि पहचान); यह मांग करता है कि क्लाइंट वातावरण (ब्राउज़र) क्लाउडफ्लेयर से गतिशील रूप से उत्पन्न, अक्सर अस्पष्ट, जावास्क्रिप्ट कोड को सफलतापूर्वक पार्स और निष्पादित करे। यह कोड पर्यावरण जाँच, कम्प्यूटेशनल रूप से गहन कार्य, या क्लाइंट की जटिल व्यवहार क्षमताओं की नकल करते हुए, एक वास्तविक ब्राउज़र की तरह, अन्य तर्क को सत्यापित करने के लिए करता है।
JS चुनौती को सफलतापूर्वक पारित करने में एक वैध क्लीयरेंस टोकन (आमतौर पर cf_clearance
कुकी के रूप में) उत्पन्न करना शामिल है। यह टोकन साबित करता है कि क्लाइंट जावास्क्रिप्ट निष्पादन क्षमता सत्यापन पास कर गया है। कई स्वचालन टूल में एक पूर्ण जावास्क्रिप्ट निष्पादन इंजन और यथार्थवादी ब्राउज़र पर्यावरण सिमुलेशन की कमी होती है, इस प्रकार ऐसी चुनौतियों में विफल रहते हैं।
स्क्रैपलेस स्क्रैपिंग ब्राउज़र का उपयोग करके क्लाउडफ्लेयर JS चुनौती को दरकिनार करना
स्क्रैपलेस स्क्रैपिंग ब्राउज़र को क्लाउडफ्लेयर JS चुनौती सहित जटिल वेबसाइट सुरक्षा उपायों को संभालने के लिए डिज़ाइन किया गया है।
चरण और कोड उदाहरण
पर्यावरण सेटअप
एक प्रोजेक्ट फ़ोल्डर बनाएँ
प्रोजेक्ट के लिए एक नया फ़ोल्डर बनाएँ, उदाहरण के लिए: scrapeless-bypass।
अपने टर्मिनल में फ़ोल्डर पर जाएँ:
cd path/to/scrapeless-bypass
Node.js प्रोजेक्ट इनिशियलाइज़ करें
package.json फ़ाइल बनाने के लिए निम्न कमांड चलाएँ:
npm init -y
आवश्यक निर्भरताएँ स्थापित करें
Puppeteer-core स्थापित करें, जो ब्राउज़र उदाहरणों से दूरस्थ कनेक्शन की अनुमति देता है:
npm install puppeteer-core
यदि Puppeteer पहले से ही आपके सिस्टम पर स्थापित नहीं है, तो पूर्ण संस्करण स्थापित करें:
npm install puppeteer puppeteer-core
अपनी स्क्रैपलेस API कुंजी प्राप्त करें और कॉन्फ़िगर करें।
कनेक्ट करें और सुनिश्चित करें कि CAPTCHA सफलतापूर्वक हल हो गया है
लक्ष्य वेबसाइट तक पहुँचने के लिए ब्राउज़र से कनेक्ट करते समय स्क्रैपलेस स्वचालित रूप से CAPTCHA का पता लगाता है और हल करता है। हालाँकि, हमें यह सुनिश्चित करने की आवश्यकता है कि CAPTCHA सफलतापूर्वक हल हो गया है। स्क्रैपलेस स्क्रैपिंग ब्राउज़र कस्टम क्षमताओं के एक शक्तिशाली सेट के साथ मानक CDP (क्रोम डेवलपमेंट टूल्स प्रोटोकॉल) का विस्तार करता है। CDP API से लौटाए गए परिणामों की जाँच करके CAPTCHA सॉल्वर की स्थिति को सीधे देखा जा सकता है:
Captcha.detected
: CAPTCHA पता चलाCaptcha.solveFinished
: CAPTCHA सफलतापूर्वक हल हो गयाCaptcha.solveFailed
: CAPTCHA हल करने में विफल रहा
import puppeteer from "puppeteer-core";
import EventEmitter from 'events';
const emitter = new EventEmitter()
const scrapelessUrl = 'wss://browser.scrapeless.com/browser?token=your_api_key&session_ttl=180&proxy_country=ANY';
export async function example(url) {
const browser = await puppeteer.connect({
browserWSEndpoint: scrapelessUrl,
defaultViewport: null
});
console.log("Verbonden met Scrapeless browser");
try {
const page = await browser.newPage();
// Listen for captcha events
console.debug("addCaptchaListener: Start listening for captcha events");
await addCaptchaListener(page);
console.log("Navigated to URL:", url);
await page.goto(url, { waitUntil: "domcontentloaded", timeout: 30000 });
console.log("onCaptchaFinished: Waiting for captcha solving to finish...");
await onCaptchaFinished()
// Screenshot for debugging
console.debug("Taking screenshot of the final page...");
await page.screenshot({ path: 'screenshot.png', fullPage: true });
} catch (error) {
console.error(error);
} finally {
await browser.close();
console.log("Browser closed");
}
}
async function addCaptchaListener(page) {
const client = await page.createCDPSession();
client.on("Captcha.detected", (msg) => {
console.debug("Captcha.detected: ", msg);
});
client.on("Captcha.solveFinished", async (msg) => {
console.debug("Captcha.solveFinished: ", msg);
emitter.emit("Captcha.solveFinished", msg);
client.removeAllListeners()
});
}
async function onCaptchaFinished(timeout = 60_000) {
return Promise.race([
new Promise((resolve) => {
emitter.on("Captcha.solveFinished", (msg) => {
resolve(msg);
});
}),
new Promise((_, reject) => setTimeout(() => reject('Timeout'), timeout))
])
}
यह उदाहरण वर्कफ़्लो लक्ष्य वेबसाइट तक पहुँचता है और Captcha.solveFinished CDP ईवेंट सुनकर यह पुष्टि करता है कि CAPTCHA सफलतापूर्वक हल हो गया है। अंत में, यह सत्यापन के लिए पृष्ठ का स्क्रीनशॉट कैप्चर करता है।
यह उदाहरण दो मुख्य विधियों को परिभाषित करता है:
addCaptchaListener
: ब्राउज़र सत्र के भीतर CAPTCHA ईवेंट सुनने के लिएonCaptchaFinished
: CAPTCHA के हल होने तक प्रतीक्षा करने के लिए
उपरोक्त उदाहरण कोड इस लेख में चर्चा किए गए तीन सामान्य CAPTCHA प्रकारों के लिए CDP ईवेंट सुनने के लिए उपयोग किया जा सकता है: reCAPTCHA v2, Cloudflare Turnstile, और Cloudflare 5s Challenge।
ध्यान दें कि Cloudflare 5s Challenge कुछ हद तक विशेष है। कभी-कभी यह वास्तविक चुनौती को ट्रिगर नहीं करता है, और सफलता के लिए केवल CDP ईवेंट का पता लगाने पर निर्भर रहने से समय सीमा समाप्त हो सकती है। इसलिए, चुनौती के बाद पृष्ठ पर दिखाई देने वाले विशिष्ट तत्व की प्रतीक्षा करना अधिक स्थिर समाधान है।
स्क्रैपलेस ब्राउज़रलेस वेबसोकेट से कनेक्ट होना
स्क्रैपलेस एक वेबसोकेट कनेक्शन प्रदान करता है, जिससे Puppeteer क्लाउडफ्लेयर चुनौतियों को दरकिनार करते हुए, हेडलेस ब्राउज़र के साथ सीधे बातचीत कर सकता है।
पूर्ण वेबसोकेट कनेक्शन पता:
wss://browser.scrapeless.com/browser?token=APIKey&session_ttl=180&proxy_country=ANY
कोड उदाहरण: क्लाउडफ्लेयर चुनौती को दरकिनार करना
हमें स्क्रैपलेस की ब्राउज़रलेस सेवा से कनेक्ट करने के लिए केवल निम्न कोड की आवश्यकता है।
import puppeteer from 'puppeteer-core';
const API_KEY = 'your_api_key'
const host = 'wss://browser.scrapeless.com';
const query = new URLSearchParams({
token: API_KEY,
session_ttl: '180', // The life cycle of a browser session, in seconds
proxy_country: 'GB', // Agent country
proxy_session_id: 'test_session_id', // The proxy session id is used to keep the proxy ip unchanged. The session time is 3 minutes by default, based on the proxy_session_duration setting.
proxy_session_duration: '5' // Agent session time, unit minutes
}).toString();
const connectionURL = `${host}/browser?${query}`;
const browser = await puppeteer.connect({
browserWSEndpoint: connectionURL,
defaultViewport: null,
});
console.log('Connected!')
क्लाउडफ्लेयर द्वारा संरक्षित वेबसाइटों तक पहुँचना और स्क्रीनशॉट सत्यापन
अगला, हम स्क्रैपलेस ब्राउज़रलेस का उपयोग सीधे क्लाउडफ्लेयर-चुनौती परीक्षण साइट तक पहुँचने और एक स्क्रीनशॉट जोड़ने के लिए करते हैं, जिससे दृश्य सत्यापन की अनुमति मिलती है। स्क्रीनशॉट लेने से पहले, ध्यान दें कि आपको पृष्ठ पर तत्वों की प्रतीक्षा करने के लिए waitForSelector
का उपयोग करने की आवश्यकता है, यह सुनिश्चित करते हुए कि क्लाउडफ्लेयर चुनौती को सफलतापूर्वक दरकिनार कर दिया गया है।
const page = await browser.newPage();
await page.goto('https://www.scrapingcourse.com/cloudflare-challenge', {waitUntil: 'domcontentloaded'});
// By waiting for elements in the site page, ensuring that the Cloudflare challenge has been successfully bypassed.
await page.waitForSelector('main.page-content .challenge-info', {timeout: 30 * 1000})
await page.screenshot({path: 'challenge-bypass.png'});
इस बिंदु पर, आपने स्क्रैपलेस ब्राउज़रलेस का उपयोग करके क्लाउडफ्लेयर चुनौती को दरकिनार कर दिया है।
cf_clearance कुकी और हेडर प्राप्त करना
क्लाउडफ्लेयर चुनौती पास करने के बाद, आप सफल पृष्ठ से अनुरोध हेडर और cf_clearance कुकी प्राप्त कर सकते हैं।
const cookies = await browser.cookies()
const cfClearance = cookies.find(cookie => cookie.name === 'cf_clearance')?.value
क्लाउडफ्लेयर चुनौती के बाद अनुरोध हेडर कैप्चर करने और पृष्ठ अनुरोधों का मिलान करने के लिए अनुरोध अवरोधन सक्षम करें।
await page.setRequestInterception(true);
page.on('request', request => {
// Match page requests after cloudflare challenge
if (request.url().includes('https://www.scrapingcourse.com/cloudflare-challenge') && request.headers()?.['origin']) {
const accessRequestHeaders = request.headers();
console.log('[access_request_headers] =>', accessRequestHeaders);
}
request.continue();
});
स्क्रैपलेस स्क्रैपिंग ब्राउज़र का उपयोग करके क्लाउडफ्लेयर टर्नस्टाइल को दरकिनार करना
स्क्रैपलेस स्क्रैपिंग ब्राउज़र क्लाउडफ्लेयर टर्नस्टाइल चुनौतियों को भी संभालता है।
इसी प्रकार, जब क्लाउडफ्लेयर टर्नस्टाइल का सामना करना पड़ता है, तो ब्राउज़रलेस स्क्रैपिंग ब्राउज़र अभी भी इसे स्वचालित रूप से संभाल सकता है। निम्नलिखित उदाहरण क्लाउडफ्लेयर-टर्नस्टाइल परीक्षण साइट तक पहुँचता है। उपयोगकर्ता नाम और पासवर्ड दर्ज करने के बाद, यह window.turnstile.getResponse()
से डेटा की प्रतीक्षा करने के लिए waitForFunction
विधि का उपयोग करता है, यह सुनिश्चित करता है कि चुनौती को सफलतापूर्वक दरकिनार कर दिया गया है। फिर, यह एक स्क्रीनशॉट लेता है और अगले पृष्ठ पर नेविगेट करने के लिए लॉगिन बटन पर क्लिक करता है।
चरण और कोड उदाहरण:
const page = await browser.newPage();
await page.goto('https://www.scrapingcourse.com/login/cf-turnstile', { waitUntil: 'domcontentloaded' });
await page.locator('input[type="email"]').fill('admin@example.com')
await page.locator('input[type="password"]').fill('password')
// Wait for turnstile to unlock successfully
await page.waitForFunction(() => {
return window.turnstile && window.turnstile.getResponse();
});
await page.screenshot({ path: 'challenge-bypass-success.png' });
await page.locator('button[type="submit"]').click()
await page.waitForNavigation()
await page.screenshot({ path: 'next-page.png' });
यह स्क्रिप्ट चलाने के बाद, आप स्क्रीनशॉट के माध्यम से अनलॉकिंग प्रभाव देखेंगे।
जावास्क्रिप्ट रेंडरिंग के लिए स्क्रैपलेस वेब अनलॉकर का उपयोग करना
क्लाउडफ्लेयर द्वारा संरक्षित वेबसाइटों के लिए जहाँ मुख्य सामग्री पूर्ण लोडिंग और प्रदर्शन के लिए क्लाइंट-साइड जावास्क्रिप्ट निष्पादन पर निर्भर करती है, स्क्रैपलेस वेब अनलॉकर एक समर्पित समाधान प्रदान करता है।
स्क्रैपलेस यूनिवर्सल API जावास्क्रिप्ट रेंडरिंग और गतिशील इंटरैक्शन को सक्षम बनाता है, जिससे यह क्लाउडफ्लेयर को दरकिनार करने के लिए एक प्रभावी उपकरण बन जाता है।
जावास्क्रिप्ट रेंडरिंग
जावास्क्रिप्ट रेंडरिंग गतिशील रूप से लोड की गई सामग्री और SPA (सिंगल-पेज एप्लिकेशन) को संभालने का समर्थन करता है। यह अधिक जटिल पृष्ठ इंटरैक्शन और रेंडरिंग आवश्यकताओं को संभालते हुए, एक पूर्ण ब्राउज़र वातावरण का समर्थन करता है।
js_render=true
के साथ, हम अनुरोध के लिए ब्राउज़र का उपयोग करेंगे
{
"actor": "unlocker.webunlocker",
"input": {
"url": "https://www.google.com/",
"js_render": true
},
"proxy": {
"country": "US"
}
}
जावास्क्रिप्ट निर्देश
वेब पृष्ठों के साथ गतिशील संपर्क की अनुमति देते हुए, जावास्क्रिप्ट निर्देशों का एक व्यापक सेट प्रदान करता है।
ये निर्देश तत्वों पर क्लिक करने, फ़ॉर्म भरने, फ़ॉर्म सबमिट करने या विशिष्ट तत्वों के प्रकट होने की प्रतीक्षा करने में सक्षम बनाते हैं, “अधिक पढ़ें” बटन पर क्लिक करने या फ़ॉर्म सबमिट करने जैसे कार्यों के लिए लचीलापन प्रदान करते हैं।
{
"actor": "unlocker.webunlocker",
"input": {
"url": "https://example.com",
"js_render": true,
"js_instructions": [
{
"wait_for": [
".dynamic-content",
30000
]
// Wait for element
},
{
"click": [
"#load-more",
1000
]
// Click element
},
{
"fill": [
"#search-input",
"search term"
]
// Fill form
},
{
"keyboard": [
"press",
"Enter"
]
// Simulate key press
},
{
"evaluate": "window.scrollTo(0, document.body.scrollHeight)"
// Execute custom JS
}
]
}
}
चुनौती बाईपास उदाहरण
निम्नलिखित उदाहरण क्लाउडफ्लेयर की वेब अनलॉकर सेवा के लिए अनुरोध भेजने के लिए axios का उपयोग करता है। यह js_render
को सक्षम करता है और क्लाउडफ्लेयर चुनौती को दरकिनार करने के बाद पृष्ठ पर एक तत्व की प्रतीक्षा करने के लिए js_instructions
पैरामीटर में wait_for
निर्देश का उपयोग करता है:
import axios from 'axios'
async function sendRequest() {
const host = "api.scrapeless.com";
const url = `https://${host}/api/v1/unlocker/request`;
const API_KEY = 'your_api_key'
const payload = {
actor: "unlocker.webunlocker",
proxy: {
country: "US"
},
input: {
url: "https://www.scrapingcourse.com/cloudflare-challenge",
js_render: true,
js_instructions: [
{
wait_for: [
"main.page-content .challenge-info",
30000
]
}
]
},
}
try {
const response = await axios.post(url, payload, {
headers: {
'Content-Type': 'application/json',
'x-api-token': API_KEY
}
});
console.log("[page_html_body] =>", response.data);
} catch (error) {
console.error('Error:', error);
}
}
sendRequest();
उपरोक्त स्क्रिप्ट चलाने के बाद, आप कंसोल में क्लाउडफ्लेयर चुनौती को सफलतापूर्वक दरकिनार करने वाले पृष्ठ के HTML को देख पाएँगे।