Wie kann ich mit Python öffentliche Github -Repositorys kratzen?

Bemerkungen: 0

In diesem Artikel werden wir analysieren, wie man GitHub-Repositories mit Python scrapen kann. Wir werden bekannte Bibliotheken wie BeautifulSoup und Requests besprechen und eine detaillierte Erklärung zum Aufbau eines Scraping-Skripts für GitHub geben, so dass Sie leicht folgen können.

Warum GitHub-Repositories durchsuchen?

Was ist Github Scraping und wofür wird es eingesetzt? Es gibt zahlreiche Verwendungszwecke, aber die häufigsten sind:

  • Überwachung des technologischen Fortschritts. Die Überwachung von Stars und Repositories ist eine gute Möglichkeit, um Trends bei Programmiersprachen, Frameworks und Bibliotheken zu verfolgen. Diese Informationen können sehr wichtig sein, wenn es darum geht, Entscheidungen in Bezug auf die Implementierung von Technologien, die Entwicklung von Fähigkeiten oder die Zuweisung von Ressourcen zu treffen.
  • Nutzung eines Programmier-Repositorys. Auf GitHub finden Sie eine Fülle von Open-Source-Projekten, Beispielen und Lösungen. Daher ist eine große Menge an Programmierwissen und -techniken, die für Bildungszwecke, die Verbesserung der Programmierkenntnisse und das Verständnis der Technologieimplementierung nützlich sind, auf der Plattform leicht verfügbar.

GitHub bietet nicht nur das Hosting von Repositories an, sondern verfügt auch über eine große Nutzerbasis und einen guten Ruf, was es zu einer zuverlässigen Option macht.

Die auf GitHub gespeicherten Informationen sind nützlich, um die Muster des technologischen Fortschritts zu verfolgen und die Entwicklung von Software zu verbessern. Diese Informationen sind entscheidend, um in der Welt der Informationstechnologie mit den Wettbewerbern Schritt zu halten.

Unverzichtbare Bibliotheken und Tools für das Scraping von GitHub

Wenn es darum geht, eine Webseite zu scrapen, ist Python die einfachste Sprache, da es so viele Bibliotheken und Module gibt. Um Github-Scraping mit Python durchzuführen, müssen die folgenden Module hinzugefügt werden:

  • requests: Client-Lib, die die HTTP-Anfragen und -Antworten enthält, und die am häufigsten verwendete.
  • BeautifulSoup: hochentwickelt, wenn es darum geht, Details aus HTML zu extrahieren, da es mit fortgeschrittenen Funktionen für die Navigation und das Abrufen von Daten ausgestattet ist.
  • Selenium: startet einen echten Browser und ermöglicht das Klicken und Tippen auf Elemente der Seite.

Dies kann ganz einfach mit Hilfe von Github Scraping-Tools geschehen. Lassen Sie uns jedoch näher erläutern, wie dies zu tun ist.

Erstellen eines Scraping GitHub Repository Skripts mit Beautiful Soup

In diesem Teil wird gezeigt, wie man Github-Repositories scrapen kann. Wichtige Schritte bei der Erstellung des Scrapers bestehen aus:

  1. Erstellung der Basis - was das Herunterladen von Python und den entsprechenden Bibliotheken beinhaltet.
  2. Die Speicherung des HTML-Codes der GitHub-Seite.
  3. Prüfung des Layouts der Seite, um die benötigten Elemente zu identifizieren.
  4. Das Sammeln von Informationen, wozu u. a. die Namen der Konten, Beschreibungen und die Anzahl der erhaltenen Sterne gehören.
  5. Datenspeicherung auf Dateisystemtypen.

Von nun an werden wir die Details für all diese Schritte zusammen mit einem vollständig ausgearbeiteten Github-Skript zum Scraping teilen.

Schritt 1: Einrichten Ihrer Python-Projektumgebung

Stellen Sie sicher, dass Sie Python auf Ihrem Rechner installiert haben. Erstellen Sie als Nächstes eine neue virtuelle Python-Umgebung, um den Prozess des Scrapens von Github zu starten.


python -m venv github_scraper
source github_scraper/bin/activate  # Für macOS und Linux
github_scraper\Scripts\activate     # Für Fenster

Schritt 2: Installation der erforderlichen Python-Bibliotheken

Wie bereits erwähnt, helfen BeautifulSoup und Requests beim Scraping von GitHub-Repositories. Führen Sie in der aktuell aktivierten virtuellen Umgebung diesen Befehl aus, um sie in Ihre Projektabhängigkeiten aufzunehmen:


pip install beautifulsoup4 requests

Schritt 3: Aufrufen und Herunterladen der Ziel-GitHub-Seite

Wählen Sie ein beliebiges Repository, aus dem Sie Github scrapen möchten. Definieren Sie zunächst den Link in einer Variablen und stellen Sie dann eine HTTP-Anfrage, um den Seitencode zu erhalten.


url = "https://github.com/TheKevJames/coveralls-python"
response = requests.get(url)

