Python का उपयोग करके सार्वजनिक GitHub रिपॉजिटरीज़ को कैसे स्क्रैप करें?

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

लेख की सामग्री:

इस लेख में, हम Python का उपयोग करके GitHub रिपॉजिटरीज़ को स्क्रैप करने के तरीके का विश्लेषण करेंगे। हम BeautifulSoup और Requests जैसी प्रसिद्ध लाइब्रेरीज़ की समीक्षा करेंगे और GitHub स्क्रैपिंग स्क्रिप्ट बनाते समय विस्तृत विवरण प्रदान करेंगे ताकि आप इसे आसानी से फॉलो कर सकें।

GitHub रिपॉजिटरीज़ को स्क्रैप क्यों करें?

GitHub स्क्रैपिंग क्या है और इसका उपयोग क्यों किया जाता है? इसके कई उद्देश्य हो सकते हैं, लेकिन सबसे सामान्य कारणों में शामिल हैं:

  • प्रौद्योगिकी उन्नति की निगरानी करना। स्टार्स और रिपॉजिटरीज़ पर नज़र रखना प्रोग्रामिंग भाषाओं, फ्रेमवर्क्स और लाइब्रेरीज़ के रुझानों को ट्रैक करने का एक शानदार तरीका है। यह जानकारी तकनीक के कार्यान्वयन, कौशल विकास या संसाधन आवंटन से संबंधित निर्णय लेने में महत्वपूर्ण हो सकती है।
  • प्रोग्रामिंग रिपॉजिटरी का उपयोग करना। GitHub पर कई ओपन-सोर्स प्रोजेक्ट्स, उदाहरण और समाधान उपलब्ध हैं। इसलिए, शैक्षिक उद्देश्यों, प्रोग्रामिंग कौशल को बेहतर बनाने और तकनीक के कार्यान्वयन को समझने के लिए उपयोगी प्रोग्रामिंग ज्ञान आसानी से प्लेटफॉर्म पर सुलभ है।

GitHub न केवल रिपॉजिटरीज़ की होस्टिंग प्रदान करता है, बल्कि इसका विशाल उपयोगकर्ता आधार और बेहतरीन प्रतिष्ठा इसे एक विश्वसनीय विकल्प बनाते हैं।

GitHub पर संग्रहीत जानकारी तकनीकी प्रगति के पैटर्न को ट्रैक करने और सॉफ्टवेयर विकास को बेहतर बनाने के लिए उपयोगी है। यह जानकारी सूचना प्रौद्योगिकी की दुनिया में प्रतिस्पर्धियों के साथ बने रहने के लिए आवश्यक है।

GitHub स्क्रैपिंग के लिए आवश्यक लाइब्रेरीज़ और टूल्स

जब किसी वेबपेज को स्क्रैप करने की बात आती है, तो Python सबसे आसान भाषा है क्योंकि इसमें बहुत सी लाइब्रेरीज़ और मॉड्यूल्स होते हैं। GitHub स्क्रैपिंग के लिए आपको निम्नलिखित मॉड्यूल्स की आवश्यकता होगी:

  • requests: यह HTTP अनुरोधों और प्रतिक्रियाओं को संभालने वाली सबसे सामान्य क्लाइंट लाइब्रेरी है।
  • BeautifulSoup: यह HTML से जानकारी निकालने में अत्यधिक सक्षम है और इसमें डेटा को नेविगेट और प्राप्त करने के लिए उन्नत फीचर्स होते हैं।
  • Selenium: यह एक वास्तविक ब्राउज़र लॉन्च करता है और पेज के तत्वों पर क्लिक करने और टाइप करने की अनुमति देता है।

GitHub स्क्रैपिंग टूल्स की मदद से यह सब कुछ आसानी से किया जा सकता है। हालाँकि, आइए विस्तार से समझते हैं कि इसे कैसे करना है।

Beautiful Soup के साथ GitHub रिपॉजिटरी स्क्रैपिंग स्क्रिप्ट बनाना

यह अनुभाग दिखाएगा कि GitHub रिपॉजिटरीज़ को कैसे स्क्रैप किया जाए। स्क्रैपर बनाने के महत्वपूर्ण चरणों में शामिल हैं:

  1. बेस सेट बनाना – जिसमें Python और आवश्यक लाइब्रेरीज़ को डाउनलोड करना शामिल है।
  2. GitHub पेज का HTML कोड सेव करना।
  3. पेज के लेआउट की जाँच करना ताकि आवश्यक तत्वों की पहचान की जा सके।
  4. जानकारी इकट्ठा करना – जिसमें खाता नाम, विवरण और स्टार्स की संख्या जैसी चीजें शामिल हैं।
  5. डेटा को फाइल सिस्टम में स्टोर करना।

अब से हम इन सभी चरणों का विवरण और एक पूरी तरह कार्यात्मक GitHub स्क्रैपिंग स्क्रिप्ट साझा करेंगे।

चरण 1: अपने Python प्रोजेक्ट एनवायरनमेंट की सेटअप

सुनिश्चित करें कि आपके सिस्टम में Python इंस्टॉल है। इसके बाद, GitHub स्क्रैपिंग प्रक्रिया शुरू करने के लिए एक नया Python वर्चुअल एनवायरनमेंट बनाएं।


python -m venv github_scraper
source github_scraper/bin/activate  # मैकओएस और लिनक्स के लिए
github_scraper\Scripts\activate     # विंडोज के लिए

चरण 2: आवश्यक Python लाइब्रेरीज़ इंस्टॉल करना

जैसा कि हमने पहले कहा, GitHub रिपॉजिटरीज़ को स्क्रैप करने के लिए BeautifulSoup और Requests आपकी मदद करेंगे। वर्तमान में सक्रिय वर्चुअल एनवायरनमेंट में, इन्हें अपने प्रोजेक्ट की डिपेंडेंसीज़ में शामिल करने के लिए यह कमांड चलाएं:


pip install beautifulsoup4 requests

चरण 3: लक्षित GitHub पेज तक पहुंचना और उसे डाउनलोड करना

कोई भी रिपॉजिटरी चुनें जिससे आप GitHub स्क्रैपिंग करना चाहते हैं। सबसे पहले, लिंक को एक वेरिएबल में परिभाषित करें, फिर एक HTTP अनुरोध भेजें जो पेज का कोड प्राप्त करेगा।


url = "https://github.com/TheKevJames/coveralls-python"
response = requests.get(url)

चरण 4: HTML संरचना को समझना और पार्स करना

अपने HTML का विश्लेषण करने के लिए, आप उसे BeautifulSoup में भेजते हैं।


soup = BeautifulSoup(page.text, 'html.parser')

BeautifulSoup() कंस्ट्रक्टर को दो चीज़ें प्रदान करनी होती हैं।

  1. एक स्ट्रिंग जिसमें HTML सामग्री होती है, जिसे page.text वेरिएबल में संग्रहीत किया जाता है।
  2. वह पार्सर जिसे Beautiful Soup उपयोग करेगा: “html.parser” Python का बिल्ट-इन HTML पार्सर है।

HTML को BeautifulSoup द्वारा पार्स किया जाएगा और एक वृक्ष संरचना (ट्री स्ट्रक्चर) तैयार की जाएगी। विशेष रूप से, soup वेरिएबल में वे सभी मेथड्स शामिल होते हैं जो DOM ट्री से प्रासंगिक एलिमेंट्स को चुनने के लिए आवश्यक होते हैं, जैसे कि:

  • find(): यह पहले HTML एलिमेंट को लौटाता है जो दिए गए सिलेक्टर स्ट्रैटेजी से मेल खाता है।
  • find_all(): यह उन सभी HTML एलिमेंट्स की सूची लौटाता है जो इनपुट सिलेक्टर स्ट्रैटेजी से मेल खाते हैं।
  • select_one(): यह पहले HTML एलिमेंट को लौटाता है जो दिए गए CSS सिलेक्टर से मेल खाता है।
  • select(): यह उन HTML एलिमेंट्स की सूची लौटाता है जो दिए गए CSS सिलेक्टर से मेल खाते हैं।

चरण 5: लक्षित पेज का प्रासंगिक डेटा के लिए विश्लेषण

यह एक और महत्वपूर्ण चरण है: सरल HTML एलिमेंट्स का चयन करना और GitHub से डेटा को स्क्रैप करना। यह चरण Python GitHub रिपॉजिटरी स्क्रिप्ट लिखने से पहले किया जाता है।

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

चरण 6: रिपॉजिटरी विवरण निकालना

