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.
Was ist Github Scraping und wofür wird es eingesetzt? Es gibt zahlreiche Verwendungszwecke, aber die häufigsten sind:
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.
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:
Dies kann ganz einfach mit Hilfe von Github Scraping-Tools geschehen. Lassen Sie uns jedoch näher erläutern, wie dies zu tun ist.
In diesem Teil wird gezeigt, wie man Github-Repositories scrapen kann. Wichtige Schritte bei der Erstellung des Scrapers bestehen aus:
Von nun an werden wir die Details für all diese Schritte zusammen mit einem vollständig ausgearbeiteten Github-Skript zum Scraping teilen.
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
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
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)
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.
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.:
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.
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.
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.
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.
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.
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()
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(',', '')
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(',', '')
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(',', '')
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.
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
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)
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)
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.
Мы получили вашу заявку!
Ответ будет отправлен на почту в ближайшее время.
С уважением proxy-seller.com!
Bemerkungen: 0