Scrape github with python cover

Geliştiricilerin kendini evinde, desteklenmiş ve bağlantıda hissettiği yerin neresi olduğunu merak ediyorsanız, GitHub tam size göre. İster tek başınıza kod yazın ister küresel bir teknoloji şirketinde çalışın, teknik verilere erişmek için vazgeçilmez bir platformdur. GitHub, özellik açısından zengin resmî bir API sunar ve çoğu durumda ilk tercihiniz bu olmalıdır. Ancak ihtiyacınız olan veriler API üzerinden erişilebilir değilse web scraping yararlı bir alternatif olabilir. 

Bu eğitim, GitHub, temel bileşenleri ve trend depoların nasıl kazınacağı hakkında daha fazla bilgi edinmek isteyen herkes için yararlı olacaktır. 

*Web scraping her zaman yasal ve etik sınırlar içinde yapılmalıdır. Yasa dışı faaliyetleri teşvik etmiyor, yalnızca sorumlu kullanım stratejilerini vurguluyoruz.

I am raw html block.
Click edit button to change this html

GitHub Nedir ve Nasıl Çalışır

GitHub, dünya genelindeki geliştiricilerin merkezi hâline geldi. Kod barındırma, projelerde iş birliği yapma ve yazılım geliştirme platformudur. Adı, Git, aslında GitHub’ın üzerine kurulu olduğu bir sürüm kontrol sisteminden gelir. Git, değişikliklerin tam geçmişini tek yerde tuttuğundan birden çok dosyayı kaydetmeniz gerekmez ve bu sistem işinizi kolaylaştırır. Nelerin, ne zaman değiştirildiğini ve değişikliği kimin yaptığını her zaman görebilirsiniz. Ekip hâlinde çalışanlar için harika bir seçimdir. 

Fork’lar, repolar, yıldızlar, branch’ler – bunların hepsi ilk başta biraz kafa karıştırıcı gelebilir. Ancak Git’in nasıl çalıştığını anladığınızda bu kavramlar anlam kazanmaya başlar. Git’te repository projenizi ve geçmişini tutar, commit’ler zaman içindeki değişiklikleri kaydeder, branch’ler paralel geliştirmeye izin verir, merge işlemi ise tamamlanan işi ana projeyle birleştirir. Akışı anlamanıza yardımcı olacak basit bir görsel aşağıdadır:

Bu terimleri önceden incelemenizi öneririz; bunları resmî sitelerinde bulabilirsiniz.

Kısacası bu sistem, geliştiricilerin birbirlerinin çalışmalarının üzerine yazmadan birlikte çalışmasını sağlar. 

* GitHub’ı kazımak yasal mı?

Evet, genel olarak yasaldır; yeter ki onların Hizmet Koşullarına uyun, telif hakkı ve gizlilik kurallarına saygı gösterin. Herkese açık depolara, kullanıcı profillerine ve yıldız, fork, commit gibi meta verilere yasayı ihlal etmeden erişilebilir. 

Ancak özel depolar, hassas kullanıcı bilgileri veya GitHub’ın hız sınırlarını ihlal eden otomatik erişim, hesabın askıya alınmasına ya da hukuki sonuçlara yol açabilir. Kazıma faaliyetlerinizin her zaman etik olduğundan emin olun, kullanıcı gizliliğine saygı gösterin ve GitHub sunucularını aşırı yüklemeyin.

GitHub, kazıma ve kötüye kullanımı nasıl ele alır?

Birçok büyük platform gibi GitHub da kararlılığı korumak ve otomatik kötüye kullanımı önlemek için katı hız sınırları uygular. Her API token’ı veya kimliği doğrulanmış hesabın saatte yapabileceği istek sayısı sabittir. Bu sayı yaklaşık 5.000 istektir. Hız sınırına ulaşmak genellikle 403 Yasak yanıtlarıyla sonuçlanır. Buna kötüye kullanım davranışı eşlik ederse kullanıcılar geçici veya kalıcı hesap askıya alınmasıyla karşılaşabilir. Süregelen bot girişimleri nedeniyle GitHub, anormal trafik davranışlarını, IP patlamalarını ve tekrarlanan kimlik doğrulama hatalarını izler.

Veri toplamak ve kabul edilebilir eşiklerde kalmak için geliştiriciler yedek koruma olarak proxy’ler kullanır. Proxy’ler, giden isteklerde kaynak IP adreslerini sırayla değiştirerek trafiği uç noktalar arasında dağıtır; böylece GitHub’ın kötüye kullanım önleme sistemlerine yakalanma olasılığınız azalır. Hangi proxy türünü kullanmanın daha iyi olduğundan emin değilseniz kazıma hacmi ve verinin hassasiyeti gibi etkenleri göz önünde bulundurun. DataImpulse proxy’leri uygun fiyatlıdır ve üst düzey güvenilirlikleri ile hızlarıyla bilinir. Bunları platform kurallarını ihlal etmeden sorumlu ve etik biçimde kullanmanızı öneririz.

GitHub’ın API kurallarına saygı gösterin, özel depoları veya hassas kullanıcı verilerini kazımaktan kaçının.

İlk Kurulum: Neleri İndirmelisiniz? 

  • Python 3 (en güncel sürüm)

İndirin buradan, Python eklentisini VS Code’a kurun. Bir terminal açın ve aşağıdaki komutla kurulu olup olmadığını kontrol edin: 


