اس مضمون میں ہم 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 # For MacOS and Linux
github_scraper\Scripts\activate # For Windows
جیسا کہ ہم نے پہلے ذکر کیا، 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 کے ذریعے پارس کیا جائے گا اور ایک درختی ساخت (Tree Structure) بنائی جائے گی۔ خاص طور پر، soup ویری ایبل میں وہ تمام طریقے (methods) شامل ہوتے ہیں جو DOM ٹری سے متعلقہ عناصر منتخب کرنے کے لیے ضروری ہوتے ہیں، جیسے کہ:
یہ ایک اور اہم مرحلہ ہے: سادہ HTML عناصر کا انتخاب کرنا اور ان سے GitHub ڈیٹا اسکریپ کرنا۔ یہ مرحلہ Python GitHub ریپوزٹری اسکرپٹ لکھنے سے پہلے کیا جاتا ہے۔
GitHub کو اسکریپ کرنے سے پہلے، ویب صفحے سے خود کو واقف کریں۔ اس کے بعد، F12 دباکر ڈویلپر ٹولز کھولیں۔ اب جب آپ نے کوڈ کھول لیا ہے، تو آپ دیکھیں گے کہ صفحے پر موجود بہت سے عناصر کے پاس منفرد کلاسز یا ایٹریبیوٹس نہیں ہیں جو کسی مخصوص عنصر تک رسائی آسان بناتے۔ صفحے کا بغور جائزہ لیں اور ڈیٹا نکالنے کے لیے تیاری کریں۔
اب ہم Python کی ایک ایسی اسکرپٹ بنانے کے لیے تیار ہیں جو GitHub ریپوزٹریز کو اسکریپ کرنے میں ہماری مدد کرے گی۔ یہ اسکرپٹ GitHub میں محفوظ اہم معلومات جیسے اسٹارز، تفصیل، آخری کمٹس وغیرہ کو نکال سکتی ہے۔ اس کے لیے ہمیں ضروری فیچرز کو واضح کرنا ہوگا اور متعلقہ ٹیکسٹ ویلیوز کو حاصل کرنا ہوگا۔
repo_title = soup.select_one('[itemprop="name"]').text.strip()
attribute itemprop="name" کی ایک منفرد پہچان والی ویلیو ہوتی ہے، اسی لیے ہم اسے حاصل کرتے ہیں۔ GitHub پر موجود ٹیکسٹ فیلڈز میں عام طور پر خالی جگہیں اور نئی لائن کے کردار (newline characters) ہوتے ہیں، جنہیں ()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()
# branch
main_branch = soup.select_one(
'[class="Box-sc-g0xbh4-0 ffLUq ref-selector-button-text-container"]').text.split()
# latest commit
relative_time_html_element = soup.select_one('relative-time')
latest_commit = relative_time_html_element['datetime']
# description
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()
# stars
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(',', '')
# watchers
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(',', '')
# forks
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_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