GraphQL API तेजी से लोकप्रिय हो रहे हैं, लेकिन इसके साथ ही सीमाएँ भी बढ़ रही हैं: रेट लिमिटिंग, IP द्वारा ब्लॉकिंग, भौगोलिक फ़िल्टर। यदि आप GraphQL के माध्यम से बड़े डेटा वॉल्यूम के साथ काम कर रहे हैं - ई-कॉमर्स प्लेटफार्मों को पार्स कर रहे हैं, सोशल मीडिया से एनालिटिक्स एकत्र कर रहे हैं या API का परीक्षण कर रहे हैं - प्रॉक्सी के बिना काम नहीं चलेगा। इस लेख में, हम देखेंगे कि GraphQL अनुरोधों के लिए प्रॉक्सी को सही तरीके से कैसे सेट करें, IP रोटेशन कैसे लागू करें और ब्लॉकिंग से कैसे बचें।
हम Python और Node.js पर व्यावहारिक उदाहरण दिखाएंगे, सामान्य गलतियों पर चर्चा करेंगे और विभिन्न कार्यों के लिए प्रॉक्सी के प्रकार के चयन के लिए सिफारिशें देंगे।
GraphQL अनुरोधों के लिए प्रॉक्सी की आवश्यकता क्यों है
GraphQL API अक्सर कम समय में बड़े डेटा वॉल्यूम प्राप्त करने के लिए उपयोग किए जाते हैं। REST API के विपरीत, जहाँ डेटा कई एंडपॉइंट्स में विभाजित होता है, GraphQL एक ही अनुरोध में सभी आवश्यक डेटा को प्राप्त करने की अनुमति देता है। यह सुविधाजनक है, लेकिन समस्याएँ भी उत्पन्न करता है:
- रेट लिमिटिंग - अधिकांश सार्वजनिक GraphQL API एक IP से अनुरोधों की संख्या को सीमित करते हैं (उदाहरण के लिए, GitHub API: प्रति घंटे 5000 अनुरोध, Shopify: प्रति सेकंड 2 अनुरोध)
- IP ब्लॉकिंग - यदि आप सीमाओं को पार करते हैं या संदिग्ध गतिविधि करते हैं, तो आपका IP कुछ घंटों के लिए या हमेशा के लिए ब्लॉक किया जा सकता है
- भौगोलिक सीमाएँ - कुछ API केवल विशिष्ट देशों से उपलब्ध हैं (उदाहरण के लिए, स्थानीय मार्केटप्लेस या क्षेत्रीय सेवाएँ)
- पार्सिंग से सुरक्षा - सर्वर अनुरोधों के पैटर्न को ट्रैक करते हैं और संदिग्ध IP को ब्लॉक करते हैं
प्रॉक्सी इन समस्याओं को हल करते हैं, कई IP पतों के माध्यम से अनुरोधों को वितरित करने, विभिन्न क्षेत्रों से अनुरोधों की नकल करने और ब्लॉकिंग को बायपास करने की अनुमति देते हैं। यह विशेष रूप से महत्वपूर्ण है जब आप निम्नलिखित के साथ काम कर रहे हों:
- ई-कॉमर्स प्लेटफार्मों (Shopify, WooCommerce GraphQL API) से डेटा पार्स करना
- सोशल मीडिया से एनालिटिक्स एकत्र करना (Facebook Graph API, Instagram API)
- मूल्य और उत्पादों की उपलब्धता की निगरानी करना
- विभिन्न भौगोलिक स्थानों से API का परीक्षण करना
- एनालिटिक्स और अनुसंधान के लिए डेटा संग्रह को स्वचालित करना
GraphQL के साथ काम करने के लिए कौन सा प्रॉक्सी प्रकार चुनें
प्रॉक्सी के प्रकार का चयन कार्य और API की आवश्यकताओं पर निर्भर करता है। हम GraphQL अनुरोधों के लिए तीन मुख्य प्रकारों और उनके उपयोग पर चर्चा करेंगे:
| प्रॉक्सी का प्रकार | गति | गोपनीयता | कब उपयोग करें |
|---|---|---|---|
| डेटा सेंटर प्रॉक्सी | बहुत उच्च (10-50 मि.सेक) | मध्यम | सार्वजनिक API का पार्सिंग, परीक्षण, उच्च गति गोपनीयता से अधिक महत्वपूर्ण है |
| रिहायशी प्रॉक्सी | मध्यम (100-300 मि.सेक) | बहुत उच्च | सुरक्षित API (Shopify, Facebook) के साथ काम करना, कठोर फ़िल्टर को बायपास करना |
| मोबाइल प्रॉक्सी | मध्यम (150-400 मि.सेक) | अधिकतम | Instagram API, TikTok API, GraphQL के साथ मोबाइल ऐप |
चुनने के लिए सिफारिशें:
- सार्वजनिक API के लिए (GitHub, OpenWeather) - डेटा सेंटर प्रॉक्सी पर्याप्त हैं, ये तेज और सस्ते हैं
- ई-कॉमर्स के लिए (Shopify, WooCommerce) - रिहायशी प्रॉक्सी, क्योंकि ये प्लेटफॉर्म सक्रिय रूप से डेटा सेंटर को फ़िल्टर करते हैं
- सोशल मीडिया के लिए (Facebook Graph API, Instagram) - मोबाइल या रिहायशी प्रॉक्सी अनिवार्य हैं
- मास पार्सिंग के लिए - संयोजन: मुख्य ट्रैफ़िक के लिए डेटा सेंटर + ब्लॉकिंग के समय रोटेशन के लिए रिहायशी
GraphQL के लिए Python में प्रॉक्सी सेटअप (requests, httpx, gql)
Python API के साथ काम करने के लिए सबसे लोकप्रिय भाषाओं में से एक है। GraphQL अनुरोधों के लिए प्रॉक्सी सेट करने के तीन तरीके देखेंगे।
विकल्प 1: लाइब्रेरी requests (सरल HTTP क्लाइंट)
सबसे सरल तरीका है कि आप मानक लाइब्रेरी requests का उपयोग करें। यह बिना जटिल लॉजिक के बुनियादी GraphQL अनुरोधों के लिए उपयुक्त है।
import requests
import json
# प्रॉक्सी सेटअप
proxies = {
'http': 'http://username:password@proxy.example.com:8080',
'https': 'http://username:password@proxy.example.com:8080'
}
# GraphQL अनुरोध
query = """
query {
products(first: 10) {
edges {
node {
id
title
priceRange {
minVariantPrice {
amount
}
}
}
}
}
}
"""
# प्रॉक्सी के माध्यम से अनुरोध भेजना
url = "https://your-shop.myshopify.com/api/2024-01/graphql.json"
headers = {
'Content-Type': 'application/json',
'X-Shopify-Storefront-Access-Token': 'your_token_here',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
}
response = requests.post(
url,
json={'query': query},
headers=headers,
proxies=proxies,
timeout=30
)
data = response.json()
print(json.dumps(data, indent=2))
विकल्प 2: लाइब्रेरी httpx (असिंक्रोनस अनुरोध)
यदि आपको एक साथ कई अनुरोध भेजने की आवश्यकता है, तो httpx का उपयोग करें जिसमें async/await का समर्थन है:
import httpx
import asyncio
import json
async def fetch_graphql(query, proxy_url):
url = "https://api.example.com/graphql"
headers = {
'Content-Type': 'application/json',
'Authorization': 'Bearer YOUR_TOKEN',
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)'
}
# httpx के लिए प्रॉक्सी सेटअप
proxies = {
"http://": proxy_url,
"https://": proxy_url
}
async with httpx.AsyncClient(proxies=proxies, timeout=30.0) as client:
response = await client.post(
url,
json={'query': query},
headers=headers
)
return response.json()
# उपयोग
query = """
query {
viewer {
login
repositories(first: 5) {
nodes {
name
stargazerCount
}
}
}
}
"""
proxy = "http://user:pass@proxy.example.com:8080"
result = asyncio.run(fetch_graphql(query, proxy))
print(json.dumps(result, indent=2))
विकल्प 3: लाइब्रेरी gql (विशेषीकृत GraphQL क्लाइंट)
GraphQL के साथ उन्नत काम करने के लिए gql लाइब्रेरी का उपयोग करें - यह स्कीमा की वैधता, कैशिंग और अनुरोधों के साथ सुविधाजनक काम का समर्थन करती है:
from gql import gql, Client
from gql.transport.requests import RequestsHTTPTransport
# प्रॉक्सी के साथ परिवहन सेटअप
transport = RequestsHTTPTransport(
url='https://api.example.com/graphql',
headers={
'Authorization': 'Bearer YOUR_TOKEN',
'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64)'
},
proxies={
'http': 'http://user:pass@proxy.example.com:8080',
'https': 'http://user:pass@proxy.example.com:8080'
},
timeout=30
)
# क्लाइंट बनाना
client = Client(transport=transport, fetch_schema_from_transport=True)
# GraphQL अनुरोध
query = gql("""
query GetProducts($first: Int!) {
products(first: $first) {
edges {
node {
id
title
variants(first: 1) {
edges {
node {
price
}
}
}
}
}
}
}
""")
# अनुरोध निष्पादित करना
result = client.execute(query, variable_values={"first": 20})
print(result)
GraphQL के लिए Node.js में प्रॉक्सी सेटअप (axios, apollo-client)
Node.js भी GraphQL API के साथ काम करने के लिए व्यापक रूप से उपयोग किया जाता है। हम दो मुख्य दृष्टिकोण देखेंगे।
विकल्प 1: प्रॉक्सी के साथ Axios
प्रॉक्सी का समर्थन करने वाला सरल और लचीला HTTP क्लाइंट:
const axios = require('axios');
const HttpsProxyAgent = require('https-proxy-agent');
// प्रॉक्सी सेटअप
const proxyUrl = 'http://username:password@proxy.example.com:8080';
const httpsAgent = new HttpsProxyAgent(proxyUrl);
// GraphQL अनुरोध
const query = `
query {
products(first: 10) {
edges {
node {
id
title
priceRange {
minVariantPrice {
amount
}
}
}
}
}
}
`;
// अनुरोध भेजना
axios.post('https://your-shop.myshopify.com/api/2024-01/graphql.json',
{ query },
{
headers: {
'Content-Type': 'application/json',
'X-Shopify-Storefront-Access-Token': 'your_token_here',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'
},
httpsAgent: httpsAgent,
timeout: 30000
}
)
.then(response => {
console.log(JSON.stringify(response.data, null, 2));
})
.catch(error => {
console.error('त्रुटि:', error.message);
});
विकल्प 2: प्रॉक्सी के साथ Apollo Client
Apollo Client - Node.js और ब्राउज़र के लिए सबसे लोकप्रिय GraphQL क्लाइंट। कस्टम फ़ेच के माध्यम से प्रॉक्सी सेटअप:
const { ApolloClient, InMemoryCache, HttpLink, gql } = require('@apollo/client');
const fetch = require('cross-fetch');
const HttpsProxyAgent = require('https-proxy-agent');
// प्रॉक्सी एजेंट
const proxyUrl = 'http://user:pass@proxy.example.com:8080';
const agent = new HttpsProxyAgent(proxyUrl);
// प्रॉक्सी के साथ कस्टम फ़ेच
const customFetch = (uri, options) => {
return fetch(uri, {
...options,
agent: agent
});
};
// Apollo Client बनाना
const client = new ApolloClient({
link: new HttpLink({
uri: 'https://api.example.com/graphql',
fetch: customFetch,
headers: {
'Authorization': 'Bearer YOUR_TOKEN',
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)'
}
}),
cache: new InMemoryCache()
});
// GraphQL अनुरोध
const GET_REPOS = gql`
query GetRepositories($login: String!) {
user(login: $login) {
repositories(first: 5) {
nodes {
name
stargazerCount
}
}
}
}
`;
// अनुरोध निष्पादित करना
client.query({
query: GET_REPOS,
variables: { login: 'facebook' }
})
.then(result => {
console.log(JSON.stringify(result.data, null, 2));
})
.catch(error => {
console.error('त्रुटि:', error);
});
रेट लिमिटिंग को बायपास करने के लिए प्रॉक्सी रोटेशन लागू करना
प्रॉक्सी रोटेशन - API सीमाओं को बायपास करने की एक प्रमुख तकनीक है। सभी अनुरोधों को एक IP से भेजने के बजाय, आप उन्हें कई प्रॉक्सी के बीच वितरित करते हैं। यह रेट लिमिटिंग को बायपास करने और ब्लॉकिंग से बचने की अनुमति देता है।
Python में सरल रोटेशन
प्रॉक्सी के साइक्लिक स्विचिंग के साथ रोटेशन का बुनियादी कार्यान्वयन:
import requests
import itertools
import time
# प्रॉक्सी की सूची
PROXY_LIST = [
'http://user:pass@proxy1.example.com:8080',
'http://user:pass@proxy2.example.com:8080',
'http://user:pass@proxy3.example.com:8080',
'http://user:pass@proxy4.example.com:8080',
]
# अनंत इटरेटर बनाना
proxy_pool = itertools.cycle(PROXY_LIST)
def make_graphql_request(query):
"""प्रॉक्सी के साथ GraphQL अनुरोध भेजना"""
proxy = next(proxy_pool)
proxies = {'http': proxy, 'https': proxy}
url = "https://api.example.com/graphql"
headers = {
'Content-Type': 'application/json',
'Authorization': 'Bearer YOUR_TOKEN',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'
}
try:
response = requests.post(
url,
json={'query': query},
headers=headers,
proxies=proxies,
timeout=30
)
response.raise_for_status()
return response.json()
except requests.exceptions.RequestException as e:
print(f"प्रॉक्सी {proxy} के साथ त्रुटि: {e}")
# अगली प्रॉक्सी पर स्विच करें
return make_graphql_request(query)
# उपयोग का उदाहरण
queries = [
'query { products(first: 10) { edges { node { id title } } } }',
'query { collections(first: 5) { edges { node { id title } } } }',
'query { shop { name email } }'
]
for query in queries:
result = make_graphql_request(query)
print(result)
time.sleep(1) # अनुरोधों के बीच विराम
त्रुटियों की निगरानी के साथ स्मार्ट रोटेशन
एक अधिक उन्नत संस्करण जो काम नहीं करने वाली प्रॉक्सी को ट्रैक करता है और उन्हें स्वचालित रूप से पूल से बाहर करता है:
import requests
import random
from collections import defaultdict
import time
class ProxyRotator:
def __init__(self, proxy_list, max_failures=3):
self.proxy_list = proxy_list.copy()
self.max_failures = max_failures
self.failures = defaultdict(int)
self.active_proxies = proxy_list.copy()
def get_proxy(self):
"""एक यादृच्छिक सक्रिय प्रॉक्सी प्राप्त करें"""
if not self.active_proxies:
raise Exception("सभी प्रॉक्सी अनुपलब्ध हैं!")
return random.choice(self.active_proxies)
def mark_failure(self, proxy):
"""एक असफल प्रयास को चिह्नित करें"""
self.failures[proxy] += 1
if self.failures[proxy] >= self.max_failures:
print(f"प्रॉक्सी {proxy} पूल से बाहर कर दी गई (त्रुटियों की सीमा पार हो गई)")
if proxy in self.active_proxies:
self.active_proxies.remove(proxy)
def mark_success(self, proxy):
"""सफलता पर त्रुटियों की गणना रीसेट करें"""
self.failures[proxy] = 0
# प्रारंभ करना
proxies = [
'http://user:pass@proxy1.example.com:8080',
'http://user:pass@proxy2.example.com:8080',
'http://user:pass@proxy3.example.com:8080',
]
rotator = ProxyRotator(proxies)
def graphql_request_with_retry(query, max_retries=3):
"""GraphQL अनुरोध स्वचालित पुनः प्रयास के साथ"""
for attempt in range(max_retries):
proxy = rotator.get_proxy()
proxies_dict = {'http': proxy, 'https': proxy}
try:
response = requests.post(
'https://api.example.com/graphql',
json={'query': query},
headers={
'Content-Type': 'application/json',
'Authorization': 'Bearer TOKEN',
'User-Agent': 'Mozilla/5.0'
},
proxies=proxies_dict,
timeout=30
)
response.raise_for_status()
# सफलता - त्रुटियों की गणना रीसेट करें
rotator.mark_success(proxy)
return response.json()
except Exception as e:
print(f"{proxy} के साथ प्रयास {attempt + 1}/{max_retries} असफल: {e}")
rotator.mark_failure(proxy)
time.sleep(2) # पुनः प्रयास से पहले विराम
raise Exception("सभी प्रयासों के बाद अनुरोध पूरा नहीं हुआ")
# उपयोग
query = 'query { products(first: 10) { edges { node { id title } } } }'
result = graphql_request_with_retry(query)
print(result)
GraphQL अनुरोधों के लिए हेडर और User-Agent सेट करना
सही HTTP हेडर GraphQL API के साथ प्रॉक्सी के माध्यम से सफलतापूर्वक काम करने के लिए महत्वपूर्ण हैं। कई API केवल IP की जांच नहीं करते हैं, बल्कि अनुरोध के हेडर भी देखते हैं।
GraphQL के लिए अनिवार्य हेडर
headers = {
# सामग्री का प्रकार - हमेशा GraphQL के लिए application/json
'Content-Type': 'application/json',
# प्रमाणीकरण (API पर निर्भर करता है)
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
# या
'X-Shopify-Storefront-Access-Token': 'token_here',
# User-Agent - वास्तविक ब्राउज़र की नकल करें
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
# Accept - हम JSON स्वीकार करते हैं
'Accept': 'application/json',
# Accept-Language - उपयोगकर्ता की भाषा
'Accept-Language': 'en-US,en;q=0.9',
# Accept-Encoding - संपीड़न का समर्थन
'Accept-Encoding': 'gzip, deflate, br',
# Referer - अनुरोध कहाँ से आया (वैकल्पिक)
'Referer': 'https://example.com/',
# Origin - CORS अनुरोधों के लिए
'Origin': 'https://example.com'
}
User-Agent का रोटेशन
अधिक गोपनीयता के लिए प्रॉक्सी के साथ User-Agent को रोटेट करना अनुशंसित है:
import random
USER_AGENTS = [
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:121.0) Gecko/20100101 Firefox/121.0',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.1 Safari/605.1.15'
]
def get_random_headers(token):
"""यादृच्छिक हेडर उत्पन्न करना"""
return {
'Content-Type': 'application/json',
'Authorization': f'Bearer {token}',
'User-Agent': random.choice(USER_AGENTS),
'Accept': 'application/json',
'Accept-Language': 'en-US,en;q=0.9',
'Accept-Encoding': 'gzip, deflate, br'
}
प्रॉक्सी के माध्यम से त्रुटियों को संभालना और पुनः प्रयास करना
प्रॉक्सी के साथ काम करते समय त्रुटियाँ अपरिहार्य हैं: टाइमआउट, अनुपलब्ध प्रॉक्सी, ब्लॉकिंग। इन स्थितियों को सही तरीके से संभालना और पुनः प्रयास करने की प्रक्रिया लागू करना महत्वपूर्ण है।
प्रॉक्सी के माध्यम से GraphQL की सामान्य त्रुटियाँ
- टाइमआउट - प्रॉक्सी धीमी या ओवरलोडेड है (timeout को 30-60 सेकंड तक बढ़ाएँ)
- HTTP 407 प्रॉक्सी प्रमाणीकरण आवश्यक है - प्रॉक्सी के लिए गलत लॉगिन/पासवर्ड
- HTTP 429 बहुत अधिक अनुरोध - रेट लिमिट पार हो गई (प्रॉक्सी का रोटेशन आवश्यक है)
- HTTP 403 निषिद्ध - प्रॉक्सी का IP ब्लॉक किया गया (प्रॉक्सी के प्रकार को रिहायशी में बदलें)
- कनेक्शन अस्वीकृत - प्रॉक्सी अनुपलब्ध है (पूल से बाहर करें)
उन्नत त्रुटि हैंडलिंग
import requests
import time
from requests.exceptions import ProxyError, Timeout, ConnectionError
def graphql_request_robust(query, proxy, max_retries=3, backoff=2):
"""
सभी प्रकार की त्रुटियों के साथ विश्वसनीय GraphQL अनुरोध
Args:
query: GraphQL अनुरोध
proxy: प्रॉक्सी का URL
max_retries: अधिकतम प्रयास
backoff: प्रयासों के बीच देरी का गुणांक
"""
url = "https://api.example.com/graphql"
headers = {
'Content-Type': 'application/json',
'Authorization': 'Bearer TOKEN',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'
}
proxies = {'http': proxy, 'https': proxy}
for attempt in range(max_retries):
try:
response = requests.post(
url,
json={'query': query},
headers=headers,
proxies=proxies,
timeout=30
)
# रेट लिमिटिंग की जांच
if response.status_code == 429:
retry_after = int(response.headers.get('Retry-After', 60))
print(f"रेट लिमिट! {retry_after} सेकंड का इंतजार कर रहे हैं...")
time.sleep(retry_after)
continue
# IP ब्लॉकिंग की जांच
if response.status_code == 403:
print(f"IP {proxy} ब्लॉक किया गया! एक और प्रॉक्सी की आवश्यकता है।")
raise Exception("IP ब्लॉक किया गया")
# प्रॉक्सी प्रमाणीकरण त्रुटियों की जांच
if response.status_code == 407:
print(f"प्रॉक्सी {proxy} के लिए प्रमाणीकरण त्रुटि")
raise Exception("प्रॉक्सी प्रमाणीकरण विफल")
response.raise_for_status()
# GraphQL त्रुटियों की जांच
data = response.json()
if 'errors' in data:
print(f"GraphQL त्रुटियाँ: {data['errors']}")
# कुछ त्रुटियों को पुनः प्रयास किया जा सकता है, कुछ नहीं
if is_retryable_graphql_error(data['errors']):
time.sleep(backoff * (attempt + 1))
continue
else:
raise Exception(f"GraphQL त्रुटि: {data['errors']}")
return data
except (ProxyError, ConnectionError) as e:
print(f"प्रयास {attempt + 1}: प्रॉक्सी अनुपलब्ध - {e}")
time.sleep(backoff * (attempt + 1))
except Timeout as e:
print(f"प्रयास {attempt + 1}: टाइमआउट - {e}")
time.sleep(backoff * (attempt + 1))
except requests.exceptions.HTTPError as e:
print(f"प्रयास {attempt + 1}: HTTP त्रुटि - {e}")
if attempt < max_retries - 1:
time.sleep(backoff * (attempt + 1))
else:
raise
raise Exception(f"सभी प्रयासों के बाद अनुरोध पूरा नहीं हुआ")
def is_retryable_graphql_error(errors):
"""GraphQL त्रुटि होने पर अनुरोध को पुनः प्रयास करने की अनुमति देता है"""
retryable_codes = ['THROTTLED', 'INTERNAL_ERROR', 'TIMEOUT']
for error in errors:
if error.get('extensions', {}).get('code') in retryable_codes:
return True
return False
प्रॉक्सी के माध्यम से GraphQL के साथ काम करने के सर्वोत्तम अभ्यास
GraphQL API के साथ प्रॉक्सी के माध्यम से प्रभावी ढंग से काम करने के लिए हम संक्षेप में सिफारिशें देंगे:
✓ अनुरोधों का अनुकूलन
- केवल आवश्यक फ़ील्ड का अनुरोध करें - GraphQL आपको यह स्पष्ट रूप से बताने की अनुमति देता है कि क्या चाहिए
- सभी डेटा को एक साथ अनुरोध करने के बजाय पेजिनेशन का उपयोग करें
- संबंधित अनुरोधों को एक में समूहित करें (GraphQL कई अनुरोधों का समर्थन करता है)
- अनुरोधों की संख्या कम करने के लिए क्लाइंट साइड पर परिणामों को कैश करें
✓ प्रॉक्सी प्रबंधन
- रोटेशन के लिए कम से कम 5-10 प्रॉक्सी का पूल उपयोग करें
- प्रॉक्सी की कार्यक्षमता की नियमित जांच करें (health check)
- काम नहीं करने वाली प्रॉक्सी को स्वचालित रूप से पूल से बाहर करें
- महत्वपूर्ण कार्यों के लिए अन्य प्रकार की बैकअप प्रॉक्सी रखें
✓ सीमाओं का पालन
- API दस्तावेज़ का अध्ययन करें - वहाँ सटीक सीमाएँ दी गई हैं
- अनुरोधों के बीच देरी जोड़ें (कम से कम 1-2 सेकंड)
- X-RateLimit-Remaining और X-RateLimit-Reset हेडर्स को ट्रैक करें
- 429 त्रुटि मिलने पर देरी को गुणात्मक रूप से बढ़ाएँ
✓ सुरक्षा और गोपनीयता
- हमेशा प्रमाणीकरण टोकन की सुरक्षा के लिए HTTPS प्रॉक्सी का उपयोग करें
- प्रॉक्सी के साथ User-Agent को रोटेट करें
- कोड में टोकन न रखें - पर्यावरण चर का उपयोग करें
- केवल न्यूनतम आवश्यक जानकारी लॉग करें
विशाल परियोजनाओं के लिए अनुशंसित आर्किटेक्चर
यदि आप बड़े डेटा वॉल्यूम के साथ काम कर रहे हैं, तो हम निम्नलिखित आर्किटेक्चर की सिफारिश करते हैं:
- कार्य सूची (Redis, RabbitMQ) - कार्यकर्ताओं के बीच अनुरोधों को वितरित करने के लिए
- कार्यकर्ताओं का पूल - प्रत्येक कार्यकर्ता अपनी प्रॉक्सी का उपयोग करता है
- प्रॉक्सी प्रबंधक - प्रॉक्सी की स्थिति को ट्रैक करता है और उन्हें कार्यकर्ताओं के बीच वितरित करता है
- डेटाबेस - परिणामों और कार्यों की स्थिति को संग्रहीत करने के लिए
- निगरानी - त्रुटियों, गति, प्रॉक्सी के उपयोग की निगरानी
निष्कर्ष
GraphQL API के साथ प्रॉक्सी के माध्यम से काम करना केवल अनुरोध में proxies पैरामीटर जोड़ने का मामला नहीं है। विश्वसनीय और प्रभावी काम करने के लिए, प्रॉक्सी का रोटेशन, त्रुटियों की सही हैंडलिंग, हेडर सेट करना और API सीमाओं का पालन करना आवश्यक है। हमने Python और Node.js पर व्यावहारिक उदाहरणों पर चर्चा की, जिन्हें आप अपने प्रोजेक्ट्स में तुरंत उपयोग कर सकते हैं।
मुख्य निष्कर्ष: सुरक्षित API (Shopify, Facebook) के लिए रिहायशी प्रॉक्सी का उपयोग करें, सार्वजनिक API और बड़े पैमाने पर पार्सिंग के लिए डेटा सेंटर का उपयोग करें, काम नहीं करने वाली प्रॉक्सी को बाहर करने के लिए स्वचालित रोटेशन लागू करें, देरी जोड़ें और सभी प्रकार की त्रुटियों को संभालें। यह किसी भी GraphQL API के साथ बिना ब्लॉकिंग के स्थिरता से काम करने की अनुमति देगा।
यदि आप प्रोडक्शन में GraphQL API के साथ काम करने की योजना बना रहे हैं, तो हम रिहायशी प्रॉक्सी का उपयोग करने की सिफारिश करते हैं - ये अधिकतम स्थिरता और न्यूनतम ब्लॉकिंग जोखिम प्रदान करते हैं। परीक्षण और विकास के लिए डेटा सेंटर प्रॉक्सी उपयुक्त हैं - ये तेज और सस्ते हैं।