पायथन के साथ गतिशील वेबसाइटों को स्क्रैप करने के लिए गाइड

टिप्पणियाँ: 0

वेब पेजों से डेटा प्राप्त करने की एक महत्वपूर्ण क्षमता वेब स्क्रैपिंग है। Pinterest और Instagram, जो उनके साथ उपयोगकर्ता बातचीत के माध्यम से गतिशील रूप से सामग्री को लोड करते हैं, इस प्रकार की वेबसाइटों के उदाहरण हैं। जावास्क्रिप्ट-आधारित सामग्री को संभालते समय नियमित स्क्रैपिंग तरीके अपर्याप्त हैं। इस लेख में, हम नाटककार के रूप में ऑटोमेशन टूल के रूप में विस्तृत करेंगे, जबकि LXML का उपयोग ऐसे गतिशील साइटों से डेटा निष्कर्षण के लिए किया जाएगा, जिन्हें ठीक से काम करने के लिए जावास्क्रिप्ट की आवश्यकता होती है। इस नोट पर, हम नाटककार में बॉट्स के रूप में पता लगाने के लिए नाटककार में प्रॉक्सी का उपयोग करने पर चर्चा कर सकते हैं। इस ट्यूटोरियल में, हम उपयोगकर्ता के व्यवहार का अनुकरण करके सभी पोस्ट URL को पुनः प्राप्त करने के लिए इंस्टाग्राम प्रोफाइल को स्क्रैप करेंगे, जैसे कि स्क्रॉल करना और पोस्ट के लोड करने के लिए इंतजार करना।

उपकरण हम इस गाइड में उपयोग करेंगे:

  • नाटककार (ब्राउज़र ऑटोमेशन के लिए);
  • LXML (XPath का उपयोग करके डेटा निष्कर्षण के लिए);
  • पायथन (हमारी प्रोग्रामिंग भाषा के रूप में)।

इंस्टाग्राम पोस्ट को स्क्रैप करने के लिए चरण-दर-चरण गाइड

हम पोस्ट URL निकालने के लिए इंस्टाग्राम प्रोफाइल को स्क्रैप करने के उदाहरण का उपयोग करके प्रक्रिया को चित्रित करेंगे, उपयोगकर्ता कार्यों जैसे कि पेज के माध्यम से स्क्रॉल करना और नए डेटा को लोड करने के लिए इंतजार कर रहे हैं। डायनेमिक वेबसाइटें ASYNCHRONELY AJAX अनुरोधों के माध्यम से अपनी सामग्री को लोड करती हैं, जिसका अर्थ है कि सभी पृष्ठ सामग्री तुरंत सुलभ नहीं है।

चरण 1। आवश्यक पुस्तकालय स्थापित करें

शुरू करने से पहले, आवश्यक पैकेज स्थापित करें:


pip install playwright
pip install lxml

आपको नाटककार ब्राउज़र भी स्थापित करना होगा:


playwright install

चरण 2। डायनेमिक वेबसाइट स्क्रैपिंग के लिए नाटककार सेटअप

हम ब्राउज़र को स्वचालित करने के लिए नाटककार का उपयोग करेंगे, इंस्टाग्राम की डायनामिक सामग्री लोड करेंगे, और अधिक पोस्ट लोड करने के लिए पृष्ठ के माध्यम से स्क्रॉल करेंगे। आइए एक बुनियादी स्वचालन स्क्रिप्ट बनाएं:

स्वचालन स्क्रिप्ट (हेडलेस ब्राउज़र):


import asyncio
from playwright.async_api import async_playwright

async def scrape_instagram():
    async with async_playwright() as p:
        browser = await p.chromium.launch(headless=True)  # हेडलेस मोड कोई दृश्य प्रतिक्रिया नहीं
        page = await browser.new_page()
        
        # प्रोफ़ाइल URL पर जाएं
        await page.goto("https://www.instagram.com/profile name/", wait_until="networkidle")

        # अधिक पोस्ट लोड करने के लिए बटन पर क्लिक करें
        await page.get_by_role("button", name="Show more posts from").click()
        
        # डायनेमिक कंटेंट लोड करने के लिए पेज को स्क्रॉल करें
        scroll_count = 5  # आप कितनी बार स्क्रॉल करना चाहते हैं, इसके आधार पर इसे अनुकूलित करें
        for _ in range(scroll_count):
            await page.evaluate('window.scrollBy(0, 700);')
            await page.wait_for_timeout(3000)  # लोड करने के लिए पोस्ट की प्रतीक्षा करें
            await page.wait_for_load_state("networkidle")
        
        # पृष्ठ सामग्री प्राप्त करें
        content = await page.content()
        await browser.close()
        
        return content

# एसिंक्रोनस फ़ंक्शन चलाएं
asyncio.run(scrape_instagram())

चरण 3। LXML और XPath

के साथ पृष्ठ को पार्स करना

एक बार सामग्री लोड होने के बाद, हम HTML को पार्स करने और XPath का उपयोग करके डेटा निकालने के लिए LXML का उपयोग कर सकते हैं। इस मामले में, हम प्रोफ़ाइल से सभी पोस्ट के URL निकाल रहे हैं।

पृष्ठ सामग्री को पार्स करना और पोस्ट URL निकालने:


from lxml import html
import json

def extract_post_urls(page_content):
    # LXML का उपयोग करके HTML सामग्री को पार्स करें
    tree = html.fromstring(page_content)
    
    # पोस्ट URL निकालने के लिए xpath
    post_urls_xpath = '//a[contains(@href, "/p/")]/@href'
    
    # URL निकालें
    post_urls = tree.xpath(post_urls_xpath)
    
    # सापेक्ष URLs को निरपेक्ष में परिवर्तित करें
    base_url = "https://www.instagram.com"
    post_urls = [f"{base_url}{url}" for url in post_urls]
    
    return post_urls

JSON प्रारूप में निकाले गए डेटा को सहेजने के लिए उदाहरण फ़ंक्शन:


def save_data(profile_url, post_urls):
    data = {profile_url: post_urls}
    with open('instagram_posts.json', 'w') as json_file:
        json.dump(data, json_file, indent=4)

# खुरचना और url निकालें
page_content = asyncio.run(scrape_instagram())
post_urls = extract_post_urls(page_content)

# JSON फ़ाइल में निकाले गए URL को सहेजें
save_data("https://www.instagram.com/profile name/", post_urls)

चरण 4। नाटककार के साथ अनंत स्क्रॉल हैंडलिंग

गतिशील वेबसाइटों को परिमार्जन करने के लिए, आपको अक्सर अनंत स्क्रॉलिंग का अनुकरण करने की आवश्यकता होती है। हमारी स्क्रिप्ट में, हम जावास्क्रिप्ट का उपयोग करके पृष्ठ को स्क्रॉल करते हैं:


(window.scrollBy(0, 700))

और इस कमांड का उपयोग करके लोड करने के लिए नई सामग्री की प्रतीक्षा करें:


 wait_for_load_state("networkidle")

चरण 5। नाटककार के साथ प्रॉक्सी का उपयोग करना

इंस्टाग्राम में सख्त दर सीमाएं और एंटी-बॉट उपाय हैं। अवरुद्ध होने से बचने के लिए, आप आईपी पते को घुमाने और अनुरोधों को वितरित करने के लिए प्रॉक्सी का उपयोग कर सकते हैं। नाटककार अपने स्क्रैपिंग ऑटोमेशन में प्रॉक्सी को एकीकृत करना आसान बनाता है।

नाटककार में प्रॉक्सी को लागू करना:


async def scrape_with_proxy():
    async with async_playwright() as p:
        browser = await p.chromium.launch(
            headless=False, 
            proxy={"server": "http://your-proxy-server:port"}
        )
        page = await browser.new_page()
        await page.goto("https://www.instagram.com/profile name/", wait_until="networkidle")
        # पहले की तरह स्क्रैपिंग जारी रखें ...

नाटककार भी प्रॉक्सी का समर्थन करता है जिसे उपयोगकर्ता नाम पासवर्ड के रूप में पारित किया जाना है और सर्वर उदाहरण नीचे दिया गया है।


async def scrape_with_proxy():
    async with async_playwright() as p:
        browser = await p.chromium.launch(
            headless=False, 
            proxy={"server": "http://your-proxy-server:port", "username": "username", "password": "password"}
        )
        page = await browser.new_page()
        await page.goto("https://www.instagram.com/profile name/", wait_until="networkidle")
        # पहले की तरह स्क्रैपिंग जारी रखें ...

प्रॉक्सी आईपी बैन, कैप्चा चुनौतियों से बचने में मदद करता है, और इंस्टाग्राम जैसी डेटा-भारी या प्रतिबंधित वेबसाइटों की सुचारू स्क्रैपिंग सुनिश्चित करता है।

पूर्ण कोड


import asyncio
from playwright.async_api import async_playwright
from lxml import html
import json

# ब्राउज़र को स्वचालित करने के लिए फ़ंक्शन और प्रॉक्सी के साथ डायनेमिक कंटेंट को स्क्रैप करें
async def scrape_instagram(profile_url, proxy=None):
    async with async_playwright() as p:
        # यदि प्रदान किया जाए तो प्रॉक्सी के साथ ब्राउज़र सेट करें
        browser_options = {
            'headless': True,  # कार्रवाई को देखने के लिए हेड ब्राउज़र का उपयोग करें (हेडलेस मोड के लिए सही पर सेट कर सकते हैं)
        }
        if proxy:
            browser_options['proxy'] = proxy

        # ब्राउज़र लॉन्च करें
        browser = await p.chromium.launch(**browser_options)
        page = await browser.new_page()

        # इंस्टाग्राम प्रोफाइल पेज पर जाएं
        await page.goto(profile_url, wait_until="networkidle")
        
        # "अधिक पोस्ट दिखाएं" बटन पर क्लिक करने का प्रयास करें (वैकल्पिक, यदि बटन नहीं मिला तो विफल हो सकता है)
        try:
           await page.click('button:has-text("Show more posts from")')
        except Exception as e:
           print(f"No 'Show more posts' button found: {e}")


        # अधिक पोस्ट लोड करने के लिए पृष्ठ को स्क्रॉल करें
        scroll_count = 5  # Number of scrolls to load posts
        for _ in range(scroll_count):
            await page.evaluate('window.scrollBy(0, 500);')
            await page.wait_for_timeout(3000)  # लोड करने के लिए नए पोस्ट की प्रतीक्षा करें
            await page.wait_for_load_state("networkidle")

        # स्क्रॉल करने के बाद पूरा पृष्ठ सामग्री प्राप्त करें
        content = await page.content()
        await browser.close()  # एक बार ब्राउज़र को बंद करें
        
        return content

# स्क्रैप किए गए पृष्ठ सामग्री को पार्स करने और पोस्ट URL को निकालने के लिए कार्य करें
def extract_post_urls(page_content):
    # LXML का उपयोग करके HTML सामग्री को पार्स करें
    tree = html.fromstring(page_content)
    
    # पोस्ट URL निकालने के लिए xpath
    post_urls_xpath = '//a[contains(@href, "/p/")]/@href'
    
    # XPath का उपयोग करके पोस्ट URL निकालें
    post_urls = tree.xpath(post_urls_xpath)
    
    # सापेक्ष URL को पूर्ण URL में परिवर्तित करें
    base_url = "https://www.instagram.com"
    post_urls = [f"{base_url}{url}" for url in post_urls]
    
    return post_urls

# JSON फ़ाइल में निकाले गए पोस्ट URL को सहेजने के लिए कार्य करें
def save_data(profile_url, post_urls):
    # JSON प्रारूप में डेटा की संरचना
    data = {profile_url: post_urls}
    
    # डेटा को किसी फ़ाइल में सहेजें
    with open('instagram_posts.json', 'w') as json_file:
        json.dump(data, json_file, indent=4)
    print(f"Data saved to instagram_posts.json")

# स्क्रैपर चलाने और डेटा को सहेजने के लिए मुख्य कार्य
async def main():
    # इंस्टाग्राम प्रोफाइल URL को परिभाषित करें
    profile_url = "https://www.instagram.com/profile name/"
    
    # वैकल्पिक रूप से, एक प्रॉक्सी सेट करें
    proxy = {"server": "server", "username": "username", "password": "password"}  # यदि कोई प्रॉक्सी की आवश्यकता नहीं है तो कोई भी उपयोग करें
    
    # प्रॉक्सी के साथ इंस्टाग्राम पेज को परिमार्जन करें
    page_content = await scrape_instagram(profile_url, proxy=proxy)
    
    # स्क्रैप किए गए पृष्ठ सामग्री से पोस्ट URL निकालें
    post_urls = extract_post_urls(page_content)
    
    # JSON फ़ाइल में निकाले गए पोस्ट URL को सहेजें
    save_data(profile_url, post_urls)

if __name__ == '__main__':
   asyncio.run(main())

वेब स्क्रैपिंग के लिए वैकल्पिक स्वचालन उपकरण

जबकि नाटककार गतिशील वेबसाइटों को स्क्रैप करने के लिए एक उत्कृष्ट विकल्प है, अन्य उपकरण विभिन्न परिदृश्यों के लिए उपयुक्त हो सकते हैं:

  1. सेलेनियम: सेलेनियम सबसे पुराने ब्राउज़र ऑटोमेशन फ्रेमवर्क में से एक है और नाटककार के समान काम करता है। यह अत्यधिक बहुमुखी है, लेकिन कुछ आधुनिक क्षमताओं का अभाव है जो नाटककार प्रदान करता है, जैसे कि एक एपीआई के साथ कई ब्राउज़रों को संभालना;
  2. कठपुतली: कठपुतली ब्राउज़र स्वचालन के लिए एक और लोकप्रिय उपकरण है, विशेष रूप से जावास्क्रिप्ट-भारी वेबसाइटों को स्क्रैप करने के लिए। नाटककार की तरह, यह हेडलेस ब्राउज़रों को नियंत्रित करता है और गतिशील सामग्री के साथ बातचीत की अनुमति देता है;
  3. हालाँकि, यह गतिशील सामग्री को अच्छी तरह से नहीं संभालता है।

प्रत्येक उपकरण अद्वितीय ताकत प्रदान करता है और परियोजना की विशिष्ट आवश्यकताओं और स्थितियों के आधार पर चुना जा सकता है।

गतिशील वेबसाइटों के सफल स्क्रैपिंग के लिए जो सक्रिय रूप से जावास्क्रिप्ट और अजाक्स अनुरोधों का उपयोग करते हैं, कुशलता से अनंत स्क्रॉलिंग और जटिल इंटरैक्टिव तत्वों को संभालने में सक्षम शक्तिशाली उपकरण आवश्यक हैं। ऐसा ही एक समाधान नाटककार है - Microsoft का एक उपकरण जो पूर्ण ब्राउज़र ऑटोमेशन प्रदान करता है, जो इसे इंस्टाग्राम जैसे प्लेटफार्मों के लिए एक आदर्श विकल्प बनाता है। HTML पार्सिंग के लिए LXML लाइब्रेरी के साथ संयुक्त, नाटककार डेटा निष्कर्षण को बहुत सरल बनाता है, पेज तत्वों के साथ बातचीत के स्वचालन और मैनुअल हस्तक्षेप के बिना पार्सिंग प्रक्रिया के लिए अनुमति देता है। इसके अतिरिक्त, प्रॉक्सी सर्वर का उपयोग एंटी-बॉट सुरक्षा को दरकिनार करने में मदद करता है और आईपी अवरुद्ध को रोकता है, स्थिर और निर्बाध स्क्रैपिंग संचालन सुनिश्चित करता है।

टिप्पणियाँ:

0 टिप्पणियाँ