Python کا استعمال کرتے ہوئے عوامی GitHub ریپوزٹریز کو کیسے اسکریپ کریں؟

تبصرے: 0

اس مضمون میں ہم Python کا استعمال کرتے ہوئے GitHub ریپوزٹریز کو اسکریپ کرنے کا طریقہ تجزیہ کریں گے۔ ہم معروف لائبریریز جیسے BeautifulSoup اور Requests کا جائزہ لیں گے اور GitHub اسکریپنگ اسکرپٹ بناتے وقت تفصیلی وضاحت فراہم کریں گے تاکہ آپ آسانی سے فالو کر سکیں۔

GitHub ریپوزٹریز کو اسکریپ کیوں کریں؟

GitHub اسکریپنگ کیا ہے اور اس کا مقصد کیا ہے؟ اس کے کئی مقاصد ہو سکتے ہیں، لیکن سب سے عام درج ذیل ہیں:

  • ٹیکنالوجی کی ترقی کی نگرانی کے لیے۔ اسٹارز اور ریپوزٹریز پر نظر رکھنا پروگرامنگ زبانوں، فریم ورکس، اور لائبریریز کے رجحانات کو ٹریک کرنے کا ایک بہترین طریقہ ہے۔ یہ معلومات ٹیکنالوجیز کے نفاذ، مہارتوں کی ترقی، یا وسائل کی تقسیم سے متعلق فیصلے کرنے میں بہت اہم ہو سکتی ہے۔
  • پروگرامنگ ریپوزٹری سے فائدہ اٹھانے کے لیے۔ GitHub پر بے شمار اوپن سورس پروجیکٹس، مثالیں، اور حل موجود ہیں۔ اس طرح، تعلیمی مقاصد، پروگرامنگ مہارتوں کو بہتر بنانے، اور ٹیکنالوجی کے نفاذ کو سمجھنے کے لیے مفید پروگرامنگ معلومات اور تکنیک آسانی سے دستیاب ہیں۔

GitHub نہ صرف ریپوزٹریز کے لیے ہوسٹنگ فراہم کرتا ہے بلکہ اس کے پاس ایک بہت بڑا یوزر بیس ہے، اور اس کی شاندار شہرت اسے ایک قابل اعتماد آپشن بناتی ہے۔

GitHub پر محفوظ کردہ معلومات ٹیکنالوجی کی ترقی کے رجحانات کو ٹریک کرنے کے ساتھ ساتھ سافٹ ویئر کی ترقی کو بہتر بنانے میں بھی مفید ہیں۔ یہ معلومات انفارمیشن ٹیکنالوجی کی دنیا میں حریفوں کے ساتھ قدم سے قدم ملا کر چلنے کے لیے نہایت اہم ہے۔

GitHub کو اسکریپ کرنے کے لیے ضروری لائبریریز اور ٹولز

جب کسی ویب صفحے کو اسکریپ کرنے کی بات آتی ہے، تو Python سب سے آسان زبان ہے کیونکہ اس کی لائبریریز اور ماڈیولز کی تعداد بہت زیادہ ہے۔ GitHub اسکریپنگ کے لیے، درج ذیل ماڈیولز شامل کرنا ضروری ہیں:

  • requests: یہ ایک کلائنٹ لائبریری ہے جو HTTP درخواستوں اور جوابات کو سنبھالتی ہے، اور سب سے زیادہ استعمال ہوتی ہے۔
  • BeautifulSoup: یہ HTML سے تفصیلات نکالنے میں ماہر ہے اور اس میں نیویگیشن اور ڈیٹا ریٹریول کے لیے جدید خصوصیات شامل ہیں۔
  • Selenium: یہ ایک حقیقی براؤزر کو لانچ کرتا ہے اور صفحے کے عناصر پر کلک اور ٹائپنگ کو ممکن بناتا ہے۔