अब हम एक Python स्क्रिप्ट बनाने के लिए तैयार हैं जो GitHub रिपॉजिटरीज़ को स्क्रैप करने में हमारी मदद करेगी। यह स्क्रिप्ट GitHub में संग्रहीत उपयोगी जानकारी जैसे स्टार्स, विवरण, अंतिम कमिट आदि को निकाल सकती है। इसके लिए, हमें आवश्यक विशेषताओं को निर्दिष्ट करना होगा और संबंधित टेक्स्ट वैल्यू को पुनः प्राप्त करना होगा।

  • रिपॉजिटरी का नाम:
  • 
    repo_title = soup.select_one('[itemprop="name"]').text.strip()
    

    itemprop="name" एट्रिब्यूट का एक ऐसा मान होता है जिसकी एक अद्वितीय पहचान होती है, इसलिए हम इसे पुनः प्राप्त करते हैं। GitHub पर टेक्स्ट फील्ड्स में आमतौर पर स्पेस और न्यूलाइन कैरेक्टर्स होते हैं, जिन्हें strip() का उपयोग करके साफ़ किया जा सकता है।

  • वर्तमान शाखा:
    
    git_branch_icon_html_element = soup.select_one('[class="Box-sc-g0xbh4-0 ffLUq ref-selector-button-text-container"]').text.split()
    

    ध्यान दें कि मुख्य शाखा के शीर्षक को रखने वाले HTML कंपोनेंट को चुनने का कोई सरल तरीका नहीं है। तो आप क्या कर सकते हैं? एक यूनिक क्लास चुनें और उससे टेक्स्ट प्राप्त करें।

  • अंतिम कमिट:
    
    relative_time_html_element = soup.select_one('relative-time')
    latest_commit = relative_time_html_element['datetime']
    

    हमने देखा कि relative-time टैग, जिसमें उपयोगकर्ता द्वारा किया गया अंतिम कमिट संग्रहीत होता है, पहले से चयनित था, और दिनांक datetime से प्राप्त किया गया।

बाईं ओर स्थित जानकारी एकत्र करें: विवरण, स्टार्स, दृश्य, और फोर्क्स।

  • विवरण:
    
    bordergrid_html_element = soup.select_one('.BorderGrid')
    about_html_element = bordergrid_html_element.select_one('h2')
    description_html_element = about_html_element.find_next_sibling('p')
    description = description_html_element.get_text().strip()
    
  • स्टार्स:
    
    star_icon_html_element = bordergrid_html_element.select_one('.octicon-star')
    stars_html_element = star_icon_html_element.find_next_sibling('strong')
    stars = stars_html_element.get_text().strip().replace(',', '')
    
  • व्यूज़:
    
    eye_icon_html_element = bordergrid_html_element.select_one('.octicon-eye')
    watchers_html_element = eye_icon_html_element.find_next_sibling('strong')
    watchers = watchers_html_element.get_text().strip().replace(',', '')
    
  • फोर्क्स:
    
    fork_icon_html_element = bordergrid_html_element.select_one('.octicon-repo-forked')
    forks_html_element = fork_icon_html_element.find_next_sibling('strong')
    forks = forks_html_element.get_text().strip().replace(',', '')
    

चरण 7: Readme फ़ाइलों को एकत्र करना और उनका विश्लेषण करना

Readme फ़ाइल बहुत महत्वपूर्ण होती है। यह रिपॉजिटरी का विवरण और कोड को लागू करने के निर्देश प्रदान करती है। यदि आप readme.md फ़ाइल की जाँच करते हैं, तो आप देख सकते हैं कि उसका लिंक क्या है:


https://raw.githubusercontent.com///readme.md

चूंकि हमारे पास लिंक है, हम प्रोग्रामेटिक रूप से f-string का उपयोग करके URL बना सकते हैं, उसे उपयोग कर सकते हैं, और फ़ाइल कोड प्राप्त करने के लिए HTTP अनुरोध कर सकते हैं।


readme_url = f'https://github.com/TheKevJames/coveralls-python/blob/{main_branch}/readme.rst'
readme_page = requests.get(readme_url)

readme = None
if readme_page.status_code != 404:
    readme = readme_page.text

अगर रिपॉजिटरी में readme फ़ाइल नहीं है, तो GitHub की 404 पेज की सामग्री को सेव होने से रोकने के लिए 404 त्रुटि की जाँच करना याद रखें।

चरण 8: स्क्रैप किए गए डेटा को व्यवस्थित करना और प्रभावी रूप से संग्रहित करना

सारी जानकारी एक एकल डिक्शनरी में संग्रहीत की जाएगी ताकि हम उसे आसानी से JSON फ़ाइल में लिख सकें।


