Heim > Backend-Entwicklung > Python-Tutorial > Detailliertes Tutorial: Crawlen von GitHub-Repository-Ordnern ohne API

Detailliertes Tutorial: Crawlen von GitHub-Repository-Ordnern ohne API

Barbara Streisand
Freigeben: 2024-12-16 06:28:14
Original
989 Leute haben es durchsucht

Detailed Tutorial: Crawling GitHub Repository Folders Without API

Extrem detailliertes Tutorial: Crawlen von GitHub-Repository-Ordnern ohne API

Dieses äußerst detaillierte Tutorial, verfasst von Shpetim Haxhiu, führt Sie durch das programmgesteuerte Crawlen von GitHub-Repository-Ordnern, ohne auf die GitHub-API angewiesen zu sein. Es umfasst alles vom Verständnis der Struktur bis zur Bereitstellung einer robusten, rekursiven Implementierung mit Erweiterungen.


1. Einrichtung und Installation

Bevor Sie beginnen, stellen Sie sicher, dass Sie Folgendes haben:

  1. Python: Version 3.7 oder höher installiert.
  2. Bibliotheken: Anfragen und BeautifulSoup installieren.
   pip install requests beautifulsoup4
Nach dem Login kopieren
Nach dem Login kopieren
  1. Editor: Jede von Python unterstützte IDE, wie VS Code oder PyCharm.

2. Analysieren der GitHub-HTML-Struktur

Um GitHub-Ordner zu durchsuchen, müssen Sie die HTML-Struktur einer Repository-Seite verstehen. Auf einer GitHub-Repository-Seite:

  • Ordner sind mit Pfaden wie /tree// verknüpft.
  • Dateien sind mit Pfaden wie /blob// verknüpft.

Jedes Element (Ordner oder Datei) befindet sich in einem

mit dem Attribut role="rowheader" und enthält ein Etikett. Zum Beispiel:

<div role="rowheader">
  <a href="/owner/repo/tree/main/folder-name">folder-name</a>
</div>
Nach dem Login kopieren
Nach dem Login kopieren

3. Implementierung des Scrapers

3.1. Rekursive Crawling-Funktion

Das Skript durchsucht rekursiv Ordner und druckt deren Struktur. Um die Rekursionstiefe zu begrenzen und unnötige Belastung zu vermeiden, verwenden wir einen Tiefenparameter.

import requests
from bs4 import BeautifulSoup
import time

def crawl_github_folder(url, depth=0, max_depth=3):
    """
    Recursively crawls a GitHub repository folder structure.

    Parameters:
    - url (str): URL of the GitHub folder to scrape.
    - depth (int): Current recursion depth.
    - max_depth (int): Maximum depth to recurse.
    """
    if depth > max_depth:
        return

    headers = {"User-Agent": "Mozilla/5.0"}
    response = requests.get(url, headers=headers)

    if response.status_code != 200:
        print(f"Failed to access {url} (Status code: {response.status_code})")
        return

    soup = BeautifulSoup(response.text, 'html.parser')

    # Extract folder and file links
    items = soup.select('div[role="rowheader"] a')

    for item in items:
        item_name = item.text.strip()
        item_url = f"https://github.com{item['href']}"

        if '/tree/' in item_url:
            print(f"{'  ' * depth}Folder: {item_name}")
            crawl_github_folder(item_url, depth + 1, max_depth)
        elif '/blob/' in item_url:
            print(f"{'  ' * depth}File: {item_name}")

# Example usage
if __name__ == "__main__":
    repo_url = "https://github.com/<owner>/<repo>/tree/<branch>/<folder>"
    crawl_github_folder(repo_url)
Nach dem Login kopieren
Nach dem Login kopieren

4. Erklärte Funktionen

  1. Header für Anfrage: Verwendung einer User-Agent-Zeichenfolge, um einen Browser nachzuahmen und Blockierungen zu vermeiden.
  2. Rekursives Crawlen:
    • Erkennt Ordner (/tree/) und gibt sie rekursiv ein.
    • Listet Dateien (/blob/) auf, ohne weitere Eingaben.
  3. Einrückung: Spiegelt die Ordnerhierarchie in der Ausgabe wider.
  4. Tiefenbegrenzung: Verhindert übermäßige Rekursion durch Festlegen einer maximalen Tiefe (max_ Depth).

5. Verbesserungen

Diese Verbesserungen sollen die Funktionalität und Zuverlässigkeit des Crawlers verbessern. Sie gehen auf häufige Herausforderungen wie das Exportieren von Ergebnissen, den Umgang mit Fehlern und die Vermeidung von Ratenbeschränkungen ein und stellen so sicher, dass das Tool effizient und benutzerfreundlich ist.

