कैसे पायथन का उपयोग करके रेडिट को खुरचने के लिए

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

स्क्रैपिंग Reddit ट्रेंडिंग विषयों, सामुदायिक जुड़ाव और लोकप्रिय पदों पर जानकारी का खजाना प्रदान करता है। यद्यपि Reddit का आधिकारिक API ऐसी सामग्री तक पहुँचने के लिए एक सामान्य उपकरण है, इसमें ऐसी सीमाएँ हैं जो डेटा चयन में अधिक लचीलापन प्रदान करके स्क्रैपिंग को पार कर सकती हैं। यह ट्यूटोरियल आपको डेटा निकालने के लिए डायनेमिक कंटेंट और LXML लाइब्रेरी के प्रबंधन के लिए एसिंक्रोनस प्लेराइट लाइब्रेरी का उपयोग करके मार्गदर्शन करेगा, जिससे रेडिट को स्क्रैप करने के लिए एक व्यापक दृष्टिकोण की अनुमति मिलती है।

चरण 1: पर्यावरण की स्थापना

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

pip install playwright
pip install  lxml

आवश्यक पुस्तकालयों को स्थापित करने के बाद, आपको नाटककार ब्राउज़र बायनेरिज़ को स्थापित करना होगा:

playwright install

केवल क्रोमियम ब्राउज़र स्थापित करने के लिए निम्न कमांड का उपयोग करें:

Playwright install chromium

ये उपकरण हमें Reddit की गतिशील सामग्री के साथ बातचीत करने, HTML को पार्स करने और आवश्यक डेटा निकालने में मदद करेंगे।

चरण 2: नाटककार के साथ पृष्ठ सामग्री प्राप्त करना

नाटककार एक शक्तिशाली उपकरण है जो हमें एक ब्राउज़र को नियंत्रित करने और एक मानव उपयोगकर्ता के रूप में वेब पेजों के साथ बातचीत करने की अनुमति देता है। हम इसका उपयोग Reddit पृष्ठ को लोड करने और HTML सामग्री प्राप्त करने के लिए करेंगे।

यहां Reddit पृष्ठ लोड करने के लिए Playwright Async कोड है:

import asyncio
from playwright.async_api import async_playwright

async def fetch_page_content():
    async with async_playwright() as playwright:
        browser = await playwright.chromium.launch(headless=False)
        context = await browser.new_context()
        page = await context.new_page()
        await page.goto("https://www.reddit.com/r/technology/top/?t=week")
        page_content = await page.content()
        await browser.close()
        return page_content

# पृष्ठ सामग्री प्राप्त करें
page_content = asyncio.run(fetch_page_content())

स्क्रैप करते समय, आप दर सीमित या आईपी अवरुद्ध जैसे मुद्दों का सामना कर सकते हैं। इन्हें कम करने के लिए, आप वास्तविक उपयोगकर्ता व्यवहार की नकल करने के लिए अपने आईपी पते और कस्टम हेडर को घुमाने के लिए प्रॉक्सी का उपयोग कर सकते हैं।

प्रॉक्सी का उपयोग करना

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

async def fetch_page_content_with_proxy():
    async with async_playwright() as playwright:
        browser = await playwright.chromium.launch(headless=True, proxy={
            "server": "http://proxy-server:port",
            "username": "your-username",
            "password": "your-password"
        })
        context = await browser.new_context()
        page = await context.new_page()
        await page.goto("https://www.reddit.com/r/technology/top/?t=week", wait_until='networkidle')
        page_content = await page.content()
        await browser.close()
        return page_content

चरण 3: LXML के साथ HTML सामग्री को पार्स करना

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

from lxml import html

# HTML सामग्री को पार्स करें
parser = html.fromstring(page_content)

तत्वों की पहचान करना

Reddit के R/Technology Subreddit पर शीर्ष पोस्ट अनुच्छेद तत्वों के भीतर निहित हैं। इन तत्वों को निम्नलिखित XPATH का उपयोग करके लक्षित किया जा सकता है:

# व्यक्तिगत पोस्ट तत्व निकालें
elements = parser.xpath('//article[@class="w-full m-0"]')

डेटा निष्कर्षण के लिए XPATH का उपयोग करना

XPath HTML दस्तावेज़ से नोड्स को नेविगेट करने और चुनने के लिए एक मजबूत उपकरण है। हम प्रत्येक पोस्ट से शीर्षक, लिंक और टैग निकालने के लिए इसका उपयोग करेंगे।

यहां प्रत्येक डेटा बिंदु के लिए विशिष्ट XPaths हैं:

Title: @aria-label
Link: .//div[@class="relative truncate text-12 xs:text-14 font-semibold mb-xs "]/a/@href
Tag: .//span[@class="bg-tone-4 inline-block truncate max-w-full text-12 font-normal align-text-bottom text-secondary box-border px-[6px] rounded-[20px] leading-4 relative top-[-0.25rem] xs:top-[-2px] my-2xs xs:mb-sm py-0 "]/div/text()

चरण 4: प्रत्येक पोस्ट से डेटा निकालना

अब जब हमने तत्वों को लक्षित किया है, तो हम प्रत्येक पोस्ट पर पुनरावृत्ति कर सकते हैं और आवश्यक डेटा निकाल सकते हैं।

posts_data = []

# प्रत्येक पोस्ट तत्व पर पुनरावृति
for element in elements:
    title = element.xpath('@aria-label')[0]
    link = element.xpath('.//div[@class="relative truncate text-12 xs:text-14 font-semibold  mb-xs "]/a/@href')[0]
    tag = element.xpath('.//span[@class="bg-tone-4 inline-block truncate max-w-full text-12 font-normal align-text-bottom text-secondary box-border px-[6px] rounded-[20px] leading-4  relative top-[-0.25rem] xs:top-[-2px] my-2xs xs:mb-sm py-0 "]/div/text()')[0].strip()
    
    post_info = {
        "title": title,
        "link": link,
        "tag": tag
    }
    
    posts_data.append(post_info)

चरण 5: JSON

के रूप में डेटा सहेजना

डेटा निकालने के बाद, हमें इसे एक संरचित प्रारूप में सहेजने की आवश्यकता है। JSON इस उद्देश्य के लिए एक व्यापक रूप से इस्तेमाल किया जाने वाला प्रारूप है।

import json

# डेटा को एक JSON फ़ाइल में सहेजें
with open('reddit_posts.json', 'w') as f:
    json.dump(posts_data, f, indent=4)

print("Data extraction complete. Saved to reddit_posts.json")

पूरा कोड

यहाँ R/Technology से Reddit की शीर्ष पोस्ट को स्क्रैप करने और JSON के रूप में डेटा को बचाने के लिए पूरा कोड है:

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

async def fetch_page_content():
    async with async_playwright() as playwright:
        browser = await playwright.chromium.launch(headless=True, proxy={
            "server": "IP:port",
            "username": "your-username",
            "password": "your-password"
        })
        context = await browser.new_context()
        page = await context.new_page()
        await page.goto("https://www.reddit.com/r/technology/top/?t=week", wait_until='networkidle')
        page_content = await page.content()
        await browser.close()
        return page_content

# पृष्ठ सामग्री प्राप्त करें
page_content = asyncio.run(fetch_page_content())

# LXML का उपयोग करके HTML सामग्री को पार्स करें
parser = html.fromstring(page_content)

# व्यक्तिगत पोस्ट तत्व निकालें
elements = parser.xpath('//article[@class="w-full m-0"]')

# निकाले गए डेटा को धारण करने के लिए एक सूची शुरू करें
posts_data = []

# प्रत्येक पोस्ट तत्व पर पुनरावृति
for element in elements:
    title = element.xpath('@aria-label')[0]
    link = element.xpath('.//div[@class="relative truncate text-12 xs:text-14 font-semibold  mb-xs "]/a/@href')[0]
    tag = element.xpath('.//span[@class="bg-tone-4 inline-block truncate max-w-full text-12 font-normal align-text-bottom text-secondary box-border px-[6px] rounded-[20px] leading-4  relative top-[-0.25rem] xs:top-[-2px] my-2xs xs:mb-sm py-0 "]/div/text()')[0].strip()
    
    post_info = {
        "title": title,
        "link": link,
        "tag": tag
    }
    
    posts_data.append(post_info)

# डेटा को एक JSON फ़ाइल में सहेजें
with open('reddit_posts.json', 'w') as f:
    json.dump(posts_data, f, indent=4)

print("Data extraction complete. Saved to reddit_posts.json")

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

टिप्पणियाँ:

0 टिप्पणियाँ