In this Article
إذا أردت معرفة المكان الذي يشعر فيه جميع المطورين بالانتماء والدعم والتواصل، فإن GitHub هو وجهتك. سواء كنت تبرمج بمفردك أو تعمل في شركة تقنية عالمية، فهو منصة لا غنى عنها للوصول إلى البيانات التقنية. يضم GitHub واجهة API رسمية وغنية بالميزات، وفي كثير من الحالات ينبغي أن تكون خيارك الأول. لكن عندما لا تتوافر البيانات التي تحتاجها عبر API، فقد يكون تجريف الويب بديلاً مفيداً.
سيفيد هذا الدليل كل من يرغب في معرفة المزيد عن GitHub وعناصره الأساسية وكيفية تجريف المستودعات الرائجة.
*ينبغي دائماً إجراء تجريف الويب ضمن الحدود القانونية والأخلاقية. نحن لا نشجع أي نشاط غير قانوني، ونسلط الضوء فقط على استراتيجيات الاستخدام المسؤول.
I am raw html block.
Click edit button to change this html
ما هو GitHub وكيف يعمل؟
أصبح GitHub المركز الرئيسي للمطورين حول العالم. فهو منصة لاستضافة الشيفرة والتعاون في المشاريع وبناء البرمجيات. ويستند الاسم إلى Git، وهو في الواقع نظام للتحكم في الإصدارات بُني عليه GitHub. يجعل هذا النظام عملك أسهل لأنك لا تحتاج إلى حفظ ملفات متعددة، إذ يحتفظ Git بسجل كامل للتغييرات في مكان واحد. ويمكنك دائماً معرفة ما الذي تغير ومتى تغير ومن أجرى التعديل. وهو خيار ممتاز لمن يعملون ضمن فرق.
قد تبدو النسخ المتفرعة والمستودعات والنجوم والفروع مربكة قليلاً في البداية. لكن ما إن تفهم طريقة عمل Git حتى تبدأ هذه المفاهيم في الاتضاح. في Git، يحتفظ المستودع بمشروعك وسجلّه، وتسجل عمليات الإيداع التغييرات بمرور الوقت، وتتيح الفروع التطوير المتوازي، بينما يدمج الدمج العمل المنجز في المشروع الرئيسي. إليك تصوراً بسيطاً يساعدك على فهم التسلسل:
ننصحك بالاطلاع على هذه المصطلحات مسبقاً، ويمكنك العثور عليها في موقعهم الرسمي.
باختصار، يتيح هذا النظام للمطورين العمل معاً دون الكتابة فوق أعمال بعضهم البعض.
* هل تجريف GitHub قانوني؟
نعم، يكون ذلك قانونياً عموماً ما دمت تلتزم بـشروط الخدمة الخاصة بهم وتحترم قواعد حقوق النشر والخصوصية. يمكن الوصول إلى المستودعات العامة وملفات المستخدمين الشخصية والبيانات الوصفية، مثل النجوم والنسخ المتفرعة وعمليات الإيداع، من دون مخالفة القانون.
لكن المستودعات الخاصة أو معلومات المستخدمين الحساسة أو الوصول الآلي الذي ينتهك حدود المعدل في GitHub قد يؤدي إلى تعليق الحساب أو عواقب قانونية. احرص دائماً على أن تكون أنشطة التجريف أخلاقية، وتحترم خصوصية المستخدم، ولا تثقل خوادم GitHub.
كيف يتعامل GitHub مع التجريف وإساءة الاستخدام؟
مثل كثير من المنصات الكبرى، يطبق GitHub حدود معدل صارمة للحفاظ على الاستقرار ومنع إساءة الاستخدام الآلية. يوجد عدد ثابت من الطلبات المسموح بها في الساعة لكل رمز API أو حساب موثق، وهو يقارب 5,000 طلب. ويؤدي بلوغ حد المعدل عادةً إلى استجابات 403 محظور . وإذا ترافق ذلك مع سلوك مسيء، فقد يواجه المستخدمون تعليقاً مؤقتاً أو دائماً للحساب. وبسبب محاولات الروبوتات المستمرة، يراقب GitHub سلوك حركة المرور غير الطبيعي ودفعات IP وإخفاقات المصادقة المتكررة.
لجمع البيانات والبقاء ضمن الحدود المقبولة، يستخدم المطورون البروكسي كحماية احتياطية. تدور البروكسيات عناوين IP المصدر عبر الطلبات الصادرة، فتوزع حركة المرور بين نقاط النهاية وتقلل احتمال رصدك من أنظمة GitHub لمكافحة إساءة الاستخدام. إن لم تكن متأكداً من نوع البروكسي الأنسب، فضع في الحسبان عوامل مثل حجم التجريف وحساسية البيانات. بروكسيات DataImpulse بأسعار مناسبة ومعروفة بموثوقيتها وسرعتها العالية. ننصح باستخدامها بمسؤولية وأخلاقية من دون مخالفة قواعد المنصة.
احترم قواعد API الخاصة بـ GitHub، وتجنب تجريف المستودعات الخاصة أو بيانات المستخدمين الحساسة.
الإعداد الأولي: ما الذي ينبغي تنزيله؟
- Python 3، أحدث إصدار
نزّل من هنا، وثبّت إضافة Python في VS Code. افتح الطرفية وتحقق من أنه مثبّت باستخدام:
python3 --version
- Visual Studio Code، أو محرر شيفرة آخر بالإصدار الأحدث
نزّل من هنا، وثبّته، ثم افتح مجلد مشروعك.
- بيانات اعتماد البروكسي من لوحة تحكم DataImpulse
سجّل الدخول إلى DataImpulse وانسخ تفاصيل تسجيل الدخول إلى البروكسي.
- المكتبات: Requests وBeautifulSoup، وsys وtyping، وهما وحدتان مدمجتان في Python.
تُستخدم Requests لإجراء طلبات HTTP.
تُستخدم BeautifulSoup لتحليل HTML واستخراج البيانات من صفحات GitHub الرائجة.
تُستخدم sys لإيقاف البرنامج برسالة خطأ إذا حدث خلل ما، باستخدام sys.exit(….
توفر typing تلميحات النوع التي تحدد أنواع البيانات المتوقعة لكل دالة.
أولاً، افتح الطرفية على جهازك وثبّت pip:
python3 -m ensurepip
بعد ذلك، ثبّت مكتبات Python باستخدام:
pip3 install requests beautifulsoup4
اضغط Enter، وسترى ما إذا كانت قد ثُبّتت.
الخطوات الشائعة لتجريف GitHub باستخدام Python
- اختر الصفحة المستهدفة، وحدد صفحة GitHub أو بيانات المستودع التي تريد جمعها، مثل المستودعات الرائجة أو ملفات المستخدمين الشخصية.
- افحص بنية HTML، وافحص HTML الصفحة لتحديد العناصر التي تتضمن البيانات المطلوبة.
- أرسل طلبات HTTP، واستخدم مكتبة مثل requests لاسترجاع محتوى الصفحة.
- حلل الاستجابة، واستخدم BeautifulSoup لمعالجة HTML.
- استخرج البيانات المطلوبة، وحدد المعلومات التي تحتاجها واستخرجها.
- تعامل مع ترقيم الصفحات، ومر على الصفحات لاستخراج كل الإدخالات المتاحة.
- خزّن النتائج، واحفظ البيانات المجمعة في CSV أو JSON أو قاعدة بيانات، إن رغبت.
مثالنا العملي:
في حالة التجريف الخاصة بنا، استخدمنا صفحة المستودعات الرائجة . قبل عرض الشيفرة كاملة، دعنا نستعرض مكوناتها الرئيسية بإيجاز.
- إعداد البروكسي
PROXY ، وهي بيانات اعتماد البروكسي من لوحة تحكم DataImpulse، وتشمل المضيف والمنفذ واسم المستخدم وكلمة المرور. استبدل هذه القيم ببيانات اعتمادك الخاصة.
TIMEOUT ، وهو الحد الأقصى لزمن الطلب، 20 ثانية.
VERIFY_SSL ، ويضمن اتصال HTTPS.
USER_AGENT ، ويحاكي متصفحاً حقيقياً لتجاوز عمليات التحقق الأساسية من الروبوتات.
- مرشحات GitHub الرائجة
LANGUAGE ، وهي لغة البرمجة الخاصة بك، ويمكن أن تكون None لعرض الكل.
SINCE ، وهو النطاق الزمني: يومي أو أسبوعي أو شهري.
TIMEOUT = 20 # seconds
VERIFY_SSL = True
USER_AGENT = (
"Mozilla/5.0 (Macintosh; Intel Mac OS X 13_5) "
"AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/118.0.0.0 Safari/537.36"
إليك أول مثال بسيط للشيفرة يمكنك تجربته:
import requests
from bs4 import BeautifulSoup
LANGUAGE = "python" # Programming language. None can be used as "Any" parameter in GitHub Trending
SINCE = "daily" # Date range: daily / weekly / monthly
PROXY = {
"host": "DATAIMPULSE HOST",
"port": "DATAIMPULSE PORT",
"user": "DATAIMPULSE LOGIN",
"pass": "DATAIMPULSE PASSWORD",
}
# Proxy configuration
proxy_url = f"http://{PROXY['user']}:{PROXY['pass']}@{PROXY['host']}:{PROXY['port']}"
proxies = {
"http": proxy_url,
"https": proxy_url,
}
# Checking proxies
ip = requests.get("https://api.ipify.org", proxies=proxies).text
print("Your IP:", ip)
# Scraping Github Trending section
url = "https://github.com/trending"
# Adding parameters like Language and Date Range, and make HTTP request to GitHub
params = {"since": SINCE}
if LANGUAGE:
params["language"] = LANGUAGE
headers = {
"User-Agent": "Mozilla/5.0"
}
r = requests.get(
url,
headers=headers,
params=params,
proxies=proxies,
timeout=20
)
# Scrape and output details
soup = BeautifulSoup(r.text, "html.parser")
print("\n🔥 GitHub Trending:\n")
for count, repo in enumerate(soup.select("article.Box-row"), start=1):
name = repo.h2.text.strip().replace("\n", "").replace(" ", "")
link = "https://github.com" + repo.h2.a["href"]
desc = repo.p.text.strip() if repo.p else "No description"
stars_today = repo.select_one("span.d-inline-block.float-sm-right").text.strip() if repo.select_one("span.d-inline-block.float-sm-right") else None
print(f"{count}. {name}")
print(f"Link: {link}")
print(f"Stars Today: {stars_today}")
print(f"Description: {desc}")
print("-" * 40)
سنستخدم في الجزء التالي من الشيفرة الدوال. فهي تجعل الشيفرة أوضح وقابلة لإعادة الاستخدام وأسهل في تصحيح الأخطاء وصيانتها، وهذا مهم خاصةً للمهام المعقدة مثل تجريف GitHub أو التعامل مع بروكسيات متعددة.
- الدوال
log ، وتنسق مخرجات وحدة التحكم.
build_proxies ، وتبني سلسلة البروكسي، وهي username:password@host:port.
test_proxy ، وتتحقق من البروكسي عبر https://api.ipify.org?format=json.
scrape_github_trending ، وتحلل HTML باستخدام BeautifulSoup4.
main ، وتبدأ عملية التجريف.
إليك النسخة الكاملة من الشيفرة:
import sys
import requests
from bs4 import BeautifulSoup
from typing import List, Dict, Optional
# =========================================================
# CONFIG — CHANGE ONLY THIS SECTION
# =========================================================
GITHUB_TRENDING_URL = "https://github.com/trending"
# Proxy configuration (leave PROXY = None to disable proxy)
PROXY = {
"host": "DATAIMPULSE HOST",
"port": "DATAIMPULSE PORT",
"username": "DATAIMPULSE LOGIN",
"password": "DATAIMPULSE PASSWORD",
}
# PROXY = None # uncomment to disable proxy completely
LANGUAGE = "python" # e.g. "python", "javascript", or None
SINCE = "daily" # "daily", "weekly", "monthly"
TIMEOUT = 20 # seconds
VERIFY_SSL = True
USER_AGENT = (
"Mozilla/5.0 (Macintosh; Intel Mac OS X 13_5) "
"AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/118.0.0.0 Safari/537.36"
)
# =========================================================
# END CONFIG
# =========================================================
def log(msg: str) -> None:
print(f"[INFO] {msg}")
def build_proxies(proxy_cfg: Optional[Dict]) -> Optional[Dict[str, str]]:
if not proxy_cfg:
return None
proxy_url = (
f"http://{proxy_cfg['username']}:{proxy_cfg['password']}"
f"@{proxy_cfg['host']}:{proxy_cfg['port']}"
)
return {
"http": proxy_url,
"https": proxy_url,
}
def test_proxy(proxies: Optional[Dict[str, str]]) -> None:
log("Testing proxy...")
r = requests.get(
"https://api.ipify.org?format=json",
proxies=proxies,
timeout=10,
)
r.raise_for_status()
log(f"Proxy OK. Outgoing IP: {r.json()['ip']}")
def scrape_github_trending(
language: Optional[str],
since: str,
proxies: Optional[Dict[str, str]],
timeout: int,
) -> List[Dict]:
headers = {"User-Agent": USER_AGENT}
params = {"since": since}
if language:
params["language"] = language
log("Fetching GitHub Trending page...")
response = requests.get(
GITHUB_TRENDING_URL,
headers=headers,
params=params,
proxies=proxies,
timeout=timeout,
verify=VERIFY_SSL,
)
response.raise_for_status()
soup = BeautifulSoup(response.text, "lxml")
repos = []
for article in soup.select("article.Box-row"):
name = (
article.h2.text
.replace("\n", "")
.replace(" ", "")
.strip()
)
url = "https://github.com" + article.h2.a["href"]
description = article.p.text.strip() if article.p else None
language_el = article.select_one(
'[itemprop="programmingLanguage"]'
)
stars_today_el = article.select_one(
"span.d-inline-block.float-sm-right"
)
repos.append({
"name": name,
"url": url,
"description": description,
"language": (
language_el.text.strip()
if language_el else None
),
"stars_today": (
stars_today_el.text.strip()
if stars_today_el else None
),
})
return repos
def main() -> None:
proxies = build_proxies(PROXY)
# 1) Test proxy
try:
if proxies:
test_proxy(proxies)
else:
log("Proxy disabled.")
except Exception as e:
sys.exit(f"[ERROR] Proxy test failed: {e}")
# 2) Scrape GitHub Trending
try:
repos = scrape_github_trending(
language=LANGUAGE,
since=SINCE,
proxies=proxies,
timeout=TIMEOUT,
)
except Exception as e:
sys.exit(f"[ERROR] Scraping failed: {e}")
# 3) Output
print("\n🔥 GitHub Trending Repositories\n")
print(f"Language: {LANGUAGE or 'All'} | Since: {SINCE}\n")
for i, repo in enumerate(repos, 1):
print(f"{i}. {repo['name']}")
print(f" URL: {repo['url']}")
print(f" Language: {repo['language']}")
print(f" Stars today: {repo['stars_today']}")
if repo["description"]:
print(f" Description: {repo['description']}")
print()
log(f"Done. Total repositories: {len(repos)}")
if __name__ == "__main__":
main()
ونتيجة لذلك، تعرض الطرفية قائمة مرتبة تضم 14 مستودعاً رائجاً.
أفكار ختامية وتوصيات
يُعد تجريف GitHub مهارة مفيدة، لكن من المهم مراعاة الجوانب الأخلاقية والتقنية. ويمكن للمبتدئين حتى البدء باستخدام Gemini Bot الذي يستخرج البيانات المنظمة من دون برمجة. ما عليك سوى إنشاء روبوت وكتابة الموجّه، على النحو الآتي:
حلل صفحة مستودع GitHub هذه واستخرج المعلومات التالية:
– اسم المستودع
– عدد النجوم
– لغة البرمجة الأساسية
– تاريخ آخر عملية إيداع
أعد البيانات بتنسيق JSON.
وهذا كل شيء. ومع ذلك، نشجع الإبداع ونقترح على المطورين اختبار أفكار جديدة ودمج الأدوات وتكييف الأساليب مع مشاريعهم. استخدم البروكسيات، واحترم دائماً شروط خدمة GitHub، واستعمل المرشحات لاستهداف لغات محددة أو فترات رائجة، وسجل الطلبات وراقبها، وجرّب أولاً عدداً قليلاً من المستودعات ثم وسّع النطاق تدريجياً.