GitHub اسکریپنگ ٹولز کے استعمال سے یہ سب کچھ بہت آسانی سے کیا جا سکتا ہے۔ تاہم، آئیے تفصیل سے دیکھتے ہیں کہ یہ کیسے کیا جائے۔

BeautifulSoup کے ساتھ 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  # For MacOS and Linux
github_scraper\Scripts\activate     # For Windows

مرحلہ 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 کے ذریعے پارس کیا جائے گا اور ایک درختی ساخت (Tree Structure) بنائی جائے گی۔ خاص طور پر، soup ویری ایبل میں وہ تمام طریقے (methods) شامل ہوتے ہیں جو DOM ٹری سے متعلقہ عناصر منتخب کرنے کے لیے ضروری ہوتے ہیں، جیسے کہ:

  • find(): پہلا HTML عنصر واپس کرتا ہے جو دی گئی سلیکٹر حکمت عملی سے مطابقت رکھتا ہو۔
  • find_all(): HTML عناصر کی ایک فہرست واپس کرتا ہے جو دیے گئے سلیکٹر سے میل کھاتے ہیں۔
  • ()select_one: پہلا HTML عنصر واپس کرتا ہے جو CSS سلیکٹر سے میل کھاتا ہو۔
  • select(): CSS سلیکٹر کے مطابق HTML عناصر کی ایک فہرست واپس کرتا ہے۔

مرحلہ 5: متعلقہ ڈیٹا کے لیے ہدف صفحے کا تجزیہ

یہ ایک اور اہم مرحلہ ہے: سادہ HTML عناصر کا انتخاب کرنا اور ان سے GitHub ڈیٹا اسکریپ کرنا۔ یہ مرحلہ Python GitHub ریپوزٹری اسکرپٹ لکھنے سے پہلے کیا جاتا ہے۔

GitHub کو اسکریپ کرنے سے پہلے، ویب صفحے سے خود کو واقف کریں۔ اس کے بعد، F12 دباکر ڈویلپر ٹولز کھولیں۔ اب جب آپ نے کوڈ کھول لیا ہے، تو آپ دیکھیں گے کہ صفحے پر موجود بہت سے عناصر کے پاس منفرد کلاسز یا ایٹریبیوٹس نہیں ہیں جو کسی مخصوص عنصر تک رسائی آسان بناتے۔ صفحے کا بغور جائزہ لیں اور ڈیٹا نکالنے کے لیے تیاری کریں۔

مرحلہ 6: ریپوزٹری کی تفصیلات نکالنا

اب ہم 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(',', '')

مرحلہ 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()

# 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)

GitHub اسکریپنگ: نتیجہ

ہم نے BeautifulSoup اور Requests کی مدد سے ریپوزٹریز کے لیے ایک GitHub اسکریپنگ اسکرپٹ بنانے کے عمل کا جائزہ لیا ہے۔ اب آپ جان چکے ہیں کہ ویب صفحات تک کیسے رسائی حاصل کی جائے، متعلقہ ڈیٹا کیسے نکالا جائے، اور اسے صارف دوست انداز میں کیسے انکوڈ کیا جائے۔ ایسی مہارتیں معروف پروجیکٹس کا تجزیہ کرنے، کوڈ میں تبدیلیوں کو ٹریک کرنے یا رپورٹس تیار کرنے کے لیے بہت مفید ہو سکتی ہیں۔

تاہم، اس کا معقول اور ذمہ دارانہ استعمال ضروری ہے۔ زیادہ تر اوقات GitHub پر استعمال کے لیے ایک API دستیاب ہوتی ہے، جو کہ زیادہ آسان اور عملی حل ہوتا ہے۔ اگر آپ ویب اسکریپنگ کرنے کا فیصلہ کرتے ہیں، تو یقینی بنائیں کہ آپ ویب سائٹ کے رہنما اصولوں پر عمل کرتے ہیں اور سرورز پر غیر ضروری طور پر بہت زیادہ درخواستیں نہ بھیجیں۔

تبصرے:

0 تبصرے