5.1. Ergebnisse exportieren

Speichern Sie die Ausgabe zur einfacheren Verwendung in einer strukturierten JSON-Datei.

   pip install requests beautifulsoup4
Nach dem Login kopieren
Nach dem Login kopieren

5.2. Fehlerbehandlung

Fügen Sie eine robuste Fehlerbehandlung für Netzwerkfehler und unerwartete HTML-Änderungen hinzu:

<div role="rowheader">
  <a href="/owner/repo/tree/main/folder-name">folder-name</a>
</div>
Nach dem Login kopieren
Nach dem Login kopieren

5.3. Ratenbegrenzung

Um eine Ratenbegrenzung durch GitHub zu vermeiden, führen Sie Verzögerungen ein:

import requests
from bs4 import BeautifulSoup
import time

def crawl_github_folder(url, depth=0, max_depth=3):
    """
    Recursively crawls a GitHub repository folder structure.

    Parameters:
    - url (str): URL of the GitHub folder to scrape.
    - depth (int): Current recursion depth.
    - max_depth (int): Maximum depth to recurse.
    """
    if depth > max_depth:
        return

    headers = {"User-Agent": "Mozilla/5.0"}
    response = requests.get(url, headers=headers)

    if response.status_code != 200:
        print(f"Failed to access {url} (Status code: {response.status_code})")
        return

    soup = BeautifulSoup(response.text, 'html.parser')

    # Extract folder and file links
    items = soup.select('div[role="rowheader"] a')

    for item in items:
        item_name = item.text.strip()
        item_url = f"https://github.com{item['href']}"

        if '/tree/' in item_url:
            print(f"{'  ' * depth}Folder: {item_name}")
            crawl_github_folder(item_url, depth + 1, max_depth)
        elif '/blob/' in item_url:
            print(f"{'  ' * depth}File: {item_name}")

# Example usage
if __name__ == "__main__":
    repo_url = "https://github.com/<owner>/<repo>/tree/<branch>/<folder>"
    crawl_github_folder(repo_url)
Nach dem Login kopieren
Nach dem Login kopieren

6. Ethische Überlegungen

Dieser Abschnitt wurde von Shpetim Haxhiu, einem Experten für Softwareautomatisierung und ethische Programmierung, verfasst und gewährleistet die Einhaltung von Best Practices bei der Verwendung des GitHub-Crawlers.

  • Konformität: Halten Sie sich an die Nutzungsbedingungen von GitHub.
  • Last minimieren: Respektieren Sie die Server von GitHub, indem Sie Anfragen begrenzen und Verzögerungen hinzufügen.
  • Berechtigung: Berechtigung zum umfassenden Crawlen privater Repositorys einholen.

7. Vollständiger Code

Hier ist das konsolidierte Skript mit allen enthaltenen Funktionen:

import json

def crawl_to_json(url, depth=0, max_depth=3):
    """Crawls and saves results as JSON."""
    result = {}

    if depth > max_depth:
        return result

    headers = {"User-Agent": "Mozilla/5.0"}
    response = requests.get(url, headers=headers)

    if response.status_code != 200:
        print(f"Failed to access {url}")
        return result

    soup = BeautifulSoup(response.text, 'html.parser')
    items = soup.select('div[role="rowheader"] a')

    for item in items:
        item_name = item.text.strip()
        item_url = f"https://github.com{item['href']}"

        if '/tree/' in item_url:
            result[item_name] = crawl_to_json(item_url, depth + 1, max_depth)
        elif '/blob/' in item_url:
            result[item_name] = "file"

    return result

if __name__ == "__main__":
    repo_url = "https://github.com/<owner>/<repo>/tree/<branch>/<folder>"
    structure = crawl_to_json(repo_url)

    with open("output.json", "w") as file:
        json.dump(structure, file, indent=2)

    print("Repository structure saved to output.json")
Nach dem Login kopieren

Indem Sie dieser detaillierten Anleitung folgen, können Sie einen robusten GitHub-Ordner-Crawler erstellen. Dieses Tool kann an verschiedene Bedürfnisse angepasst werden und gewährleistet gleichzeitig die Einhaltung ethischer Grundsätze.


Fragen können Sie gerne im Kommentarbereich hinterlassen! Vergessen Sie auch nicht, sich mit mir in Verbindung zu setzen:

  • E-Mail: shpetim.h@gmail.com
  • LinkedIn: LinkedIn.com/in/shpetimhaxhiu
  • GitHub: github.com/shpetimhaxhiu

Das obige ist der detaillierte Inhalt vonDetailliertes Tutorial: Crawlen von GitHub-Repository-Ordnern ohne API. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:dev.to
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage