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
-
Header für Anfrage: Verwendung einer User-Agent-Zeichenfolge, um einen Browser nachzuahmen und Blockierungen zu vermeiden.
-
Rekursives Crawlen:
- Erkennt Ordner (/tree/) und gibt sie rekursiv ein.
- Listet Dateien (/blob/) auf, ohne weitere Eingaben.
-
Einrückung: Spiegelt die Ordnerhierarchie in der Ausgabe wider.
-
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!