Scrape github with python cover

Wenn du wissen möchtest, wo sich Entwicklerinnen und Entwickler zuhause, unterstützt und vernetzt fühlen, bist du bei GitHub richtig. Ganz gleich, ob du allein programmierst oder in einem globalen Tech-Unternehmen arbeitest: Für den Zugriff auf technische Daten ist die Plattform unverzichtbar. GitHub bietet eine offizielle, funktionsreiche API, die in vielen Fällen deine erste Wahl sein sollte. Wenn die benötigten Daten jedoch nicht über die API verfügbar sind, kann Web Scraping eine nützliche Alternative sein. 

Dieses Tutorial ist für alle hilfreich, die mehr über GitHub, seine zentralen Elemente und das Scraping trendender Repositories erfahren möchten. 

*Web Scraping sollte stets im rechtlich und ethisch zulässigen Rahmen erfolgen. Wir fördern keine illegalen Aktivitäten und zeigen ausschließlich verantwortungsvolle Nutzungsstrategien auf.

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

Was ist GitHub und wie funktioniert es?

GitHub ist zum zentralen Dreh- und Angelpunkt für Entwicklerinnen und Entwickler weltweit geworden. Die Plattform dient zum Hosten von Code, zur Zusammenarbeit an Projekten und zur Entwicklung von Software. Der Name basiert auf Git, einem Versionskontrollsystem, auf dem GitHub aufbaut. Dieses System erleichtert dir die Arbeit, weil du nicht mehrere Dateien speichern musst: Git hält eine vollständige Änderungshistorie an einem Ort vor. Du kannst jederzeit sehen, was wann geändert wurde und wer die Änderung vorgenommen hat. Für die Arbeit im Team ist das eine ausgezeichnete Wahl. 

Forks, Repos, Stars und Branches: Das kann anfangs etwas verwirrend wirken. Sobald du verstanden hast, wie Git funktioniert, werden diese Konzepte jedoch klarer. In Git enthält ein Repository dein Projekt und dessen Historie, Commits dokumentieren Änderungen im Zeitverlauf, Branches ermöglichen parallele Entwicklung und beim Mergen wird abgeschlossene Arbeit mit dem Hauptprojekt zusammengeführt. Diese einfache Grafik veranschaulicht den Ablauf:

Wir empfehlen, diese Begriffe vorab nachzuschlagen. Du findest sie auf der offiziellen Website.

Kurz gesagt ermöglicht dieses System Entwicklerinnen und Entwicklern die Zusammenarbeit, ohne die Arbeit anderer zu überschreiben. 

* Ist es legal, GitHub zu scrapen?

Ja, grundsätzlich ist es legal, solange du die Nutzungsbedingungen einhältst und die Regeln zu Urheberrecht und Datenschutz beachtest. Auf öffentliche Repositories, Nutzerprofile und Metadaten wie Stars, Forks und Commits kann zugegriffen werden, ohne gegen das Gesetz zu verstoßen. 

Private Repositories, sensible Nutzerinformationen oder automatisierter Zugriff, der die Rate Limits von GitHub verletzt, können jedoch zur Sperrung des Kontos oder zu rechtlichen Folgen führen. Stelle stets sicher, dass deine Scraping-Aktivitäten ethisch vertretbar sind, die Privatsphäre der Nutzenden respektieren und die Server von GitHub nicht überlasten.

Wie geht GitHub mit Scraping und Missbrauch um?

Wie viele große Plattformen setzt GitHub strenge Rate Limits ein, um Stabilität zu gewährleisten und automatisierten Missbrauch zu verhindern. Für jedes API-Token oder authentifizierte Konto gibt es eine feste Anzahl zulässiger Anfragen pro Stunde. Sie liegt bei ungefähr 5.000 Anfragen. Wird das Rate Limit erreicht, führt dies typischerweise zu 403 Forbidden-Antworten. Geht dies mit missbräuchlichem Verhalten einher, droht Nutzenden eine vorübergehende oder dauerhafte Kontosperrung. Wegen fortlaufender Bot-Angriffe überwacht GitHub auffälliges Traffic-Verhalten, IP-Spitzen und wiederholte fehlgeschlagene Authentifizierungen.

Um Daten zu sammeln und innerhalb akzeptabler Grenzwerte zu bleiben, setzen Entwicklerinnen und Entwickler Proxies als zusätzliche Absicherung ein. Proxies rotieren Quell-IP-Adressen über ausgehende Anfragen und verteilen den Traffic auf Endpunkte, sodass du seltener von den Anti-Missbrauchssystemen von GitHub erfasst wirst. Wenn du nicht sicher bist, welcher Proxy-Typ besser geeignet ist, berücksichtige Faktoren wie das Scraping-Volumen und die Sensibilität der Daten. DataImpulse-Proxies sind preiswert und für erstklassige Zuverlässigkeit und Geschwindigkeit bekannt. Wir empfehlen, sie verantwortungsvoll und ethisch zu nutzen, ohne gegen die Plattformregeln zu verstoßen.

Beachte die API-Regeln von GitHub und vermeide das Scraping privater Repositories oder sensibler Nutzerdaten.

Ersteinrichtung: Was musst du herunterladen? 

  • Python 3 (die neueste Version)

Lade es here, install the Python extension in VS Code. Open a terminal, check if it is installed with: 


python3 --version 
      
        
      

  • Visual Studio Code (oder ein anderer Code-Editor, jeweils in der neuesten Version)

Lade es here, install, and open your project folder.

  • Proxy-Zugangsdaten aus dem DataImpulse-Dashboard

Melde dich bei DataImpulse an und kopiere deine Proxy-Zugangsdaten.

  • Bibliotheken: Requests und BeautifulSoup sowie sys und typing (integrierte Python-Module).

Requests wird verwendet, um HTTP-Anfragen zu senden.

BeautifulSoup wird verwendet, um HTML zu parsen und Daten von GitHub-Trending-Seiten zu extrahieren.

sys wird verwendet, um das Programm bei einem Fehler mit einer Fehlermeldung zu beenden (sys.exit(…)).

typing stellt Type Hints bereit, die für jede Funktion die erwarteten Datentypen angeben.

Öffne zunächst das Terminal auf deinem Computer und installiere pip:


python3 -m ensurepip 
      
        
      

Installiere anschließend die Python-Bibliotheken mit:


pip3 install requests beautifulsoup4 
      
        
      

Drücke die Eingabetaste. Dann siehst du, ob sie installiert wurden.

Übliche Schritte zum Scrapen von GitHub mit Python

  1. Zielseite auswählen Entscheide, von welcher GitHub-Seite oder welche Repository-Daten du sammeln möchtest, zum Beispiel trendende Repositories oder Nutzerprofile.
  2. HTML-Struktur untersuchen Untersuche das HTML der Seite, um die Elemente mit den benötigten Daten zu ermitteln.
  3. HTTP-Anfragen senden Nutze eine Bibliothek wie requests, um den Seiteninhalt abzurufen.
  4. Antwort parsen Nutze BeautifulSoup , um das HTML zu verarbeiten.
  5. Benötigte Daten extrahieren Ermittle und extrahiere die konkreten Informationen, die du benötigst.
  6. Seitennummerierung verarbeiten Durchlaufe die Seiten, um alle verfügbaren Einträge zu extrahieren. 
  7. Ergebnisse speichern Speichere die gesammelten Daten optional in einer CSV-Datei, JSON oder einer Datenbank.

Unser Praxisbeispiel: 

Für unser Scraping-Beispiel haben wir die Seite der trendenden Repositories.  Bevor wir den vollständigen Code zeigen, gehen wir kurz auf seine wichtigsten Bestandteile ein.

  • Proxy-Konfiguration

PROXY Proxy-Zugangsdaten aus deinem DataImpulse-Dashboard (host, port, username, password). Ersetze diese Werte durch deine eigenen Zugangsdaten.
TIMEOUT maximale Anfragedauer (20 Sekunden).
VERIFY_SSL stellt die HTTPS-Verbindung sicher.
USER_AGENT ahmt einen echten Browser nach, um einfache Bot-Prüfungen zu umgehen.

  •  GitHub-Trending-Filter

LANGUAGE deine Programmiersprache (kann für alle Sprachen None sein).
SINCE Zeitraum: täglich, wöchentlich, monatlich.


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"
      
        
   
   
   
   
   
   
      

Hier ist der erste einfache Code, den du ausprobieren kannst: 


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)
      
        
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
  
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
      

Im nächsten Codeabschnitt verwenden wir Funktionen. Sie machen Code übersichtlicher, wiederverwendbar, leichter zu debuggen und wartbar, was besonders bei komplexen Aufgaben wie dem Scraping von GitHub oder dem Umgang mit mehreren Proxies wichtig ist.

  • Funktionen 

log: formatiert die Konsolenausgabe.
build_proxies: erstellt die Proxy-Zeichenfolge (username:password@host:port).
test_proxy: prüft den Proxy über https://api.ipify.org?format=json.
scrape_github_trending: parst HTML mit BeautifulSoup4.
main: startet den Scraping-Prozess.

Hier ist die vollständige Version des Codes: 


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

Als Ergebnis zeigt unser Terminal eine übersichtliche Liste mit 14 trendenden Repositories an.

Abschließende Gedanken und Empfehlungen

GitHub zu scrapen ist eine nützliche Fähigkeit, doch ethische und technische Aspekte müssen beachtet werden. Auch Einsteiger können mit Gemini Bot beginnen, der strukturierte Daten ohne Programmierung extrahiert. Du musst nur einen Bot erstellen und etwa folgenden Prompt schreiben: 

Analysiere diese GitHub-Repository-Seite und extrahiere die folgenden Informationen:

– Name des Repositorys

– Anzahl der Stars

– Primäre Programmiersprache

– Datum des letzten Commits

Gib die Daten im JSON-Format zurück.

Damit ist es geschafft. Wir ermutigen jedoch zu Kreativität und empfehlen Entwicklerinnen und Entwicklern, neue Ideen zu testen, Tools zu kombinieren und Methoden an ihre eigenen Projekte anzupassen. Setze Proxies ein, beachte stets die Nutzungsbedingungen von GitHub, nutze Filter für bestimmte Sprachen oder Trendzeiträume, protokolliere und überwache Anfragen und experimentiere zunächst mit wenigen Repositories, um schrittweise zu skalieren.

Share article: