ailiteracynepal 🇳🇵
पाठ आकार

अध्याय २ · खण्ड III · 26 मिनेट

जिम्मेवारीसँग स्क्र्यापिङ — र यसका सीमा

API नभएको बेला, स्क्र्यापिङ अन्तिम सहारा हो। यो काम गर्छ — र वास्तविक नैतिक, कानुनी, र प्राविधिक बाधासहित आउँछ। कहिले स्क्र्याप गर्ने, कसरी राम्रोसँग गर्ने, र कहिले हट्ने जान्नु निर्माताको सीप हो।

कहिलेकाहीं तपाईंलाई चाहिने डाटा वेब पृष्ठमा बस्छ र साइटमा API छैन। नेपाली समाचार हेडलाइन, मन्त्रालय परिपत्र, सार्वजनिक विद्यालय ठेगाना, फिडका रूपमा होइन HTML का रूपमा अस्तित्वमा रहेका NEPSE तालिका। स्क्र्यापिङ — पृष्ठ ल्याउने र चाहिएको डाटा निकाल्ने कार्यक्रम लेख्ने — वास्तविक प्रविधि हो, र अधिकांश निर्माताले कहिलेकाहीं प्रयोग गर्छन्। यो सुरुआतीहरूले प्रायः गाह्रो तरिकाले पत्ता लगाउने नियम र बाधाहरूले घेरिएको पनि छ। यो खण्डले कहिले स्क्र्यापिङ उचित छ, कसरी सफा रूपमा गर्ने, र कहिले छोडेर सिधै डाटा माग्ने ओगट्छ।

स्क्र्यापिङ वास्तवमा के हो

स्क्र्यापर त्यो कार्यक्रम हो जसले ब्राउजरमा मानिसले गर्ने काम कोडमा गर्छ। यो URL अनुरोध गर्छ, HTML प्राप्त गर्छ, तपाईंले चाहेको डाटा भएको HTML का भागहरू भेट्छ, र तिनलाई प्रयोगयोग्य ढाँचामा निकाल्छ।

Python मा, तपाईंले समात्ने दुई पुस्तकालय requests (HTML ल्याउन — पछिल्लो खण्डकै पुस्तकालय) र BeautifulSoup (HTML पार्स गर्न) हुन्:

pip install beautifulsoup4

न्यूनतम ढाँचा:

import requests
from bs4 import BeautifulSoup

response = requests.get("https://example.com/some-page")
soup = BeautifulSoup(response.text, "html.parser")

for heading in soup.find_all("h2"):
    print(heading.get_text(strip=True))

त्यसले पृष्ठ ल्याउँछ र त्यसमा भएका हरेक <h2> हेडिङ प्रिन्ट गर्छ। अधिकांश स्क्र्यापिङ यो आकारको कुनै विस्तार हो।

स्क्र्यापिङ कहिले उचित हुन्छ (र कहिले हुँदैन)

स्क्र्यापरको एक लाइन लेख्नुअघि, छोटो जाँच सूचीबाट हिँड्नुहोस्:

  1. के साइटमा API छ? कागजात जाँच्नुहोस्। /api बाटो जाँच्नुहोस्। “[साइट नाम] developer” खोज्नुहोस्। API नभएको देखिने धेरै साइटमा हेर्नुभयो भने वास्तवमै हुन्छ।
  2. के तपाईंले डाटा माग्न सक्नुहुन्छ? केही मन्त्रालय, NGO, र व्यवसायले भद्र इमेल लेखेमा CSV पठाउँछन्। तपाईंलाई 30 मिनेट लाग्छ; हप्तौंको भङ्गुर स्क्र्यापिङबाट बचाउँछ।
  3. साइटको सेवाका सर्तले के भन्छ? धेरै साइटले स्पष्ट रूपमा स्क्र्यापिङ निषेध गर्छन्। केहीले व्यक्तिगत वा अनुसन्धान प्रयोगका लागि अनुमति दिन्छन् तर व्यावसायिकका लागि होइन। सर्त पढ्नुहोस्, छोटो भए पनि।
  4. robots.txt ले के भन्छ? झन्डै हरेक साइटको /robots.txt (जस्तै example.com/robots.txt) मा फाइल हुन्छ जसले कुन स्वचालित एजेन्ट पहुँच पाउने स्वागत छ र छैन घोषणा गर्छ। यसको सम्मान गर्नुहोस् — दुवै यो भद्र काम भएकाले र केही न्यायाधिकारमा यसको सम्मान नगर्नु कानुनी समस्या भएकाले।
  5. के तपाईं व्यक्तिगत डाटा लिँदै हुनुहुन्छ? नाम, ठेगाना, पहिचानयोग्य मानिसका फोटो, व्यक्तिसँग जोडिन सक्ने कुनै पनि कुरा। यदि हो भने, स्क्र्यापिङले गम्भीर गोपनीयता चिन्ता ल्याउँछ जुन हामी अध्याय 6 मा राम्ररी ओगट्छौं।

यदि तपाईं “API/इमेल उपलब्ध छैन, सर्तले अनुमति दिन्छ, robots.txt ले अनुमति दिन्छ, र डाटा व्यक्तिगत होइन” भन्न सक्नुहुन्छ भने, सफा विवेकले स्क्र्याप गर्न सक्नुहुन्छ। यदि कुनै “होइन” छ भने, रोकेर पुन: विचार गर्नुहोस्।

भद्र स्क्र्यापर, सुरुदेखि अन्त्यसम्म

नेपाली समाचार हेडलाइनका लागि सानो स्क्र्यापर, एकैचोटि सिक्न लायक हरेक बानी देखाउँदै:

import time
import requests
from bs4 import BeautifulSoup

BASE = "https://example-news-site.np"
HEADERS = {
    "User-Agent": "AILiteracyNepal-Scraper/1.0 (contact: you@example.com)",
}


def fetch_headlines(category: str) -> list[str]:
    url = f"{BASE}/category/{category}"
    response = requests.get(url, headers=HEADERS, timeout=10)
    response.raise_for_status()

    soup = BeautifulSoup(response.text, "html.parser")
    headlines = [
        h.get_text(strip=True)
        for h in soup.select("article.news h2")
    ]
    return headlines


if __name__ == "__main__":
    for category in ["politics", "business", "sports"]:
        print(f"--- {category} ---")
        for headline in fetch_headlines(category):
            print(headline)
        time.sleep(2)

लिनलायक चार बानी:

  • वर्णनात्मक User-Agent आफ्नो स्क्र्यापरलाई इमानदारीसाथ पहिचान दिनुहोस्। धेरै साइटले User-Agent बिनाको वा पूर्वनिर्धारित python-requests/2.x भएको अनुरोध रोक्छन्। सम्पर्क इमेलसहितको वास्तविक स्ट्रिङले समस्या हुँदा साइटलाई तपाईंसँग सम्पर्क गर्न पनि सजिलो बनाउँछ — चुपचाप रोकिनुभन्दा राम्रो।
  • timeout=10 — पछिल्लो खण्डकै पाठ।
  • अनुरोधबीच time.sleep(2) ढिलो गर्नुहोस्। समाचार साइट पढ्ने मानिसले एक सेकेन्डमा दश लेख क्लिक गर्दैन। तपाईंको स्क्र्यापरले पनि गर्नुहुँदैन।
  • लक्षित चयनकर्ता ("article.news h2")। तपाईंलाई वास्तवमै चाहिने डाटा मात्र तान्नुहोस्। “के थाहा” भनेर पूरा आर्काइभ डाउनलोड नगर्नुहोस्।

HTML सामान्यतया एक वर्षभित्र बिग्रन्छ

स्क्र्यापिङको व्यवहारिक यथार्थ: HTML संरचना बदलिन्छन्। आज काम गर्ने चयनकर्ता article.news h2 साइट पुनःडिजाइन भएको छ महिनापछि div.headline-wrapper h3 हुनसक्छ। तपाईंको स्क्र्यापरले चुपचाप केही फिर्ता गर्दैन, वा खराब, बकवास फिर्ता गर्छ।

रक्षात्मक चालहरू:

headlines = soup.select("article.news h2")
if not headlines:
    raise RuntimeError(f"No headlines found on {url} — has the page structure changed?")

ठूलो विफलता चुपचापको भन्दा राम्रो हो। साइट बदलिँदा खाली सूची फिर्ता गर्ने स्क्र्यापर कसैले ध्यान दिनुअघि हप्तौंसम्म चल्न सक्छ।

गतिशील पृष्ठ — जब requests एक्लै पर्याप्त छैन

केही साइटले आफ्नो सामग्री पहिले पठाएको HTML मा रेन्डर गर्दैनन्। पृष्ठ लोड हुन्छ, अनि ब्राउजरमा JavaScript चल्छ र डाटा पृष्ठमा ल्याउँछ। requests.get ले JavaScript चल्नुअघिको पहिलो HTML मात्र पाउँछ — त्यसैले तपाईंलाई चाहिने डाटा छुटिराखेको हुन्छ।

तपाईं यो भोगिरहनुभएको सङ्केत:

  • ब्राउजरमा पृष्ठ भेट गर्दा तपाईं डाटा देख्न सक्नुहुन्छ।
  • उही पृष्ठ requests.get ले ल्याएर प्रिन्ट गर्दा कुनै डाटा देखिँदैन।
  • HTML धेरै हदसम्म <div id="app"> जस्ता नाम भएका खाली कन्टेनर हुन्छन्।

यहाँबाट दुई बाटो:

  1. JavaScript आफैले बोलाइरहेको आधारभूत API भेट्नुहोस्। ब्राउजरको Developer Tools खोल्नुहोस्, Network ट्याबमा सर्नुहोस्, पृष्ठ रिलोड गर्नुहोस्, र XHR/fetch अनुरोध खोज्नुहोस्। प्रायः JavaScript आफैले JSON API बोलाइरहेको हुन्छ — र तपाईं उहीलाई requests ले सिधै बोलाएर स्क्र्यापिङ पूरै स्किप गर्न सक्नुहुन्छ। यो सबैभन्दा सफा बाटो हो।
  2. हेडलेस ब्राउजर प्रयोग गर्नुहोस्। playwright वा selenium जस्ता पुस्तकालयले पृष्ठभूमिमा वास्तविक ब्राउजर चलाउँछन्, JavaScript कार्यान्वयन गर्छन्, र नतिजा HTML पढ्न दिन्छन्। भारी (ढिलो, बढी निर्भरता) तर विकल्प 1 असफल हुँदा काम गर्छ।

Course 02 का लागि हामी requests + BeautifulSoup मा रहनेछौं। वास्तविक परियोजनाका लागि हेडलेस ब्राउजर चाहिन्छ भने, ढाँचा सर्छ — उही चयनकर्ता, उही चीजहरू लोड हुन पर्खने अनुशासन।

कहिले स्क्र्यापिङ रोकेर सिधै माग्ने

विकास गर्न लायक उपयोगी प्रवृत्ति: हरेक पटक तपाईंले स्क्र्यापिङ समस्यामा आधा दिनभन्दा बढी खर्च गर्नुहुन्छ — चयनकर्तासँग लडदै, रेट सीमासँग लडदै, JavaScript सँग लडदै — रोकेर डाटा मालिकलाई भद्र इमेलले काम गर्थ्यो कि सोध्नुहोस्। अचम्मलाग्दो रूपमा प्रायः उत्तर “हो” हो। सरकारी डाटा कार्यालय, NGO, र सार्वजनिक डाटा भएका निजी व्यवसायले प्रायः अनुसन्धानकर्तासँग डाटा साझा गर्ने काम भएको सम्पर्क व्यक्ति राख्छन्। तिनी प्रायः साझा गर्न चाहन्छन्। तिनलाई प्रायः सोधिँदैन।

यो दीर्घकालीन सम्बन्ध पनि हो। मन्त्रालयलाई इमेल गर्ने, डाटा भद्रसँग पाउने, र आफ्नो प्रकाशित कार्यमा स्रोतलाई श्रेय दिने निर्माताले स्क्र्याप गरेर कसैले ध्यान दिने पर्खिने व्यक्तिभन्दा धेरै न्यानो स्वागत पाउँछन्। नेपालको सानो डाटा समुदायमा प्रतिष्ठा यात्रा गर्छ।

आफ्नो बुझाइ जाँच्नुहोस्

Quick check

तपाईं शिक्षा मन्त्रालयको पृष्ठबाट नेपाली विद्यालय ठेगाना प्रयोग गर्ने सानो परियोजना बनाउन चाहनुहुन्छ। पृष्ठले तिनलाई सूचीबद्ध गर्छ। मन्त्रालयसँग स्पष्ट API छैन। यो खण्डअनुसार *पहिले* कोसिस गर्ने कुरा के हो?

Quick check

तपाईंको स्क्र्यापर दुई हप्ता चलिरहेको छ। एकाएक हरेक दिन हेडलाइनको खाली सूची फिर्ता गर्न थाल्छ। तपाईंको ब्राउजरमा वेबसाइट अझै ठीक चल्छ। सम्भावित कारण के हो?

अब के आउँछ

तपाईं अब फाइल, API, र (ध्यानले) वेबबाट डाटा पाउन सक्नुहुन्छ। यी झन्डै सबै फोहोर आउनेछन्। अध्याय 3 अर्को छलाङ हो: वास्तविक डाटा सफा गर्ने — छुटेका मान, डुप्लिकेट, बिग्रिएका प्रकार, एन्कोडिङ अव्यवस्था, साना असङ्गति जसले मोडेलले सत्य सिक्छ वा टाइपो भन्ने निर्णय गर्छन्। यहीँ तपाईंका अधिकांश घण्टा जान्छन्। यो तपाईंको अधिकांश निर्णय बन्ने ठाउँ पनि हो।