Schritt 4: Verstehen und Parsen der HTML-Struktur

Um Ihr HTML zu analysieren, geben Sie es in BeautifulSoup ein.


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

Der BeautifulSoup()-Konstruktor muss mit zwei Dingen ausgestattet werden.

  1. Eine Zeichenkette, die den HTML-Inhalt enthält und in der Variablen page.text gespeichert ist.
  2. Der Parser, den Beautiful Soup verwenden wird: "html.parser" ist der Name des eingebauten Python-HTML-Parsers.

Der HTML-Code wird von BeautifulSoup geparst und es wird eine Baumstruktur erzeugt. Genauer gesagt, enthält die Variable soup alle Methoden, die erforderlich sind, um relevante Elemente aus dem DOM-Baum auszuwählen, wie z. B.:

  • find(): gibt das erste HTML-Element zurück, das der angegebenen Selektorstrategie entspricht.
  • find_all(): gibt eine Liste von HTML-Elementen zurück, die der Eingabeselektorstrategie entsprechen.
  • select_one(): gibt das erste HTML-Element zurück, das dem eingegebenen CSS-Selektor entspricht.
  • select(): gibt eine Liste von HTML-Elementen zurück, die dem angegebenen CSS-Selektor entsprechen.

Schritt 5: Analysieren der Zielseite auf relevante Daten

Hier ist ein weiterer wichtiger Schritt: die Auswahl einfacher HTML-Elemente und das Scraping von Github-Daten aus diesen Elementen. Dieser Schritt geht dem eigentlichen Schreiben des Python-Skripts für Github-Repositories voraus.

Bevor Sie Github scrapen, machen Sie sich mit der Webseite selbst vertraut. Öffnen Sie danach die Entwicklertools, indem Sie auf F12 klicken. Nachdem Sie nun den Code geöffnet haben, werden Sie feststellen, dass viele Elemente auf der Seite keine eindeutigen Klassen oder Attribute haben, die es einfach machen würden, zum entsprechenden Element zu navigieren. Gehen Sie durch die Seite und bereiten Sie sich auf die Datenextraktion vor.

Schritt 6: Repository-Details extrahieren

Jetzt sind wir bereit, ein Python-Skript zu erstellen, das uns beim Scrapen von GitHub-Repositories helfen wird. Dieses Skript kann nützliche Informationen extrahieren, die in GitHub gespeichert sind, wie Sterne, Beschreibungen, letzte Übertragungen usw. Dazu müssen wir die erforderlichen Merkmale angeben und die entsprechenden Textwerte abrufen.

  • Name des Repositorys:
    
    repo_title = soup.select_one('[itemprop="name"]').text.strip()
    

    Das Attribut itemprop="name" hat einen Attributwert, der eine eindeutige Identität hat, so dass wir ihn abrufen. Textfelder auf GitHub enthalten in der Regel Leerzeichen und Zeilenumbrüche und können mit strip() bereinigt werden.

  • Derzeitige Niederlassung:
    
    git_branch_icon_html_element = soup.select_one('[class="Box-sc-g0xbh4-0 ffLUq ref-selector-button-text-container"]').text.split()
    

    Beachten Sie, dass es keine einfachere Methode gibt, um die HTML-Komponente auszuwählen, die den Titel des Hauptzweigs trägt. Was können Sie tun? Wählen Sie eine Klasse, die eindeutig ist, und holen Sie den Text.

  • Letzte Übergabe:
    
    relative_time_html_element = soup.select_one('relative-time')
    latest_commit = relative_time_html_element['datetime']
    

    Wir stellten fest, dass das Tag "relative-time", in dem die letzte Übergabe durch den Benutzer gespeichert wurde, bereits ausgewählt war, und das Datum wurde über datetime ausgewählt.

Sammeln Sie die Informationen, die sich auf der linken Seite befinden: Beschreibung, Sterne, Ansichten, Abzweigungen.

  • Beschreibung:
    
    bordergrid_html_element = soup.select_one('.BorderGrid')
    about_html_element = bordergrid_html_element.select_one('h2')
    description_html_element = about_html_element.find_next_sibling('p')
    description = description_html_element.get_text().strip()
    
  • Sterne:
    
    star_icon_html_element = bordergrid_html_element.select_one('.octicon-star')
    stars_html_element = star_icon_html_element.find_next_sibling('strong')
    stars = stars_html_element.get_text().strip().replace(',', '')
    
  • Ansichten:
    
    eye_icon_html_element = bordergrid_html_element.select_one('.octicon-eye')
    watchers_html_element = eye_icon_html_element.find_next_sibling('strong')
    watchers = watchers_html_element.get_text().strip().replace(',', '')
    
  • Gabeln:
    
    fork_icon_html_element = bordergrid_html_element.select_one('.octicon-repo-forked')
    forks_html_element = fork_icon_html_element.find_next_sibling('strong')
    forks = forks_html_element.get_text().strip().replace(',', '')
    

Schritt 7: Sammeln und Analysieren von Readme-Dateien

Die Readme-Datei ist sehr wichtig. Sie enthält Beschreibungen der Repositories und Anweisungen zur Implementierung des Codes. Wenn Sie die readme.md-Datei überprüfen, können Sie feststellen, welchen Link sie enthält:


https://raw.githubusercontent.com///readme.md

Da wir über eine URL verfügen, können wir diese mit einem f-String programmatisch erstellen, verwenden und eine HTTP-Anfrage stellen, um den Dateicode zu erhalten.


readme_url = f'https://github.com/TheKevJames/coveralls-python/blob/{main_branch}/readme.rst'
readme_page = requests.get(readme_url)

readme = None
if readme_page.status_code != 404:
    readme = readme_page.text

Denken Sie daran, nach dem 404-Fehler zu suchen, um zu verhindern, dass der Inhalt der GitHub 404-Webseite gespeichert wird, wenn das Repository keine Readme-Datei hat.

Schritt 8: Effizientes Organisieren und Speichern der gescrapten Daten

Alle Informationen werden in einem einzigen Wörterbuch gespeichert, so dass wir sie leicht in eine JSON-Datei schreiben können.


repo = {}
repo['name'] = repo_title
repo['latest_commit'] = latest_commit
repo['main_branch'] = main_branch
repo['description'] = description
repo['stars'] = stars
repo['watchers'] = watchers
repo['forks'] = forks
repo['readme'] = readme

Schritt 9: Exportieren von gescrapten Daten im JSON-Format

Wir werden die integrierte Python-Bibliothek nutzen, um die Daten zu analysieren und sie im JSON-Format zu speichern, da es sich perfekt für verschachtelte Strukturen eignet, wie in unserem Fall, wenn Artikel Listen haben.


with open('github_data.json', 'w', encoding='utf-8') as json_file:
  json.dump(repo, json_file, ensure_ascii=False, indent=4)

Schritt 10: Alle Schritte in ein vollständiges Skript integrieren


import json
import requests
from bs4 import BeautifulSoup

url = "https://github.com/TheKevJames/coveralls-python"
response = requests.get(url)
soup = BeautifulSoup(response.text, "lxml")

repo_title = soup.select_one('[itemprop="name"]').text.strip()

# zweig
main_branch = soup.select_one(
   '[class="Box-sc-g0xbh4-0 ffLUq ref-selector-button-text-container"]').text.split()

# neuestes Commit
relative_time_html_element = soup.select_one('relative-time')
latest_commit = relative_time_html_element['datetime']

# beschreibung
bordergrid_html_element = soup.select_one('.BorderGrid')
about_html_element = bordergrid_html_element.select_one('h2')
description_html_element = about_html_element.find_next_sibling('p')
description = description_html_element.get_text().strip()

# sterne
star_icon_html_element = bordergrid_html_element.select_one('.octicon-star')
stars_html_element = star_icon_html_element.find_next_sibling('strong')
stars = stars_html_element.get_text().strip().replace(',', '')

# beobachter
eye_icon_html_element = bordergrid_html_element.select_one('.octicon-eye')
watchers_html_element = eye_icon_html_element.find_next_sibling('strong')
watchers = watchers_html_element.get_text().strip().replace(',', '')

# gabeln
fork_icon_html_element = bordergrid_html_element.select_one('.octicon-repo-forked')
forks_html_element = fork_icon_html_element.find_next_sibling('strong')
forks = forks_html_element.get_text().strip().replace(',', '')

# readme
readme_url = f'https://github.com/TheKevJames/coveralls-python/blob/{main_branch}/readme.rst'
readme_page = requests.get(readme_url)

readme = None
if readme_page.status_code != 404:
   readme = readme_page.text

repo = {}
repo['name'] = repo_title
repo['latest_commit'] = latest_commit
repo['main_branch'] = main_branch
repo['description'] = description
repo['stars'] = stars
repo['watchers'] = watchers
repo['forks'] = forks
repo['readme'] = readme

with open('github_data.json', 'w', encoding='utf-8') as json_file:
   json.dump(repo, json_file, ensure_ascii=False, indent=4)

Scraping von Github: Schlussfolgerung

Wir haben den Prozess der Erstellung eines Scraping-Skripts für GitHub-Repositories mit Hilfe von BeautifulSoup und Requests untersucht. Sie wissen jetzt, wie man auf Webseiten zugreift, relevante Daten herauszieht und sie auf benutzerfreundliche Weise kodiert. Diese Fähigkeiten sind nützlich, um bekannte Projekte zu analysieren, Änderungen am Code zu verfolgen oder Berichte zu erstellen.

Achten Sie dennoch auf eine sinnvolle Nutzung. In den meisten Fällen steht eine API auf GitHub zur Verfügung, die einfacher und praktischer zu nutzen ist. Wenn Sie sich für Web Scraping entscheiden, achten Sie darauf, dass Sie die Richtlinien der Website einhalten und die Server nicht mit zu vielen Anfragen bombardieren.

Bemerkungen:

0 Bemerkungen