repo = {}
repo['name'] = repo_title
repo['latest_commit'] = latest_commit
repo['main_branch'] = main_branch
repo['description'] = description
repo['stars'] = stars
repo['watchers'] = watchers
repo['forks'] = forks
repo['readme'] = readme

चरण 9: स्क्रैप किए गए डेटा को JSON प्रारूप में निर्यात करना

हम Python की बिल्ट-इन लाइब्रेरी का उपयोग करेंगे ताकि डेटा का विश्लेषण किया जा सके और उसे JSON प्रारूप में संग्रहीत किया जा सके, क्योंकि यह नेस्टेड संरचनाओं के लिए आदर्श होता है, जैसे कि हमारे मामले में जहां लेखों में सूचियाँ होती हैं।


with open('github_data.json', 'w', encoding='utf-8') as json_file:
  json.dump(repo, json_file, ensure_ascii=False, indent=4)

चरण 10: एक पूर्ण स्क्रिप्ट में सभी चरणों को एकीकृत करना


import json
import requests
from bs4 import BeautifulSoup

url = "https://github.com/TheKevJames/coveralls-python"
response = requests.get(url)
soup = BeautifulSoup(response.text, "lxml")

repo_title = soup.select_one('[itemprop="name"]').text.strip()

# शाखा
main_branch = soup.select_one(
   '[class="Box-sc-g0xbh4-0 ffLUq ref-selector-button-text-container"]').text.split()

# नवीनतम प्रतिबद्ध
relative_time_html_element = soup.select_one('relative-time')
latest_commit = relative_time_html_element['datetime']

# विवरण
bordergrid_html_element = soup.select_one('.BorderGrid')
about_html_element = bordergrid_html_element.select_one('h2')
description_html_element = about_html_element.find_next_sibling('p')
description = description_html_element.get_text().strip()

# सितारे
star_icon_html_element = bordergrid_html_element.select_one('.octicon-star')
stars_html_element = star_icon_html_element.find_next_sibling('strong')
stars = stars_html_element.get_text().strip().replace(',', '')

# पर नजर रखने वालों
eye_icon_html_element = bordergrid_html_element.select_one('.octicon-eye')
watchers_html_element = eye_icon_html_element.find_next_sibling('strong')
watchers = watchers_html_element.get_text().strip().replace(',', '')

# कांटे
fork_icon_html_element = bordergrid_html_element.select_one('.octicon-repo-forked')
forks_html_element = fork_icon_html_element.find_next_sibling('strong')
forks = forks_html_element.get_text().strip().replace(',', '')

# रीडमी
readme_url = f'https://github.com/TheKevJames/coveralls-python/blob/{main_branch}/readme.rst'
readme_page = requests.get(readme_url)

readme = None
if readme_page.status_code != 404:
   readme = readme_page.text

repo = {}
repo['name'] = repo_title
repo['latest_commit'] = latest_commit
repo['main_branch'] = main_branch
repo['description'] = description
repo['stars'] = stars
repo['watchers'] = watchers
repo['forks'] = forks
repo['readme'] = readme

with open('github_data.json', 'w', encoding='utf-8') as json_file:
   json.dump(repo, json_file, ensure_ascii=False, indent=4)

GitHub स्क्रैपिंग: निष्कर्ष

हमने BeautifulSoup और Requests की मदद से रिपॉजिटरीज़ के लिए GitHub स्क्रैपिंग स्क्रिप्ट बनाने की प्रक्रिया का विश्लेषण किया है। अब आप जानते हैं कि वेबपेज तक कैसे पहुँचा जाए, प्रासंगिक डेटा कैसे निकाला जाए, और उसे यूज़र-फ्रेंडली तरीके से कैसे प्रस्तुत किया जाए। ऐसी कौशल प्रसिद्ध प्रोजेक्ट्स का विश्लेषण करने, कोड में हुए परिवर्तनों को ट्रैक करने या रिपोर्ट तैयार करने में उपयोगी हो सकती हैं।

फिर भी, जिम्मेदारी के साथ उपयोग करना ज़रूरी है। अधिकांश समय GitHub पर उपयोग के लिए API उपलब्ध होती है, जो अधिक सरल और व्यावहारिक होती है। यदि आप वेब स्क्रैपिंग करने का निर्णय लेते हैं, तो सुनिश्चित करें कि आप साइट के दिशानिर्देशों का पालन करते हैं और सर्वर पर अत्यधिक अनुरोध भेजकर उसे अधिभारित न करें।

टिप्पणियाँ:

0 टिप्पणियाँ