BeautifulSoup वेब स्क्रैपिंग: स्थिर HTML से डायनैमिक पृष्ठों तक
Expert in Web Scraping Technologies
TL;DR:
- BeautifulSoup HTML को पार्स करता है; यह JavaScript को निष्पादित नहीं करता। प्रतिक्रिया शरीर में पहले से ही वे रिकॉर्ड होने चाहिए जो आप चयनित करना चाहते हैं।
- Requests और BeautifulSoup स्थिर पृष्ठों के लिए सबसे छोटा रास्ता है। एक Python प्रक्रिया में फेच करें, मान्य करें, पार्स करें, सामान्यीकृत करें, और निर्यात करें।
- CSS चयनकर्ता घनी कार्डों के लिए प्रायोगिक होते हैं। क्षेत्र चयनकर्ताओं को प्रत्येक रिकॉर्ड के अंदर स्कोप करें ताकि मान पंक्तियों के बीच न भटकें।
- गतिशील पृष्ठों को अलग अधिग्रहण पथ की आवश्यकता होती है। पहले एक आंतरिक JSON एंडपॉइंट के लिए जांचें, फिर जब ब्राउज़र निष्पादन की आवश्यकता हो तो रेंडर किए गए HTML का उपयोग करें।
- BeautifulSoup रेंडरिंग के बाद भी उपयोगी रहता है। यूनिवर्सल स्क्रैपिंग API HTML वापस कर सकता है जबकि BeautifulSoup पार्सिंग और JSON आउटपुट का स्वामित्व बनाए रखता है।
BeautifulSoup वेब स्क्रैपिंग तब सबसे अच्छा काम करता है जब पृष्ठ अधिग्रहण और HTML पार्सिंग को अलग नौकरियों के रूप में देखा जाता है। Requests एक प्रतिनिधित्व प्राप्त करता है। BeautifulSoup उस प्रतिनिधित्व को एक नेविगेबल ट्री में बदल देता है। कोई भी ऑपरेशन यह证明 नहीं करता कि JavaScript-निर्भर सामग्री प्रकट हुई है।
यह ट्यूटोरियल एक स्थिर स्क्रैपर बनाता है, सीमित pagination जोड़ता है, JavaScript पृष्ठ पर खाली-शेल समस्या का प्रदर्शन करता है, और प्रबंधित रेंडरिंग चरण के बाद वही BeautifulSoup पार्सर बनाए रखता है।
स्थिर HTTP, आंतरिक JSON, या रेंडर किए गए HTML?
चुने गए अधिग्रहण पथ को पहले चयनकर्ताओं को लिखने से पहले चुनें।
| पृष्ठ का व्यवहार | सर्वश्रेष्ठ पहला पथ | BeautifulSoup की भूमिका |
|---|---|---|
| रिकॉर्ड प्रारंभिक HTML में मौजूद हैं | Requests | सीधे प्रतिक्रिया को पार्स करें |
| पृष्ठ सार्वजनिक JSON अनुरोध से रिकॉर्ड लोड करता है | उस स्थिर एंडपॉइंट के लिए Requests | केवल आवश्यकता होने पर एम्बेडेड HTML फ़ील्ड पार्स करें |
| आवश्यक सामग्री JavaScript के बाद प्रकट होती है | प्रबंधित रेंडर या ब्राउज़र | वापस किए गए रेंडर किए गए HTML को पार्स करें |
| कार्यप्रवाह को क्लिक, फ़ॉर्म, या सत्र कार्यों की आवश्यकता है | ब्राउज़र स्वचालन | स्नैपशॉट या अंतिम HTML पार्स करें |
स्रोत देखें या Responses प्रतिक्रिया का निरीक्षण करें, न कि केवल ब्राउज़र के तत्वों के पैनल को। ब्राउज़र पोस्ट-JavaScript DOM दिखाता है; Requests सर्वर की प्रतिक्रिया देखता है।
पूर्वापेक्षाएँ
आपको Python, एक वर्चुअल वातावरण, और सार्वजनिक लक्षित पृष्ठों तक पहुँचने की अनुमति की आवश्यकता है। कार्यशील उदाहरणों का उपयोग requests और beautifulsoup4 के साथ Python के अंतर्निहित HTML पार्सर के साथ किया गया है।
Beautiful Soup डॉक्यूमेंटेशन पार्सर चयन और CSS चयनकर्ताओं को कवर करता है। Requests क्विकस्टार्ट प्रतिक्रिया हैंडलिंग और स्थिति की जांचों का विवरण देता है।
BeautifulSoup और Requests स्थापित करें
एक अलग वातावरण बनाएं और उस स्क्रिप्ट द्वारा आयात किए गए सटीक पैकेज स्थापित करें:
bash
python3 -m venv .venv
. .venv/bin/activate
python -m pip install beautifulsoup4 requests
नेटवर्क कोड जोड़ने से पहले सुनिश्चित करें कि आयात हल होते हैं:
bash
python -c "import bs4, requests; print(bs4.__version__, requests.__version__)"
एक स्थिर HTML पृष्ठ स्क्रैप करें
सार्वजनिक Quotes to Scrape स्थिर पृष्ठ हर उद्धरण कार्ड को प्रतिक्रिया HTML में रखता है। पार्सर प्रत्येक .quote रिकॉर्ड के भीतर पाठ, लेखक, और टैग का स्कोप रखता है।
python
import json
from urllib.parse import urljoin
import requests
from bs4 import BeautifulSoup
url = "https://quotes.toscrape.com/page/1/"
response = requests.get(url, timeout=30)
response.raise_for_status()
soup = BeautifulSoup(response.text, "html.parser")
records = []
for card in soup.select(".quote"):
records.append({
"text": card.select_one(".text").get_text(strip=True),
"author": card.select_one(".author").get_text(strip=True),
"tags": [tag.get_text(strip=True) for tag in card.select(".tag")],
"source_url": response.url,
})
next_link = soup.select_one("li.next a")
next_url = urljoin(response.url, next_link["href"]) if next_link else None
print(json.dumps({
"count": len(records),
"first": records[0],
"next_url": next_url,
}, indent=2))
पार्सर तीन उपयोगी चीजें करता है: यह पहले पूर्ण कार्ड का चयन करता है, कार्ड स्कोप के अंदर हर फ़ील्ड को बनाए रखता है, और स्रोत URL को संरक्षित करता है। वह स्रोत URL बाद के चयनकर्ता या पृष्ठनंबर समस्याओं को पुनरुत्पादित योग्य बनाता है।
find_all बनाम CSS चयनकर्ता
BeautifulSoup विधि-आधारित खोज और CSS चयन दोनों प्रदान करता है।
find()नाम या विशेषताओं द्वारा पहले मेल खाते टैग को लौटाता है।find_all()सभी मेल खाते टैग को लौटाता है।select_one()पहले CSS चयनकर्ता मेल को लौटाता है।select()सभी CSS चयनकर्ता मेल को लौटाता है।
CSS चयनकर्ता घनी कार्ड लेआउट के लिए संक्षिप्त होते हैं। एक टैग और एक विशेषता के मेल खाते में विधि-आधारित खोज अधिक स्पष्ट हो सकती है। एक परियोजना के लिए एक शैली चुनें और रिकॉर्ड कंटेनर के अंतर्गत बाल फ़ील्ड को स्कोप करें।
प्रस्तुति वर्गों से जुड़े लंबे चयनकर्ता श्रृंखलाओं से बचें। लंबे समय तक चलने वाले विशेषताओं, अर्थपूर्ण तत्वों, स्थिर URL पैटर्न, या आंतरिक JSON कुंजियों को प्राथमिकता दें जब पृष्ठ उन्हें उजागर करता है।
सीमित पृष्ठनंबर जोड़ें
पृष्ठनंबर को एक बंद स्थिति की आवश्यकता होती है भले ही लक्ष्य वर्तमान में एक स्पष्ट अगला लिंक रखता हो। यह स्क्रिप्ट दो स्थिर पृष्ठों को एकत्र करती है और लिंक गायब होने पर जल्दी रुक जाती है।
python
import json
from urllib.parse import urljoin
import requests
from bs4 import BeautifulSoup
url = "https://quotes.toscrape.com/page/1/"
rows = []
for _ in range(2):
response = requests.get(url, timeout=30)
response.raise_for_status()
soup = BeautifulSoup(response.text, "html.parser")
for card in soup.select(".quote"):
rows.append({
"text": card.select_one(".text").get_text(strip=True),
"author": card.select_one(".author").get_text(strip=True),
"source_url": response.url,
})
next_link = soup.select_one("li.next a")
if not next_link:
break
url = urljoin(response.url, next_link["href"])
print(json.dumps({"count": len(rows), "last": rows[-1]}, indent=2))
एक अधिकतम पृष्ठ गिनती, एक देखी गई-URL सेट, और एक स्थिर रिकॉर्ड कुंजी का उपयोग करें, इससे पहले कि पैटर्न को एक बड़े साइट पर लागू किया जाए। समानांतर काम को छोटा रखें और साइट नीतियों का सम्मान करें।
Scrapeless के साथ स्क्रैपिंग शुरू करें
Scrapeless के साथ अपने वेब स्क्रैपिंग और स्वचालन कार्यप्रवाह को पावर अप करें!
आज ही साइन अप करें और $5 में फ्री क्रेडिट प्राप्त करें — कोई क्रेडिट कार्ड आवश्यक नहीं।Scrapeless डैशबोर्ड में अपना फ्री क्रेडिट अभी प्राप्त करें।
क्यों BeautifulSoup एक खाली गतिशील पृष्ठ लौटाता है
जावास्क्रिप्ट के समान डेमो का संस्करण एक प्रत्यक्ष अनुरोध को एक एचटीएमएल शेल लौटाता है। कोट कार्ड ब्राउज़र द्वारा पृष्ठ स्क्रिप्ट चलाने के बाद संलग्न होते हैं, इसलिए soup.select('.quote') प्रारंभिक प्रतिक्रिया में कोई रिकॉर्ड नहीं पाता है।
यह अंतर एक छोटे डायग्नोस्टिक के साथ स्पष्ट है:
python
import requests
from bs4 import BeautifulSoup
url = "https://quotes.toscrape.com/js/"
response = requests.get(url, timeout=30)
response.raise_for_status()
soup = BeautifulSoup(response.text, "html.parser")
print({
"status": response.status_code,
"title": soup.title.get_text(strip=True),
"quote_cards": len(soup.select(".quote")),
})
स्थिति 200 का मतलब है कि सर्वर ने एक सफल HTTP प्रतिक्रिया वापस की; इसका मतलब यह नहीं है कि प्रतिनिधित्व के भीतर व्यापारिक रिकॉर्ड होते हैं। HTTP सेमांटिक्स मानक स्थिति व्यवहार को परिभाषित करता है, जबकि स्क्रैपर को पृष्ठ पहचान और आवश्यक चयनकर्ताओं को मान्य करना चाहिए।
एक रेंडरर चुनने से पहले, ब्राउज़र डेवलपर टूल में Fetch/XHR अनुरोधों का निरीक्षण करें। एक स्थिर सार्वजनिक JSON प्रतिक्रिया एक रेंडर्ड DOM की तुलना में छोटी और मान्य करने में आसान हो सकती है। उन अनुरोधों को न दोहराएं जो निजी क्रेडेंशियल्स, प्रतिबंधित एंडपॉइंट्स, या उस प्राधिकरण पर निर्भर हैं जो आपके पास नहीं है।
जहाँ BeautifulSoup रुकता है
BeautifulSoup पार्सिंग पर रुकता है। यह पृष्ठ स्क्रिप्ट नहीं चलाता, नियंत्रणों पर क्लिक नहीं करता, एक ब्राउज़र निष्पादन वातावरण को बनाए नहीं रखता, या उन अधिग्रहण समस्याओं को हल नहीं करता जो एचटीएमएल पारसर तक पहुंचने से पहले होती हैं।
Scrapeless यूनिवर्सल स्क्रैपिंग एपीआई सार्वजनिक जावास्क्रिप्ट पृष्ठों के लिए रेंडर्ड एचटीएमएल लौटा सकता है। BeautifulSoup फिर उसी चयनकर्ताओं के साथ लौटी हुई स्ट्रिंग को पार्स कर सकता है जो स्थानीय एचटीएमएल के लिए उपयोग किए गए थे।
नोट: नीचे दिया गया क्लाउड अनुरोध एक पाठक-स्वामित्व वाला
SCRAPELESS_API_KEYआवश्यक है। प्रलेखित अनुरोध के आकार की पुष्टि की गई थी; क्रेडेंशियल-संरक्षित कॉल इस वातावरण में निष्पादित नहीं की गई।
python
import os
import requests
from bs4 import BeautifulSoup
response = requests.post(
"https://api.scrapeless.com/api/v2/unlocker/request",
headers={"x-api-token": os.environ["SCRAPELESS_API_KEY"]},
json={
"actor": "unlocker.webunlocker",
"proxy": {"country": "ANY"},
"input": {
"url": "https://quotes.toscrape.com/js/",
"jsRender": {
"enabled": True,
"waitUntil": "domcontentloaded",
"response": {"type": "html"}
}
}
},
timeout=60
)
response.raise_for_status()
payload = response.json()
if payload.get("code") != 200:
raise RuntimeError("Rendered HTML was not returned")
soup = BeautifulSoup(payload["data"], "html.parser")
records = [
{
"text": card.select_one(".text").get_text(strip=True),
"author": card.select_one(".author").get_text(strip=True),
}
for card in soup.select(".quote")
]
print({"count": len(records), "first": records[0] if records else None})
यूनिवर्सल स्क्रैपिंग एपीआई दस्तावेज़ीकरण जावास्क्रिप्ट रेंडरिंग और प्रतिक्रिया विकल्पों को परिभाषित करता है। अधिग्रहण परत में रेंडरर कॉन्फ़िगरेशन को बनाए रखें ताकि पार्सर संग्रहीत एचटीएमएल फ़िक्स्चर के साथ परीक्षण योग्य बना रहे।
JSON को सहेजने से पहले मान्य करें
एक पार्सर गलत पृष्ठ को अस्वीकार करना चाहिए बजाय इसके कि सफल होने के रूप में एक खाली फ़ाइल निर्यात करे। मान्य करें:
- अंतिम URL अपेक्षित होस्ट और मार्ग से मेल खाता है;
- शीर्षक या H1 इच्छित पृष्ठ की पहचान करता है;
- आवश्यक कार्ड चयनकर्ता मौजूद है;
- प्रत्येक स्वीकृत रिकॉर्ड में इसका व्यापारिक कुंजी है;
- नल करने योग्य क्षेत्रों का मान
nullबना रहता है बजाय इसके कि पड़ोसी मानों को शिफ्ट किया जाए; - स्रोत URL प्रत्येक पंक्ति के साथ संग्रहीत होता है।
रोबोट्स बहिष्करण प्रोटोकॉल उन निर्देशों को निर्दिष्ट करता है जो स्वत: क्लायंट मानने के लिए अनुरोध किए जाते हैं। यह प्राधिकरण या लागू कानून को नहीं बदलता है।
BeautifulSoup स्क्रैपर्स की समस्या समाधान
| लक्षण | संभावित कारण | जांचें |
|---|---|---|
| स्थिति 200 के साथ शून्य रिकॉर्ड | जावास्क्रिप्ट-रेंडर्ड सामग्री या गलत चयनकर्ता | प्रतिक्रिया एचटीएमएल और आवश्यक तत्व का निरीक्षण करें |
| गड़बड़ पाठ | गलत प्रतिक्रिया एन्कोडिंग | हेडर, दस्तावेज़ मेटाडेटा, और डिकोडेड बॉडी की तुलना करें |
| गलत कार्ड के साथ फील्ड जोड़ी | वैश्विक क्षेत्र चयनकर्ता | प्रत्येक रिकॉर्ड कंटेनर के तहत क्षेत्र प्रश्नों का स्कोप करें |
| डुप्लिकेट पंक्तियाँ | पृष्ठीकरण लूप एक URL पर दोबारा जाता है | देखी गई URLs और स्थिर रिकॉर्ड कुंजी को ट्रैक करें |
| पार्सर व्यवहार भिन्न होता है | अलग पार्सर बैकएंड | चुने हुए पार्सर को स्पष्ट रूप से पिन करें |
निष्कर्ष
BeautifulSoup वेब स्क्रैपिंग विश्वसनीय होती है जब प्रतिक्रिया में पहले से ही डेटा मौजूद होता है। अनुरोध स्थैतिक अधिग्रहण को संभालते हैं; BeautifulSoup पार्सिंग को संभालता है; सीमित पृष्ठीकरण और मान्यता परिणाम को संरचित आउटपुट में बदल देती है।
गतिशील पृष्ठों के लिए, पहले एक सार्वजनिक आंतरिक JSON स्रोत का निरीक्षण करें। जब आवश्यक पृष्ठ स्थिति के लिए जावास्क्रिप्ट की आवश्यकता होती है, तो यूनिवर्सल स्क्रैपिंग एपीआई के माध्यम से रेंडर्ड एचटीएमएल लौटाएं और BeautifulSoup को पार्सर के रूप में बनाए रखें।
पायथन पार्सिंग को बनाए रखें, रेंडरिंग को बादल में स्थानांतरित करें
Scrapeless मूल्य निर्धारण की तुलना करें, Puppeteer डाउनलोड गाइड में ब्राउज़र सीमा का अध्ययन करें, और एक Scrapeless खाता बनाएं। निष्पादन चर्चा के लिए Discord या Telegram में शामिल हों।
सामान्य प्रश्न
प्रश्न: क्या BeautifulSoup वेब स्क्रैपिंग के लिए अच्छा है?
BeautifulSoup एक व्यावहारिक एचटीएमएल और XML पार्सर है जब कोई अन्य घटक पहले से ही सही दस्तावेज़ प्राप्त कर चुका होता है।
प्रश्न: क्या BeautifulSoup एक गतिशील वेबसाइट को स्क्रैप कर सकता है?
BeautifulSoup जावास्क्रिप्ट को निष्पादित नहीं कर सकता, लेकिन यह एचटीएमएल को पार्स कर सकता है जो एक आंतरिक एपीआई, एक प्रबंधित रेंडरर, या एक ब्राउज़र स्वचालन चरण द्वारा लौटाया गया है।
Q: क्या BeautifulSoup वेब स्क्रैपिंग कानूनी है?
सिर्फ सार्वजनिक डेटा को स्क्रैप करें जिसे आप एक्सेस करने के लिए अधिकृत हैं, साइट की शर्तों और रोबोट निर्देशों की समीक्षा करें, संग्रहण को न्यूनतम करें, और संबंधित क्षेत्राधिकार के लिए कानूनी सलाह प्राप्त करें।
Q: क्या BeautifulSoup स्क्रैपर्स को प्रॉक्सी की आवश्यकता होती है?
एक छोटा अनुमति प्राप्त स्थिर अनुरोध प्रॉक्सी की आवश्यकता नहीं हो सकता है; भौगोलिक या उत्पादन कार्यभार के लिए एक उपयुक्त प्रॉक्सी और स्पष्ट ट्रैफ़िक नियंत्रण की आवश्यकता हो सकती है।
Q: जब DOM में परिवर्तन होता है तो क्या होना चाहिए?
वर्तमान प्रतिक्रिया की फिर से जांच करें, एक टिकाऊ स्रोत पहचानें जैसे कि एक विशेषता या JSON कुंजी, चयनकर्ताओं को कसना, और डेटा को सहेजने से पहले आवश्यक मानकों को मान्य करें।
Q: एक BeautifulSoup स्क्रैपर को कितनी सामांतरता का उपयोग करना चाहिए?
प्रत्येक होस्ट के लिए तीन कार्यकर्ताओं से अधिक न शुरू करें, साइट की नीति और प्रतिक्रिया व्यवहार का अवलोकन करें, और जब लक्षित या उपयोग केस कम ट्रैफ़िक की मांग करता है, तो समानांतरता को कम करें।
Q: क्या उदाहरण बिना एआई एजेंट के चल सकते हैं?
हाँ। पायथन के उदाहरण सीधे चलते हैं; एक एजेंट समान अधिग्रहण और पार्सिंग कदमों के चारों ओर वैकल्पिक संयोजन है।
स्क्रैपलेस में, हम केवल सार्वजनिक रूप से उपलब्ध डेटा का उपयोग करते हैं, जबकि लागू कानूनों, विनियमों और वेबसाइट गोपनीयता नीतियों का सख्ती से अनुपालन करते हैं। इस ब्लॉग में सामग्री केवल प्रदर्शन उद्देश्यों के लिए है और इसमें कोई अवैध या उल्लंघन करने वाली गतिविधियों को शामिल नहीं किया गया है। हम इस ब्लॉग या तृतीय-पक्ष लिंक से जानकारी के उपयोग के लिए सभी देयता को कोई गारंटी नहीं देते हैं और सभी देयता का खुलासा करते हैं। किसी भी स्क्रैपिंग गतिविधियों में संलग्न होने से पहले, अपने कानूनी सलाहकार से परामर्श करें और लक्ष्य वेबसाइट की सेवा की शर्तों की समीक्षा करें या आवश्यक अनुमतियाँ प्राप्त करें।




