इस लेख में, हम Python का उपयोग करके GitHub रिपॉजिटरीज़ को स्क्रैप करने के तरीके का विश्लेषण करेंगे। हम BeautifulSoup और Requests जैसी प्रसिद्ध लाइब्रेरीज़ की समीक्षा करेंगे और GitHub स्क्रैपिंग स्क्रिप्ट बनाते समय विस्तृत विवरण प्रदान करेंगे ताकि आप इसे आसानी से फॉलो कर सकें।
GitHub स्क्रैपिंग क्या है और इसका उपयोग क्यों किया जाता है? इसके कई उद्देश्य हो सकते हैं, लेकिन सबसे सामान्य कारणों में शामिल हैं:
GitHub न केवल रिपॉजिटरीज़ की होस्टिंग प्रदान करता है, बल्कि इसका विशाल उपयोगकर्ता आधार और बेहतरीन प्रतिष्ठा इसे एक विश्वसनीय विकल्प बनाते हैं।
GitHub पर संग्रहीत जानकारी तकनीकी प्रगति के पैटर्न को ट्रैक करने और सॉफ्टवेयर विकास को बेहतर बनाने के लिए उपयोगी है। यह जानकारी सूचना प्रौद्योगिकी की दुनिया में प्रतिस्पर्धियों के साथ बने रहने के लिए आवश्यक है।
जब किसी वेबपेज को स्क्रैप करने की बात आती है, तो Python सबसे आसान भाषा है क्योंकि इसमें बहुत सी लाइब्रेरीज़ और मॉड्यूल्स होते हैं। GitHub स्क्रैपिंग के लिए आपको निम्नलिखित मॉड्यूल्स की आवश्यकता होगी:
GitHub स्क्रैपिंग टूल्स की मदद से यह सब कुछ आसानी से किया जा सकता है। हालाँकि, आइए विस्तार से समझते हैं कि इसे कैसे करना है।
यह अनुभाग दिखाएगा कि GitHub रिपॉजिटरीज़ को कैसे स्क्रैप किया जाए। स्क्रैपर बनाने के महत्वपूर्ण चरणों में शामिल हैं:
अब से हम इन सभी चरणों का विवरण और एक पूरी तरह कार्यात्मक GitHub स्क्रैपिंग स्क्रिप्ट साझा करेंगे।
सुनिश्चित करें कि आपके सिस्टम में Python इंस्टॉल है। इसके बाद, GitHub स्क्रैपिंग प्रक्रिया शुरू करने के लिए एक नया Python वर्चुअल एनवायरनमेंट बनाएं।
python -m venv github_scraper
source github_scraper/bin/activate # मैकओएस और लिनक्स के लिए
github_scraper\Scripts\activate # विंडोज के लिए
जैसा कि हमने पहले कहा, GitHub रिपॉजिटरीज़ को स्क्रैप करने के लिए BeautifulSoup और Requests आपकी मदद करेंगे। वर्तमान में सक्रिय वर्चुअल एनवायरनमेंट में, इन्हें अपने प्रोजेक्ट की डिपेंडेंसीज़ में शामिल करने के लिए यह कमांड चलाएं:
pip install beautifulsoup4 requests
कोई भी रिपॉजिटरी चुनें जिससे आप GitHub स्क्रैपिंग करना चाहते हैं। सबसे पहले, लिंक को एक वेरिएबल में परिभाषित करें, फिर एक HTTP अनुरोध भेजें जो पेज का कोड प्राप्त करेगा।
url = "https://github.com/TheKevJames/coveralls-python"
response = requests.get(url)
अपने HTML का विश्लेषण करने के लिए, आप उसे BeautifulSoup में भेजते हैं।
soup = BeautifulSoup(page.text, 'html.parser')
BeautifulSoup() कंस्ट्रक्टर को दो चीज़ें प्रदान करनी होती हैं।
HTML को BeautifulSoup द्वारा पार्स किया जाएगा और एक वृक्ष संरचना (ट्री स्ट्रक्चर) तैयार की जाएगी। विशेष रूप से, soup वेरिएबल में वे सभी मेथड्स शामिल होते हैं जो DOM ट्री से प्रासंगिक एलिमेंट्स को चुनने के लिए आवश्यक होते हैं, जैसे कि:
यह एक और महत्वपूर्ण चरण है: सरल HTML एलिमेंट्स का चयन करना और GitHub से डेटा को स्क्रैप करना। यह चरण Python GitHub रिपॉजिटरी स्क्रिप्ट लिखने से पहले किया जाता है।
GitHub को स्क्रैप करने से पहले, स्वयं वेबपेज से परिचित हो जाएं। इसके बाद, F12 दबाकर डेवलपर टूल्स खोलें। अब जब आपने कोड खोल लिया है, तो आप देखेंगे कि पेज पर कई एलिमेंट्स में यूनिक क्लासेस या विशेष एट्रिब्यूट्स नहीं हैं, जिससे उपयुक्त एलिमेंट तक नेविगेट करना आसान हो जाता। पूरे पेज को ध्यान से देखें और डेटा निकालने की तैयारी करें।
अब हम एक 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(',', '')
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 त्रुटि की जाँच करना याद रखें।
सारी जानकारी एक एकल डिक्शनरी में संग्रहीत की जाएगी ताकि हम उसे आसानी से 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
हम Python की बिल्ट-इन लाइब्रेरी का उपयोग करेंगे ताकि डेटा का विश्लेषण किया जा सके और उसे JSON प्रारूप में संग्रहीत किया जा सके, क्योंकि यह नेस्टेड संरचनाओं के लिए आदर्श होता है, जैसे कि हमारे मामले में जहां लेखों में सूचियाँ होती हैं।
with open('github_data.json', 'w', encoding='utf-8') as json_file:
json.dump(repo, json_file, ensure_ascii=False, indent=4)
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)
हमने BeautifulSoup और Requests की मदद से रिपॉजिटरीज़ के लिए GitHub स्क्रैपिंग स्क्रिप्ट बनाने की प्रक्रिया का विश्लेषण किया है। अब आप जानते हैं कि वेबपेज तक कैसे पहुँचा जाए, प्रासंगिक डेटा कैसे निकाला जाए, और उसे यूज़र-फ्रेंडली तरीके से कैसे प्रस्तुत किया जाए। ऐसी कौशल प्रसिद्ध प्रोजेक्ट्स का विश्लेषण करने, कोड में हुए परिवर्तनों को ट्रैक करने या रिपोर्ट तैयार करने में उपयोगी हो सकती हैं।
फिर भी, जिम्मेदारी के साथ उपयोग करना ज़रूरी है। अधिकांश समय GitHub पर उपयोग के लिए API उपलब्ध होती है, जो अधिक सरल और व्यावहारिक होती है। यदि आप वेब स्क्रैपिंग करने का निर्णय लेते हैं, तो सुनिश्चित करें कि आप साइट के दिशानिर्देशों का पालन करते हैं और सर्वर पर अत्यधिक अनुरोध भेजकर उसे अधिभारित न करें।
टिप्पणियाँ: 0