Playwright और Scrapeless के साथ Iframes को स्क्रैप कैसे करें
Senior Web Scraping Engineer
TL;DR:
- एक iframe एक अलग दस्तावेज़ है जिसे माता-पिता पृष्ठ के सेलेक्टर्स खोज नहीं सकते हैं। इसके तत्वों का पता लगाने या निकालने से पहले बच्चे के फ्रेम का चयन करें।
- Playwright प्रत्येक ब्राउज़िंग संदर्भ को
page.framesके माध्यम से उजागर करता है। एक स्थायी नाम, URL पैटर्न, या स्वामित्व वाले iframe तत्व के द्वारा इच्छित बच्चे की पहचान करें, न कि सरणी के स्थान पर निर्भर होकर। FrameऔरFrameLocatorविभिन्न निष्कर्षण आवश्यकताओं को पूरा करते हैं। मेटाडेटा और जीवन चक्र नियंत्रण के लिएFrameका उपयोग करें; संक्षिप्त तत्व क्रियाओं के लिएFrameLocatorका उपयोग करें।- Playwright ब्राउज़र प्रोटोकॉल के माध्यम से क्रॉस-ओरिजिन iframe सामग्री को स्वचालित कर सकता है। इन-पृष्ठ JavaScript ब्राउज़र की समान-असली नीति के अधीन रहता है।
- समान iframe निष्कर्षण लॉजिक स्थानीय रूप से और Scrapeless के माध्यम से काम करता है। Scrapeless Scraping Browser पर जाने से ब्राउज़र निर्माण बदलता है, न कि फ्रेम चयन या लोकेटर कोड।
- शुरू करने के लिए स्वतंत्र। नए Scrapeless खातों में मुफ्त Scraping Browser रनटाइम शामिल है—app.scrapeless.com पर साइन अप करें।
परिचय: सही दस्तावेज़ से शुरू करें
एक iframe एक अलग दस्तावेज़ है जिसकी अपनी URL, जीवन चक्र, और DOM है। यह मार्गदर्शिका Playwright का उपयोग करके एक वास्तविक पृष्ठ पर ब्राउज़िंग संदर्भों को सूचीबद्ध करती है, नाम और URL द्वारा इच्छित बच्चे की पहचान करती है, और एक फ़ॉर्म को निकालती है जिसे माता-पिता पृष्ठ के सेलेक्टर नहीं देख सकते। Playwright को Scrapeless Scraping Browser से जोड़ने के बाद वही फ्रेम लॉजिक चलता है।
क्यों iframes को अलग निष्कर्षण पथ की आवश्यकता है
एक <iframe> माता-पिता पृष्ठ के अंदर एक और ब्राउज़िंग संदर्भ को एम्बेड करता है। यह तत्व माता-पिता DOM का हिस्सा है; लोड किया गया दस्तावेज़ एक बच्चे के फ्रेम का है। माता-पिता पृष्ठ के खिलाफ मूल्यांकन किया गया एक सेलेक्टर उस बच्चे के दस्तावेज़ को खोजता नहीं है।
< a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/iframe" rel="nofollow">HTML iframe संदर्भ उस निहित संदर्भ और इसके अपने सत्र इतिहास का वर्णन करता है। Playwright प्रत्येक संदर्भ को Frame के रूप में उजागर करता है, जबकि FrameLocator आपको <iframe> तत्व के माध्यम से तत्वों को स्थानांतरित करने का संक्षिप्त तरीका देता है।
Scrapeless के साथ Playwright का उपयोग क्यों करें
Playwright फ़्रेम मेटाडेटा का निरीक्षण कर सकता है और बच्चे के दस्तावेज़ के साथ इंटरैक्ट कर सकता है भले ही iframe क्रॉस-ओरिजिन हो। वह ब्राउज़र-स्तरीय पहुँच माता-पिता पृष्ठ के अंदर चल रहे JavaScript से भिन्न होती है, जो समान-असली नीति द्वारा सीमित होती है।
Scrapeless Scraping Browser क्रोमियम को एक होस्टेड एंटी-डिटेक्शन वातावरण में ले जाता है जबकि Playwright के फ्रेम APIs को बनाए रखता है। कनेक्शन connect_over_cdp का उपयोग करता है; ब्राउज़र निर्माण के बाद प्रत्येक निष्कर्षण लाइन मानक Playwright रहती है।
पूर्वापेक्षाएँ
- Python 3.10 या बाद का।
playwright1.59.0 या एक वर्तमान संगत संस्करण।- पूर्ण निष्पादन योग्य बैकअप के लिए स्थानीय Chrome/Chromium।
- एक वित्त पोषित Scrapeless खाता और
SCRAPELESS_API_KEYक्लाउड ब्राउज़र कनेक्शन के लिए। सत्यापन खाते पर नए सत्रों ने कोड 14500 लौटाया, इसलिए क्लाउड कनेक्शन एक लेबल्ड पूर्वापेक्षा अंतर है।
इंस्टॉल करें
bash
python -m pip install "playwright==1.59.0"
रन करने योग्य उदाहरण होस्ट के /usr/bin/google-chrome का उपयोग करता है। यदि यह आपके प्रोजेक्ट द्वारा ब्राउज़रों को प्रावधान करने का तरीका है, तो Playwright-प्रबंधित Chromium का उपयोग करें।
Scrapeless Scraping Browser से कनेक्ट करें
नोट: यह कनेक्शन वित्त पोषित Scraping Browser बैलेंस की आवश्यकता है। अंतिम सत्यापन खाते ने
अपर्याप्त बैलेंस, कृपया पहले रिचार्ज करेंलौटाया। अपना वित्त पोषित कुंजी का उपयोग करें; नीचे फ्रेम संख्या और निष्कर्षण पूरी तरह से स्थानीय Chrome में चलती थी।
python
import os
from urllib.parse import urlencode
from playwright.sync_api import sync_playwright
params = urlencode({
"token": os.environ["SCRAPELESS_API_KEY"],
"sessionTTL": 120,
"proxyCountry": "US",
})
cdp_url = f"wss://browser.scrapeless.com/api/v2/browser?{params}"
with sync_playwright() as p:
browser = p.chromium.connect_over_cdp(cdp_url)
page = browser.contexts[0].pages[0]
# नीचे फ्रेम चरणों के साथ जारी रखें।
browser.close()
वर्तमान कनेक्शन पैरामीटर के लिए Scrapeless डेवलपर डॉक्स का उपयोग करें।
चरण 1 — एक ज्ञात बच्चे के फ्रेम के साथ एक पृष्ठ खोलें
Selenium एक छोटा सार्वजनिक परीक्षण फिक्स्चर बनाए रखता है। इसके माता-पिता के पृष्ठ में एक iframe है जिसका नाम iframe1-name है, जिसका src formPage.html को लोड करता है:
python
TARGET_URL = "https://www.selenium.dev/selenium/web/iframes.html"
page.goto(TARGET_URL, wait_until="domcontentloaded")
page.wait_for_selector("#iframe1")
page.wait_for_timeout(500)
print("माता-पिता का शीर्षक:", page.title())
print("माता-पिता का ईमेल मिलान:", page.locator("#email").count())
text
माता-पिता का शीर्षक: इस पृष्ठ में iframes हैं
माता-पिता का ईमेल मिलान: 0
ईमेल इनपुट मौजूद है, लेकिन यह अभिभावक के बजाय एम्बेडेड फॉर्म दस्तावेज़ से संबंधित है।
चरण 2 — किसी को चुनने से पहले फ़्रेम की गिनती करें
page.frames मुख्य फ्रेम के साथ-साथ हर जुड़े हुए बच्चे और वंशज को शामिल करता है:
python
print("फ्रेम की गिनती:", len(page.frames))
for index, frame in enumerate(page.frames):
print(index, repr(frame.name), frame.url, frame.title())
text
फ्रेम की गिनती: 2
0 '' https://www.selenium.dev/selenium/web/iframes.html यह पृष्ठ iframe करता है
1 'iframe1-name' https://www.selenium.dev/selenium/web/formPage.html हम यहां से छोड़ते हैं
इंडेक्स शून्य मुख्य दस्तावेज़ है। इंडेक्स एक को स्थायी अनुबंध में मत बदलो: एक अन्य विज्ञापन, सहमति विजेट, या एनालिटिक्स फ़्रेम क्रम को बदल सकता है। नाम और यूआरएल बेहतर सबूत हैं।
चरण 3 — नाम या यूआरएल द्वारा फ़्रेम का चयन करें
फिक्स्चर आपको दोनों स्थिर संकेत देता है:
python
named_frame = page.frame(name="iframe1-name")
url_frame = next(
frame for frame in page.frames
if frame.url.endswith("/formPage.html")
)
assert named_frame is url_frame
print("चुना हुआ फ़्रेम:", url_frame.name)
print("चुना हुआ शीर्षक:", url_frame.title())
यदि नाम उत्पन्न होते हैं, तो एक सीमाबद्ध यूआरएल पैटर्न से मेल करें या मालिक iframe तत्व खोजें और content_frame() कॉल करें। जब एक से अधिक उम्मीदवार मेल खाते हैं, तो विफल हो जाएं; पहले डुप्लिकेट को चुपचाप चुनना गलत विजेट से विश्वसनीय डेटा उत्पन्न करता है।
चरण 4 — बाल दस्तावेज़ से डेटा निकालें
एक बार जब आप फ्रेम पकड़ लेते हैं, तो इसका लोकेटर API पृष्ठ की तरह व्यवहार करता है:
python
email = url_frame.locator("#email")
selected = url_frame.locator("#multi option:checked").evaluate_all(
"options => options.map(option => option.value)"
)
record = {
"फ्रेम नाम": url_frame.name,
"फ्रेम यूआरएल": url_frame.url,
"फ्रेम शीर्षक": url_frame.title(),
"ईमेल इनपुट": email.count(),
"चुने हुए मान": selected,
}
print("ईमेल इनपुट:", record["ईमेल इनपुट"])
print("चुने हुए मान:", record["चुने हुए मान"])
text
ईमेल इनपुट: 1
चुने हुए मान: ['अंडे', 'सॉसेज']
बाल पृष्ठ में उन दो विकल्पों के साथ एक मल्टीपल-सेलेक्ट फ़ील्ड है जो इसके स्रोत में चयनित हैं। यह केवल एक शीर्षक पढ़ने की तुलना में एक मजबूत जांच है: यह साबित करता है कि Playwright ने फॉर्म दस्तावेज़ तक पहुँच बनाया और इसके भीतर स्थिति को मूल्यांकित किया।
चरण 5 — सीधे क्रियाओं के लिए FrameLocator का उपयोग करें
जब आपको फ़्रेम मेटाडेटा की आवश्यकता नहीं होती है, तो FrameLocator छोटा होता है:
python
frame_ui = page.frame_locator("#iframe1")
print("FrameLocator के माध्यम से ईमेल:", frame_ui.locator("#email").count())
आधिकारिक Playwright फ्रेम गाइड उसी दो स्तरों को दिखाता है: एक iframe तत्व के माध्यम से सामग्री का स्थान खोजें, या यूआरएल/नाम द्वारा Frame ऑब्जेक्ट प्राप्त करें।
क्या आप उन लोकेटर्स को होस्ट किए गए ब्राउज़र में चलाने के लिए तैयार हैं? एक मुफ्त Scrapeless खाता बनाएं और केवल ब्राउज़र निर्माण को बदलें।
पूर्ण स्थानीय सत्यापन स्क्रिप्ट
python
from playwright.sync_api import sync_playwright
TARGET_URL = "https://www.selenium.dev/selenium/web/iframes.html"
with sync_playwright() as p:
browser = p.chromium.launch(
executable_path="/usr/bin/google-chrome",
headless=True,
)
page = browser.new_page()
page.goto(TARGET_URL, wait_until="domcontentloaded")
page.wait_for_selector("#iframe1")
page.wait_for_timeout(500)
child = next(
frame for frame in page.frames
if frame.url.endswith("/formPage.html")
)
selected = child.locator("#multi option:checked").evaluate_all(
"options => options.map(option => option.value)"
)
frame_locator_count = page.frame_locator("#iframe1").locator("#email").count()
assert page.locator("#email").count() == 0
assert child.name == "iframe1-name"
assert child.locator("#email").count() == 1
assert selected == ["अंडे", "सॉसेज"]
assert frame_locator_count == 1
print("अभिभावक शीर्षक:", page.title())
print("अभिभावक ईमेल मिलान:", page.locator("#email").count())
print("फ्रेम की गिनती:", len(page.frames))
print("बाल का नाम:", child.name)
print("बाल यूआरएल:", child.url)
print("बाल शीर्षक:", child.title())
print("बाल ईमेल मिलान:", child.locator("#email").count())
print("चुने हुए मान:", selected)
print("FrameLocator ईमेल मिलान:", frame_locator_count)
browser.close()
पूर्ण रन दो फ्रेम लौटाता है, शून्य अभिभावक ईमेल मिलान, एक बाल ईमेल मिलान, अपेक्षित फ्रेम नाम/शीर्षक/यूआरएल, और बाल फ़ॉर्म से ['अंडे', 'सॉसेज']।
आपको क्या वापस मिलता है
सत्यापित कार्यप्रवाह दोनों निकाले गए फॉर्म राज्य और इसके स्रोत की पहचान के लिए पर्याप्त फ्रेम मेटाडेटा लौटाता है:
json
{
"अभिभावक_ईमेल_मिलान": 0,
"फ्रेम की गिनती": 2,
"फ्रेम_नाम": "iframe1-name",
"फ्रेम_यूआरएल": "https://www.selenium.dev/selenium/web/formPage.html",
"फ्रेम_शीर्षक": "हम यहां से छोड़ते हैं",
"बाल_ईमेल_मिलान": 1,
"चुने गए मान": ["अंडे", "सॉसेज"]
}
आउटपुट चार तथ्य स्थापित करता है: माता-पिता का दस्तावेज़ ईमेल क्षेत्र नहीं देख सकता, इच्छित बच्चा नाम और यूआरएल द्वारा पहचाना जा सकता है, बच्चा खोजक एक मिलान इनपुट प्राप्त करता है, और चयनित फ़ॉर्म मान उस फ्रेम के अंदर से आते हैं। जब एक पृष्ठ में कई अंतर्निहित दस्तावेज़ होते हैं, तो निकाले गए रिकॉर्ड के साथ फ्रेम का नाम और यूआरएल बनाए रखें।
## क्रॉस-ओरिजिन आईफ्रेम और समान-उरिजिन नीति
"डॉक्यूमेंट.querySelector("आईफ्रेम").contentDocument" जैसे ब्राउज़र जावास्क्रिप्ट को माता-पिता और बच्चे की उत्पत्ति के अलग होने पर अवरुद्ध किया जा सकता है। प्लेवाईट ब्राउज़र स्वचालन प्रोटोकॉल के साथ संचार करता है और बच्चे को एक फ़्रेम के रूप में उजागर करता है, ताकि यह क्रॉस-उरिजिन दस्तावेज़ों में तत्वों को ढूंढ सके और उनके साथ बातचीत कर सके।
यह हर सीमा को समाप्त नहीं करता। सैंडबॉक्स विशेषताएँ स्क्रिप्टों को प्रतिबंधित कर सकती हैं, नेविगेशन आपको पढ़ते समय एक फ़्रेम को बदल सकता है, और ब्राउज़र एक्सटेंशन या पीडीएफ दर्शक एक साधारण एचटीएमएल दस्तावेज़ को उजागर नहीं कर सकते। निष्कर्षण अनुबंध लिखने से पहले वास्तविक फ्रेम पेड़ का निरीक्षण करें।
## गतिशील और अंतर्निहित फ्रेम
### संलग्नक और नेविगेशन की प्रतीक्षा करें
एक आईफ्रेम तत्व तब प्रकट हो सकता है जब इसका बच्चा अंतिम यूआरएल तक नहीं पहुंचा हो। एक बच्चे के खोजक के लिए प्रतीक्षा करें या फ्रेम नेविगेशन घटनाओं का निरीक्षण करें; उपयोगी तत्परता मार्कर डेटा-संबंधित तत्व है, केवल माता-पिता के "<iframe>" टैग नहीं।
### निरसन की अपेक्षा करें
सिंगल-पृष्ठ एप्स कभी-कभी आईफ्रेम को हटा देते हैं और फिर से बनाते हैं। एक सहेजा गया फ्रेम ऑब्जेक्ट अलग हो सकता है। UI संक्रमण के बाद पुराने ऑब्जेक्ट के जीवित रहने की उम्मीद करने के बजाय इसे इसके स्थिर नाम, यूआरएल, या मालिक तत्व से फिर से हल करें।
### जानबूझकर अंतर्निहित फ्रेम का पता लगाएं
अंतर्निहित संदर्भों के लिए, "फ्रेम.child_frames" का निरीक्षण करें या फ्रेम लोकेटरों को श्रृंखला में जोड़ें। आउटपुट प्रॉवेनेंस में माता-पिता- बच्चे के पथ को बनाए रखें ताकि दो समान नाम वाले विजेटों को भ्रमित न किया जा सके।
## निष्कर्ष
आईफ्रेम स्क्रैपिंग सही दस्तावेज़ चुनने से शुरू होती है। फ्रेम पेड़ की गणना करें, स्थिर नाम या यूआरएल द्वारा बच्चे का चयन करें, इसके अंदर एक तत्व पर प्रतीक्षा करें, और निकाले गए रिकॉर्ड के साथ फ्रेम मेटाडेटा बनाए रखें। संक्षिप्त कार्रवाई के लिए फ्रेम लोकेटर का उपयोग करें और पहचान, नेविगेशन या अंतर्निहित-फ्रेम नियंत्रण की आवश्यकता होने पर फ्रेम ऑब्जेक्ट्स का उपयोग करें। कार्यप्रवाह को स्क्रैपलेस पर ले जाने से ब्राउज़र निर्माण में परिवर्तन होता है, न कि फ्रेम लॉजिक में।
## आईफ्रेम से डेटा निकालने के लिए तैयार हैं?
स्क्रैपलेस समुदाय में ब्राउज़र-आधारित निष्कर्षण कार्यप्रवाह बनाने वाले डेवलपर्स में शामिल हों: [डिस्कॉर्ड](https://discord.gg/VU2vtbq7Q2) · [टेलीग्राम](https://t.me/scrapeless)।
[स्क्रैपलेस से शुरू करें](https://app.scrapeless.com/passport/login/?utm_source=website&utm_medium=blog&utm_campaign=scrapingbrowser&utm_term=iframe-web-scraping-scraping-browser), [स्क्रैपलेस मूल्य निर्धारण](https://www.scrapeless.com/hi/pricing?utm_source=website&utm_medium=blog&utm_campaign=scrapingbrowser&utm_term=iframe-web-scraping-scraping-browser) की समीक्षा करें, और [सीडीपी क्या उजागर करता है](https://www.scrapeless.com/hi/blog/what-is-chrome-devtools-protocol?utm_source=website&utm_medium=blog&utm_campaign=scrapingbrowser&utm_term=iframe-web-scraping-scraping-browser) पढ़ें इससे पहले कि आप समान फ्रेम कार्यप्रवाह को होस्ट किए गए ब्राउज़र पर ले जाएं।
## अक्सर पूछे जाने वाले प्रश्न
**प्रश्न: माता-पिता का पृष्ठ एक आईफ्रेम के अंदर एक तत्व को क्यों नहीं खोज सकता?**
आईफ्रेम स्वायत्तता का एक अलग दस्तावेज़ है। माता-पिता के पृष्ठ के लोकेटर मातृ ब्राउज़िंग संदर्भ खोजते हैं; पहले बच्चे के फ़्रेम का चयन करें या फ़्रेम लोकेटर का उपयोग करें।
**प्रश्न: क्या मुझे एक फ्रेम को एरे इंडेक्स द्वारा चुनना चाहिए?**
नहीं। जब पृष्ठ विजेट या विज्ञापन जोड़ते हैं, तो फ्रेम का क्रम बदल जाता है। स्थिर नाम, यूआरएल पैटर्न या स्वामित्व वाला आईफ्रेम तत्व पसंद करें और अस्पष्ट मेलों पर विफल रहें।
**प्रश्न: फ्रेम और फ्रेमलोकेटर में क्या अंतर है?**
एक फ्रेम दस्तावेज़ की पहचान, यूआरएल, नाम, जीवन चक्र और बच्चे के फ्रेम को उजागर करता है। फ्रेमलोकेटर एक विशिष्ट आईफ्रेम तत्व के माध्यम से संक्षिप्त लोकेटर संचालन प्रदान करता है।
**प्रश्न: क्या प्लेवाईट एक क्रॉस-ओरिजिन आईफ्रेम तक पहुँच सकता है?**
हाँ, प्लेवाईट ब्राउज़र प्रोटोकॉल के माध्यम से क्रॉस-उरिजिन बच्चे के फ्रेम का स्वचालन कर सकता है, भले ही पृष्ठ में जावास्क्रिप्ट "contentDocument" को समान उरिजिन नीति के कारण पढ़ न सके।
**प्रश्न: मैं गतिशील रूप से लोड किए गए आईफ्रेम के लिए कैसे प्रतीक्षा करूं?**
फ्रेम के अंदर डेटा-संबंधित लोकेटर या एक ज्ञात अंतिम फ्रेम यूआरएल की प्रतीक्षा करें। केवल आईफ्रेम तत्व की उपस्थिति इसका बच्चा दस्तावेज़ नेविगेट करने में समाप्त होने को प्रमाणित नहीं करती है।
**प्रश्न: यदि फ्रेम हटा दिया गया है तो क्या होता है?**
सहेजा गया फ्रेम अब एक जीवित दस्तावेज़ का प्रतिनिधित्व नहीं करता है। पृष्ठ संक्रमण के बाद स्थिर साक्ष्य से प्रतिस्थापन फ्रेम को फिर से हल करें।
**प्रश्न: क्या आईफ्रेम स्क्रैपिंग कानूनी है?**
एंबेडिंग लक्षित के डेटा अधिकारों या शर्तों को नहीं बदलता। साइट और अंतर्निहित प्रदाता की नीतियों की समीक्षा करें, जहाँ लागू हो वहां "रोबोट्स निर्देश" का सम्मान करें, मात्रा को सीमित रखें, और संवेदनशील या वाणिज्यिक संग्रह के लिए कानूनी सलाह प्राप्त करें।
स्क्रैपलेस में, हम केवल सार्वजनिक रूप से उपलब्ध डेटा का उपयोग करते हैं, जबकि लागू कानूनों, विनियमों और वेबसाइट गोपनीयता नीतियों का सख्ती से अनुपालन करते हैं। इस ब्लॉग में सामग्री केवल प्रदर्शन उद्देश्यों के लिए है और इसमें कोई अवैध या उल्लंघन करने वाली गतिविधियों को शामिल नहीं किया गया है। हम इस ब्लॉग या तृतीय-पक्ष लिंक से जानकारी के उपयोग के लिए सभी देयता को कोई गारंटी नहीं देते हैं और सभी देयता का खुलासा करते हैं। किसी भी स्क्रैपिंग गतिविधियों में संलग्न होने से पहले, अपने कानूनी सलाहकार से परामर्श करें और लक्ष्य वेबसाइट की सेवा की शर्तों की समीक्षा करें या आवश्यक अनुमतियाँ प्राप्त करें।