python3 --version 
      
        
      

  • Visual Studio Code (veya başka bir kod editörü, en güncel sürüm)

İndirin buradan, kurun ve proje klasörünüzü açın.

  • DataImpulse panosundaki proxy kimlik bilgileri

DataImpulse’ta oturum açın ve proxy giriş bilgilerinizi kopyalayın.

  • Kütüphaneler: Requests ve BeautifulSoup; sys ve typing (yerleşik Python modülleri).

Requests – HTTP istekleri yapmak için kullanılır.

BeautifulSoup – HTML’i ayrıştırmak ve GitHub Trending sayfalarından veri çıkarmak için kullanılır.

sys – bir şey ters giderse programı hata mesajıyla durdurmak için kullanılır (sys.exit(…)).

typing – her işlev için beklenen veri türlerini belirleyen tür ipuçları sağlar.

Önce bilgisayarınızda Terminal’i açın ve pip:


python3 -m ensurepip 
      
        
      

Ardından Python kütüphanelerini şu komutla kurun:


pip3 install requests beautifulsoup4 
      
        
      

Enter’a basın; kurulumun tamamlanıp tamamlanmadığını göreceksiniz.

Python ile GitHub Kazımanın Temel Adımları

  1. Hedef sayfayı seçin – Hangi GitHub sayfası veya repository verisini toplamak istediğinize karar verin (ör. trend depolar, kullanıcı profilleri).
  2. HTML yapısını inceleyin – Gerekli verileri içeren öğeleri belirlemek için sayfanın HTML’ini inceleyin.
  3. HTTP istekleri gönderin – Sayfa içeriğini almak için requests gibi bir kütüphane kullanın.
  4. Yanıtı ayrıştırın – HTML’i işlemek için BeautifulSoup kullanın.
  5. Gerekli verileri çıkarın – İhtiyacınız olan belirli bilgileri tespit edip çıkarın.
  6. Sayfalamayı yönetin – Kullanılabilir tüm kayıtları çıkarmak için sayfalar arasında döngü kurun. 
  7. Sonuçları depolayın – Toplanan verileri CSV, JSON veya bir veritabanına kaydedin (isteğe bağlı).

Uygulamalı Örneğimiz: 

Kazıma örneğimizde trend depolarsayfasını kullandık. Tam kodu paylaşmadan önce ana bileşenlerini kısaca inceleyelim.

  • Proxy Yapılandırması

PROXY – DataImpulse panonuzdaki proxy kimlik bilgileri (host, port, username, password). Bu değerleri kendi kimlik bilgilerinizle değiştirin.

TIMEOUT – en uzun istek süresi (20 saniye).

VERIFY_SSL – HTTPS bağlantısını sağlar.

USER_AGENT – temel bot kontrollerini aşmak için gerçek bir tarayıcıyı taklit eder.

  •  GitHub Trending Filtreleri

LANGUAGE – programlama diliniz (tümü için None kullanılabilir).

SINCE – zaman aralığı: günlük, haftalık, aylık.


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"
      
        
   
   
   
   
   
   
      

Deneyebileceğiniz ilk basit kod aşağıdadır: 


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)
      
        
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
  
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
      

Sonraki kod parçasında işlevleri kullanacağız. İşlevler kodu daha temiz, yeniden kullanılabilir, hata ayıklaması daha kolay ve bakımı yapılabilir hâle getirir. Bu da özellikle GitHub’ı kazımak veya birden çok proxy’yi yönetmek gibi karmaşık görevlerde önemlidir.

  • İşlevler 

log – konsol çıktısını biçimlendirir.

build_proxies – proxy dizesini oluşturur (username:password@host:port).

test_proxy – proxy’yi şu adres üzerinden kontrol eder: https://api.ipify.org?format=json.

scrape_github_trending – HTML’i BeautifulSoup4 kullanarak ayrıştırır.

main – kazıma işlemini başlatır.

Kodun tam sürümü aşağıdadır: 


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

Sonuç olarak Terminal’imiz 14 trend depodan oluşan temiz bir liste gösterir.

Son Düşünceler ve Öneriler

GitHub’ı kazımak yararlı bir beceridir, ancak etik ve teknik kurallara uymak önemlidir. Yeni başlayanlar, kod yazmadan yapılandırılmış veri çıkaran Gemini Bot ile bile başlayabilir. Yalnızca bir bot oluşturup aşağıdaki gibi bir istem yazmanız yeterlidir: 

Bu GitHub repository sayfasını analiz edin ve aşağıdaki bilgileri çıkarın:

– Repository adı

– Yıldız sayısı

– Birincil programlama dili

– Son commit’in tarihi

Verileri JSON biçiminde döndürün.

Hepsi bu kadar. Bununla birlikte yaratıcılığı teşvik ediyor; geliştiricilerin yeni fikirleri test etmesini, araçları birleştirmesini ve yöntemleri kendi projelerine uyarlamasını öneriyoruz. Proxy’ler kullanın, GitHub’ın Hizmet Koşullarına her zaman saygı gösterin, belirli dilleri veya trend dönemlerini hedeflemek için filtrelerden yararlanın, istekleri günlüğe kaydedip izleyin ve kademeli olarak ölçeklendirmek için önce birkaç depoyla denemeler yapın.

Share article: