सेलेनियम वेब स्क्रैपिंग: एक व्यावहारिक पायथन गाइड
Lead Scraping Automation Engineer
TL;DR:
- सेलेनियम एक असली क्रोम को वेबड्राइवर प्रोटोकॉल के माध्यम से नियंत्रित करता है, इसलिए यह DOM को देखता है जो एक पृष्ठ जावास्क्रिप्ट के साथ बनाता है - वह सामग्री जो एक साधारण HTTP अनुरोध कभी नहीं प्राप्त करता।
- नीचे एक लाइव रन एक डेमो पृष्ठ से सभी दस उद्धरणों को पढ़ता है जो एक खाली कंटेनर भेजता है और इसे क्लाइंट-साइड भरता है; वही पृष्ठ एक नग्न
requests.getके लिए शून्य पंक्तियाँ लौटाता है। - आधुनिक सेलेनियम अपना खुद का ड्राइवर हल करता है: सेलेनियम प्रबंधक आपके इंस्टॉल किए गए क्रोम के लिए क्रोमड्राइवर को मिलाता है, इसलिए
webdriver.Chrome(options=...)बिना मैनुअल डाउनलोड के काम करता है। - सेलेनियम की असली कीमत परिचालन है - हर कार्यकर्ता एक पूर्ण ब्राउज़र है जो आपकी खुद की आईपी से बाहर निकलता है, जो स्केल करने के लिए भारी और एंटी-बॉट सिस्टम के लिए दर सीमा निर्धारित करने के लिए सरल होता है।
- ईमानदार-सीमाएं स्थानीय यूआरएल को स्क्रैपलेस यूनिवर्सल स्क्रैपिंग एपीआई के लिए भेजता है, जो पृष्ठ को सर्वर-साइड रेंडर करता है और पूरा एचटीएमएल लौटाता है, बिना आपको किसी ब्राउज़र को चलाने या स्केल करने की आवश्यकता के।
- नि:शुल्क योजना पर एक स्क्रैपलेस एपीआई कुंजी प्राप्त करें और दोनों आधियों को स्वयं चलाएँ।
स्क्रैपिंग के लिए सेलेनियम क्या करता है
सेलेनियम एक असली ब्राउज़र को स्वचालित करता है। आपका पायथन कोड वेबड्राइवर प्रोटोकॉल को क्रोमड्राइवर से बोलता है, क्रोमड्राइवर क्रोम को नियंत्रित करता है, और क्रोम वही करता है जो एक ब्राउज़र करता है: यह पृष्ठ को अनुरोध करता है, स्क्रिप्ट को चलाता है, और DOM बनाता है। वही कारण है कि स्क्रैपर्स इसके लिए देखते हैं। एक पृष्ठ जो अपने सामग्री को क्लाइंट में असेंबल करता है - एक फ्रेमवर्क द्वारा रेंडर किया गया उत्पाद ग्रिड, एक फीड जो बैकग्राउंड अनुरोध के माध्यम से आता है - कच्चे एचटीएमएल में खाली होता है और केवल स्क्रिप्ट चलने के बाद पूरा होता है। सेलेनियम उस निष्पादन की प्रतीक्षा करता है और आपको पूरा पृष्ठ देता है।
विपरीत यह वजन है। सेलेनियम प्रति सत्र एक वास्तविक क्रोम चलाता है, जो मेमोरी और स्टार्टअप समय की लागत है, और अनुरोध आपकी मशीन के आईपी से बाहर जाता है। कुछ पृष्ठों के लिए यह ठीक है। यह मार्गदर्शिका पहले कार्यशील सेलेनियम स्क्रैपर का निर्माण करती है, फिर दिखाती है कि जब अपने ब्राउज़रों को चलाना भुगतान बंद करता है और इसके बारे में क्या करना है। यहां हर कोड पथ लाइव पृष्ठ के खिलाफ निष्पादित हुआ।
इंस्टॉल करें
सेलेनियम पायथन बाइंडिंग्स स्थापित करें:
bash
pip install selenium
आप मैन्युअल रूप से क्रोमड्राइवर स्थापित नहीं करते हैं। संस्करण 4.6 से, सेलेनियम सेलेनियम वेबड्राइवर उपकरण को सेलेनियम प्रबंधक के साथ भेजता है, जो आपके क्रोम को पहचानता है और पहले उपयोग पर मिलान ड्राइवर को हल करता है। आपको हालिया गूगल क्रोम स्थापित करने की आवश्यकता है; बाइंडिंग बाकी का ध्यान रखती है।
कॉन्फ़िगर करें
इस मार्गदर्शिका में बाद में पिवट के लिए, अपने स्क्रैपलेस एपीआई कुंजी को पर्यावरण में रखें ताकि यह कभी स्रोत में न पहुंचे:
bash
export SCRAPELESS_API_KEY="your_scrapeless_api_key"
बुनियादी कार्यान्वयन: एक जावास्क्रिप्ट पृष्ठ रेंडर करें
सेलेनियम को एक ऐसे पृष्ठ पर निर्देशित करें जो अपने पंक्तियों को क्लाइंट में बनाता है, और नेविगेशन लौटने के बाद तत्व वहाँ होते हैं। नीचे का डेमो एक खाली कंटेनर भेजता है और इसे जावास्क्रिप्ट के साथ जनित करता है; कच्चा मार्कअप कोई .quote नोड नहीं ले जाता, जबकि ब्राउज़र-रेंडर किया गया DOM दस नोड्स ले जाता है क्योंकि क्रोम ने पहले स्क्रिप्ट चलाया, एचटीएमएल पार्सिंग और स्क्रिप्टिंग मॉडल का पालन करते हुए।
python
import tempfile
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
opts = Options()
opts.add_argument("--headless=new")
opts.add_argument("--no-sandbox")
opts.add_argument("--disable-dev-shm-usage")
opts.add_argument(f"--user-data-dir={tempfile.mkdtemp()}")
driver = webdriver.Chrome(options=opts) # सेलेनियम प्रबंधक ड्राइवर को हल करता है
try:
driver.get("https://quotes.toscrape.com/js/")
quotes = driver.find_elements(By.CSS_SELECTOR, ".quote")
print("जावास्क्रिप्ट पृष्ठ पर उद्धरण ब्लॉक:", len(quotes))
print("पहला लेखक:", quotes[0].find_element(By.CSS_SELECTOR, ".author").text)
finally:
driver.quit()
रन गिनती और पहले रिकॉर्ड को प्रिंट करता है:
text
जावास्क्रिप्ट पृष्ठ पर उद्धरण ब्लॉक: 10
पहला लेखक: अल्बर्ट आइंस्टीन
--headless=new फ्लैग क्रोम को बिना किसी दृश्य विंडो के चलाता है, जो आपको सर्वर पर चाहिए। --no-sandbox और --disable-dev-shm-usage क्रोम को कंटेनरों और सीमित वातावरण के भीतर स्थिर रखते हैं, और फेंकने योग्य --user-data-dir प्रत्येक रन को अपना खुद का प्रोफ़ाइल देता है ताकि समानांतर सत्र टकरा न सकें।
उन्नत पैटर्न: प्रतीक्षा और चयन
driver.get तब लौटता है जब दस्तावेज़ लोड होता है, लेकिन एक स्क्रिप्ट-निर्मित तत्व एक पल बाद प्रकट हो सकता है। एक फिक्स्ड अंतराल के लिए सोने के बजाय, विशिष्ट स्थिति का इंतजार करें। WebDriverWait को expected_conditions के साथ जोड़कर उस तत्व के उपस्थित होने तक रोका जाता है जिसे आप नामित करते हैं, ताकि स्क्रैप तुरंत उस क्षण शुरू हो जब डेटा मौजूद होता है और पहले नहीं:
python
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.CSS_SELECTOR, ".quote"))
)
स्थिर सेलेक्टर्स को हैश किए गए CSS वर्गों पर पसंद करें: एक id, एक data-* विशेषता, या एक सामर्थ्य टैग एक नए डिज़ाइन में जीवित रहता है जो स्टाइलिंग कक्षाओं का नाम बदलता है। एक पृष्ठ जिसका आप पृष्ठीकरण करते हैं, "अगला" लिंक का href पढ़ें और इसे फॉलो करें बजाय पृष्ठ संख्या का अनुमान लगाने के।
मुफ्त योजना पर अपना API कुंजी प्राप्त करें: app.scrapeless.com
ईमानदार सीमा और धुरी
Selenium जावास्क्रिप्ट को अच्छी तरह से रेंडर करता है; जो यह नहीं करता है वह ब्रोउज़र चलाने को सस्ता बनाना या आपके ट्रैफ़िक को अलग दिखने से रोकना है। प्रत्येक Selenium श्रमिक एक पूर्ण Chrome है, इसलिए कई पृष्ठों के लिए स्केलिंग का मतलब ब्रोउज़र और उनकी आवश्यकता वाली मेमोरी का स्केलिंग है, और प्रत्येक अनुरोध आपके अपने IP से निकलता है, जिसे एक व्यस्त साइट दर सीमा तय कर सकती है या चुनौती दे सकती है। Selenium के पास एक प्रबंधित एंटी-बॉट चुनौती का कोई इन-बिल्ट उत्तर नहीं है - यह उस पृष्ठ को रेंडर करता है जिसे उसे दिया गया है, और एक पृष्ठ जिसे वह कभी नहीं पहुँचता है वह कुछ के रूप में रेंडर होता है।
Scrapeless Universal Scraping API आपके मशीन से उस परिचालन आधे को हटा देता है। आप इसे js_render सक्षम URL भेजते हैं; यह प्रबंधित एंटी-बॉट हैंडलिंग और घूर्णन आवासीय निकासी के पीछे सर्वर-साइड में पृष्ठ को रेंडर करता है, और इसके data फ़ील्ड में समाप्त HTML को लौटाता है। आपके लिए कोई ब्राउज़र लॉन्च करने की आवश्यकता नहीं है, और अनुरोध आपके IP से नहीं आता है। आप लौटाए गए HTML का विश्लेषण बिल्कुल ऐसे ही करते हैं जैसे आप Selenium के पृष्ठ स्रोत का विश्लेषण करते हैं:
python
import os, re, json, requests
resp = requests.post(
"https://api.scrapeless.com/api/v2/unlocker/request",
headers={"x-api-token": os.environ["SCRAPELESS_API_KEY"], "Content-Type": "application/json"},
json={"actor": "unlocker.webunlocker", "input": {"url": "https://quotes.toscrape.com/js/", "js_render": True}},
timeout=120,
)
resp.raise_for_status()
html = resp.json()["data"]
authors = re.findall(r'<small class="author">(.*?)</small>', html)
print("यूनिवर्सल स्क्रैपिंग एपीआई के माध्यम से रेंडर किए गए उद्धरण ब्लॉक्स:", html.count('class="quote"'))
print("निकाले गए लेखक:", len(authors))
print("पहला लेखक:", authors[0])
एकल अनुरोध उसी रेंडर किए गए पृष्ठ को सर्वर-साइड लौटाता है:
text
यूनिवर्सल स्क्रैपिंग एपीआई के माध्यम से रेंडर किए गए उद्धरण ब्लॉक्स: 10
निकाले गए लेखक: 10
पहला लेखक: अल्बर्ट आइंस्टाइन
अथक नियम: जब आप लक्ष्य को नियंत्रित करते हैं और मात्रा छोटी होती है, तो Selenium को रखें, और जब काम परिचालन होता है - कई पृष्ठ, अवरुद्ध IP, या एक चुनौती जो Selenium очищ नहीं कर सकता, तो API पर फ़ेच करें। विश्लेषण कोड नहीं बदलता; केवल HTML का स्रोत बदलता है।
समस्या निवारण
एक ड्राइवर-संस्करण त्रुटि लगभग हमेशा इसका मतलब है कि Chrome अपडेट हुआ है और एक पुराना ड्राइवर बना रहा; Selenium 4.6 और नए पर, Selenium प्रबंधक आपके लिए वर्तमान ड्राइवर हल करता है, इसलिए आपके PATH से एक हाथ-पिन किए गए ChromeDriver को हटाना सामान्यतः इसे साफ करता है। एक पृष्ठ पर एक खाली परिणाम जिसे आप सामान्य ब्राउज़र में देख सकते हैं का मतलब है कि सामग्री driver.get लौटने के बाद आई — आपको आवश्यक सेलेक्टर के लिए WebDriverWait ऊपर जोड़ें। एक रन जो उस पृष्ठ पर लटका रहता है जो कभी नेटवर्क-खामोश नहीं होता इसका मतलब है कि आपने गलत स्थिति पर इंतज़ार किया; तत्व का इंतज़ार करें, न कि नेटवर्क का।
किसी साइट की बताई गई सीमाओं के भीतर कार्य करें। इसके शर्तों को पढ़ें और इसके रोबोट्स बहिष्करण प्रोटोकॉल फ़ाइल, केवल सार्वजनिक पृष्ठों का अनुरोध करें, और समवर्तीता का आक्रमण किया — वही अनुशासन जो एक गाइड में कवर किया गया है दस्तावेज़ वस्तु मॉडल जो Selenium पढ़ता है। खोज और निष्कर्षण के लिए व्यापक दौरे के लिए, शून्य से वेब स्क्रैपर बनाने पर वाकथन इस एक के साथ अच्छी तरह से मेल खाता है।
निष्कर्ष
Selenium अपनी जगह तब कमाता है जब एक पृष्ठ को अस्तित्व में रहने के लिए एक वास्तविक ब्रोउज़र की आवश्यकता होती है: यह वेबड्राइवर प्रोटोकॉल के माध्यम से Chrome को चालित करता है, स्क्रिप्ट चलाता है, और आपको रेंडर किया गया DOM प्रदान करता है - एक पृष्ठ से दस उद्धरण जो अपने मार्कअप में कोई भी नहीं भेजता। जहां यह उन ब्रोउज़र के चारों ओर काम करने के लिए भुगतान करना बंद कर देता है: सत्रों के स्केलिंग की मेमोरी, अपने IP के उजागर होने पर, और चुनौतियाँ जिन्हें यह नहीं साफ कर सकता। उस बिंदु पर वही URL Scrapeless Universal Scraping API के माध्यम से रेंडर किए गए HTML के साथ लौटता है जिसमें कोई ब्राउज़र नहीं होता, और आपका विश्लेषण वही रहता है। आप स्केलिंग से पहले आवश्यक अनुरोध की मात्रा की जांच करें मूल्य निर्धारण पृष्ठ के खिलाफ।
हमारे समुदाय में शामिल हों ताकि एक मुफ्त योजना का दावा कर सकें और अन्य डेवलपर्स के साथ नोट्स की तुलना कर सकें जो स्क्रैपर्स बना रहे हैं: Discord · Telegram।
सामान्य प्रश्न
प्रश्न: क्या मुझे Selenium का उपयोग करने के लिए ChromeDriver डाउनलोड करना आवश्यक है?
नहीं। Selenium 4.6 और नए संस्करणों में Selenium प्रबंधक शामिल है, जो आपके स्थापित Chrome का पता लगाता है और पहले उपयोग पर मेल खाने वाले ChromeDriver का समाधान करता है, इसलिए webdriver.Chrome(options=...) मैन्युअल ड्राइवर डाउनलोड के बिना काम करता है।
प्रश्न: Selenium उन तत्वों को क्यों खोजता है जिन्हें requests नहीं कर सकता?
Selenium एक वास्तविक ब्राउज़र चलाता है जो पृष्ठ के JavaScript को निष्पादित करता है और DOM बनाता है, इसलिए स्क्रिप्ट द्वारा निर्मित तत्व उस समय मौजूद होते हैं जब आप उन्हें क्वेरी करते हैं। एक सामान्य HTTP क्लाइंट केवल सर्वर की प्रारंभिक मार्कअप प्राप्त करता है, जिसमें क्लाइंट-संवर्धित पृष्ठ पर उस सामग्री का कोई हिस्सा नहीं होता।
प्रश्न: मुझे Selenium से यूनिवर्सल स्क्रैपिंग API पर कब स्विच करना चाहिए?
जब कठिनाई परिचालन हो बजाय कि रेंडरिंग — कई पृष्ठों को प्राप्त करना, आपका आईपी रेट-सीमित होना, या प्रबंधित एंटी-बॉट चुनौती जो Selenium पार नहीं कर सकता। API सर्वर-साइड पर रेंडर करता है और तैयार HTML लौटाता है, इसलिए आप अपनी पार्सिंग को रखते हैं और ब्राउज़र बेड़े को छोड़ देते हैं।
प्रश्न: मैं उस सामग्री के लिए कैसे रुकूं जो पृष्ठ के बाद लोड होती है?
विशिष्ट चयनकर्ता के मौजूद होने तक अवरुद्ध करने के लिए expected_conditions के साथ WebDriverWait का उपयोग करें, न कि एक निश्चित time.sleep। स्क्रैप तब तब शुरू होता है जब तत्व मौजूद होता है, जो एक अनुमानित विलंब की तुलना में और भी तेज और अधिक विश्वसनीय है।
प्रश्न: क्या Selenium के साथ स्क्रैपिंग कानूनी है?
जनता के डेटा को स्क्रैप करना सामान्यतः अनुमति है, लेकिन जिम्मेदारी आपकी है: साइट की शर्तों और इसके रोबोट निर्देशों का सम्मान करें, केवल सार्वजनिक पृष्ठ एकत्र करें, व्यक्तिगत डेटा से बचें जिसके लिए आपके पास स्नैप करने का कोई आधार नहीं है, और अनुरोध दरों को संयमित रखें।
स्क्रैपलेस में, हम केवल सार्वजनिक रूप से उपलब्ध डेटा का उपयोग करते हैं, जबकि लागू कानूनों, विनियमों और वेबसाइट गोपनीयता नीतियों का सख्ती से अनुपालन करते हैं। इस ब्लॉग में सामग्री केवल प्रदर्शन उद्देश्यों के लिए है और इसमें कोई अवैध या उल्लंघन करने वाली गतिविधियों को शामिल नहीं किया गया है। हम इस ब्लॉग या तृतीय-पक्ष लिंक से जानकारी के उपयोग के लिए सभी देयता को कोई गारंटी नहीं देते हैं और सभी देयता का खुलासा करते हैं। किसी भी स्क्रैपिंग गतिविधियों में संलग्न होने से पहले, अपने कानूनी सलाहकार से परामर्श करें और लक्ष्य वेबसाइट की सेवा की शर्तों की समीक्षा करें या आवश्यक अनुमतियाँ प्राप्त करें।



