वेब स्क्रैपिंग वेबसाइटों से प्रोग्रामेटिक रूप से डेटा निकालता है – अनुसंधान, मूल्य निगरानी, डेटा एकत्रीकरण और स्वचालन के लिए उपयोगी। यह मार्गदर्शिका आपको परेशानी से दूर रखने वाली कानूनी और नैतिक प्रथाओं को कवर करते हुए, सरल स्थिर पृष्ठों से लेकर गतिशील जावास्क्रिप्ट साइटों तक, पायथन में स्क्रैपर्स बनाती है।
📋 Table of Contents
सबसे पहले जिम्मेदारीपूर्वक स्क्रैप करें
किसी भी स्क्रैपर को लिखने से पहले नियमों को समझें:
- robots.txt जांचें:
example.com/robots.txtआपको बताता है कि क्या क्रॉल करने की अनुमति है - सेवा की शर्तें पढ़ें: कुछ साइटें स्पष्ट रूप से स्क्रैपिंग को प्रतिबंधित करती हैं
- सम्मान दर सीमा: सर्वर पर दबाव न डालें – अनुरोधों के बीच विलंब जोड़ें
- उपलब्ध होने पर आधिकारिक एपीआई का उपयोग करें: स्क्रैपिंग के बजाय हमेशा एपीआई को प्राथमिकता दें
- व्यक्तिगत डेटा को नष्ट न करें कानूनी आधार के बिना (जीडीपीआर और समान कानून लागू होते हैं)
- स्वयं को पहचानें: एक उचित उपयोगकर्ता-एजेंट सेट करें, अपने बॉट को दुर्भावनापूर्ण ढंग से न छिपाएं
सेटअप
pip install requests beautifulsoup4 lxml
# For JavaScript-heavy sites:
pip install playwright
playwright install chromium
अनुरोधों के साथ स्टेटिक पेजों को स्क्रैप करना + ब्यूटीफुलसूप
import requests
from bs4 import BeautifulSoup
import time
def scrape_articles(url):
headers = {
'User-Agent': 'Mozilla/5.0 (compatible; MyResearchBot/1.0)'
}
response = requests.get(url, headers=headers, timeout=10)
response.raise_for_status()
soup = BeautifulSoup(response.text, 'lxml')
articles = []
for article in soup.select('article.post'):
title = article.select_one('h2.title')
link = article.select_one('a')
articles.append({
'title': title.get_text(strip=True) if title else None,
'url': link['href'] if link else None,
})
return articles
data = scrape_articles('https://example.com/blog')
for item in data:
print(item)
तत्वों का सटीक चयन
soup = BeautifulSoup(html, 'lxml')
# By tag
soup.find('h1') # first h1
soup.find_all('p') # all paragraphs
# By CSS selector (most flexible)
soup.select('div.card > h2') # h2 inside div.card
soup.select_one('#main .price') # first .price inside #main
# Extract data
element.get_text(strip=True) # text content
element['href'] # attribute value
element.get('data-id', 'default') # attribute with fallback
# Navigate
element.parent # parent element
element.find_next_sibling('div') # next sibling
नाटककार के साथ गतिशील (जावास्क्रिप्ट) साइटों को स्क्रैप करना
कई आधुनिक साइटें जावास्क्रिप्ट के साथ सामग्री प्रस्तुत करती हैं – अनुरोध इसे नहीं देखेंगे। नाटककार एक वास्तविक ब्राउज़र चलाता है:
from playwright.sync_api import sync_playwright
def scrape_dynamic(url):
with sync_playwright() as p:
browser = p.chromium.launch(headless=True)
page = browser.new_page(user_agent='Mozilla/5.0 (MyBot/1.0)')
page.goto(url, wait_until='networkidle')
# Wait for content to load
page.wait_for_selector('.product-card')
# Extract data from the rendered page
products = page.eval_on_selector_all('.product-card', '''
cards => cards.map(card => ({
name: card.querySelector('.name')?.innerText,
price: card.querySelector('.price')?.innerText,
}))
''')
browser.close()
return products
results = scrape_dynamic('https://example.com/products')
दर सीमित और विनम्रता
import time
import random
def polite_scrape(urls):
results = []
for url in urls:
try:
data = scrape_page(url)
results.append(data)
except requests.RequestException as e:
print(f"Failed {url}: {e}")
# Random delay between requests (1-3 seconds) - be gentle
time.sleep(random.uniform(1, 3))
return results
# Respect Retry-After on 429 responses
response = requests.get(url)
if response.status_code == 429:
retry_after = int(response.headers.get('Retry-After', 60))
time.sleep(retry_after)
पेजिनेशन को संभालना
def scrape_all_pages(base_url):
all_data = []
page = 1
while True:
url = f"{base_url}?page={page}"
response = requests.get(url, headers=HEADERS, timeout=10)
soup = BeautifulSoup(response.text, 'lxml')
items = soup.select('.item')
if not items:
break # no more items - stop
all_data.extend(extract_items(items))
# Check for a "next" link, or just increment
if not soup.select_one('a.next-page'):
break
page += 1
time.sleep(random.uniform(1, 2))
return all_data
स्क्रैप किए गए डेटा को सहेजना
import csv
import json
# To CSV
with open('data.csv', 'w', newline='') as f:
writer = csv.DictWriter(f, fieldnames=['title', 'url', 'price'])
writer.writeheader()
writer.writerows(data)
# To JSON
with open('data.json', 'w') as f:
json.dump(data, f, indent=2, ensure_ascii=False)
# To a database (SQLite example)
import sqlite3
conn = sqlite3.connect('scraped.db')
conn.executemany(
"INSERT INTO products (name, price) VALUES (?, ?)",
[(d['name'], d['price']) for d in data]
)
conn.commit()
अक्सर पूछे जाने वाले प्रश्न
प्रश्न: क्या वेब स्क्रैपिंग कानूनी है?
उत्तर: यह निर्भर करता है. सार्वजनिक रूप से उपलब्ध डेटा को स्क्रैप करना अक्सर कानूनी होता है, लेकिन सेवा की शर्तों का उल्लंघन करना, बिना आधार के व्यक्तिगत डेटा को स्क्रैप करना, या एक्सेस नियंत्रण को दरकिनार करना गैरकानूनी हो सकता है। robots.txt और ToS की जाँच करें, आधिकारिक API को प्राथमिकता दें, और व्यावसायिक स्क्रैपिंग के लिए कानूनी सलाह लें।
प्रश्न: अनुरोध/ब्यूटीफुलसूप या नाटककार?
उ: स्थिर HTML पृष्ठों (तेज़, हल्के) के लिए अनुरोध + ब्यूटीफुल सूप का उपयोग करें। जावास्क्रिप्ट-रेंडर साइटों के लिए प्लेराइट (या सेलेनियम) का उपयोग करें जहां सामग्री गतिशील रूप से लोड होती है। पहले जांचें कि क्या डेटा प्रारंभिक HTML में है – यदि हां, तो आपको ब्राउज़र की आवश्यकता नहीं है।
प्रश्न: मैं अवरुद्ध होने से कैसे बचूँ?
उ: विनम्रता से परिमार्जन करें – दर सीमाओं का सम्मान करें, देरी जोड़ें, एक उचित उपयोगकर्ता-एजेंट सेट करें, और सर्वर पर अधिभार न डालें। रुकावटों से बचने का सबसे अच्छा तरीका है दुर्व्यवहार न करना। आक्रामक स्क्रैपिंग अवरुद्ध हो जाती है (और अवैध हो सकती है)।
प्रश्न: क्या मुझे स्क्रैपिंग के बजाय एपीआई का उपयोग करना चाहिए?
उत्तर: हमेशा, यदि कोई अस्तित्व में है। एपीआई अधिक विश्वसनीय, कानूनी, संरचित हैं और साइट का HTML बदलने पर टूटते नहीं हैं। जब कोई एपीआई आपको आवश्यक डेटा प्रदान नहीं करता है तो स्क्रैपिंग एक अंतिम उपाय है।
प्रश्न: मैं उन साइटों को कैसे संभालूं जिनके लिए लॉगिन की आवश्यकता है?
उ: नाटककार एक सत्र बनाए रखते हुए लॉगिन को स्वचालित कर सकता है (फॉर्म भरें, सबमिट करें)। लेकिन लॉगिन के पीछे स्क्रैप करना अक्सर सेवा की शर्तों का उल्लंघन करता है – वैधता के बारे में विशेष रूप से सावधान रहें और केवल उस डेटा को स्क्रैप करें जिसे आप एक्सेस करने के लिए अधिकृत हैं।
निष्कर्ष
डेटा संग्रह के लिए पायथन के साथ वेब स्क्रैपिंग शक्तिशाली है, लेकिन इसे जिम्मेदारी से करें।का प्रयोग करें स्थिर पृष्ठों के लिए अनुरोध + ब्यूटीफुल सूप और जावास्क्रिप्ट-प्रदत्त साइटों के लिए नाटककार, सीएसएस चयनकर्ताओं के साथ तत्वों का चयन करें, पेजिनेशन संभालें, और सीएसवी/जेएसओएन/डेटाबेस में सहेजें। सबसे महत्वपूर्ण:robots.txt और सेवा की शर्तों की जांच करें, देरी के साथ दर सीमा का सम्मान करें, आधिकारिक एपीआई को प्राथमिकता दें, और कानूनी आधार के बिना व्यक्तिगत डेटा को स्क्रैप न करें. नैतिक, विनम्र स्क्रैपिंग आपको आवश्यक डेटा प्राप्त करते समय कानूनी और तकनीकी परेशानी से दूर रखती है। जब कोई एपीआई मौजूद हो, तो हमेशा इसके बजाय इसका उपयोग करें – स्क्रैपिंग फ़ॉलबैक है, पहली पसंद नहीं।
🔗 Share this article
✍️ Leave a Comment