clean up no code low code und use cases tutorials
Browse files- src/02_basics/app_market.qmd +0 -10
- src/02_basics/app_market/google-play-search.qmd +18 -18
- src/02_basics/pdf.qmd +5 -0
- src/02_basics/pdf/pdf-grouping.qmd +19 -10
- src/02_basics/pdf/pdf-link-extractor.qmd +25 -10
- src/02_basics/webspider.qmd +5 -0
- src/02_basics/webspider/website-url-extractor.qmd +25 -10
- src/02_basics/webspider/webspider.qmd +6 -13
- src/03_low_code/app_market_scraping.qmd +0 -12
- src/03_low_code/app_market_scraping/app_market_scraping.qmd +79 -4
- src/03_low_code/catalogue.qmd +4 -0
- src/03_low_code/catalogue/bookstoscrape.qmd +0 -9
- src/03_low_code/catalogue/quotes_scraper.ipynb +0 -3
- src/03_low_code/video_transcripts.qmd +4 -0
- src/03_low_code/video_transcripts/get_videos_for_youtube_channels.ipynb +74 -3
- src/03_low_code/video_transcripts/social-media.qmd +9 -12
- src/03_low_code/video_transcripts/youtube-transcript-extraction.ipynb +84 -21
- src/04_use_case/forum/buergergeld_forum.ipynb +226 -5
- src/04_use_case/jobs/Jobboerse_API.ipynb +143 -3
- src/04_use_case/laws/Gesetze_im_Internet_Aktualitätendienst.ipynb +119 -3
- src/_quarto.yml +15 -22
- src/basics.qmd +22 -7
- src/low_code.qmd +3 -8
- src/use_case.qmd +0 -20
src/02_basics/app_market.qmd
DELETED
@@ -1,10 +0,0 @@
|
|
1 |
-
---
|
2 |
-
title: "App Marktplatz beobachten"
|
3 |
-
listing:
|
4 |
-
- id: app_market
|
5 |
-
contents: "app_market"
|
6 |
-
type: grid
|
7 |
-
---
|
8 |
-
|
9 |
-
::: {#app_market}
|
10 |
-
:::
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
src/02_basics/app_market/google-play-search.qmd
CHANGED
@@ -1,27 +1,27 @@
|
|
1 |
---
|
2 |
title: "Google-Play-App-Suche"
|
3 |
-
description: "
|
4 |
-
author: "Benjamin"
|
5 |
-
date: "2024-12-16"
|
6 |
-
date-modified: "2024-12-16"
|
7 |
image: _9d81d3d2-f372-476b-beb6-fe6a4841739b.jpeg
|
8 |
---
|
9 |
|
10 |
-
|
11 |
|
12 |
-
|
13 |
-
Dieses Tool durchsucht den Google Play Store nach Apps, basierend auf einem vom Nutzer eingegebenen Suchbegriff, und liefert eine übersichtliche Ergebnisliste.
|
14 |
|
15 |
-
##
|
16 |
-
- **Suchfunktion**: Eingabe eines Keywords zur Suche nach Apps.
|
17 |
-
- **Details zu Apps**:
|
18 |
-
- App-Titel
|
19 |
-
- Entwickler
|
20 |
-
- Bewertung
|
21 |
-
- Google Play-Link zur App
|
22 |
-
- App-Icon
|
23 |
-
- **URL-Ausgabe**: Separates Anzeigen der direkten Google-Play-Links zu den Apps.
|
24 |
|
25 |
-
|
26 |
-
|
27 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
---
|
2 |
title: "Google-Play-App-Suche"
|
3 |
+
description: "Dieses Tool durchsucht den Google Play Store nach Apps durchsuchen, basierend auf einem Suchbegriff, und in einer übersichtliche Ergebnisliste darstellen."
|
|
|
|
|
|
|
4 |
image: _9d81d3d2-f372-476b-beb6-fe6a4841739b.jpeg
|
5 |
---
|
6 |
|
7 |
+
## Lernziel
|
8 |
|
9 |
+
* Zu mehreren Themengebieten Listen an Links zu Anwendungen im Google Play Marktplatz erstellen und vergleichen.
|
|
|
10 |
|
11 |
+
## Anleitung zur Nutzung der Google-Play-App-Suche
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
12 |
|
13 |
+
### 1. Öffnen der Anwendung
|
14 |
+
- Zur [Google-Play-App-Suche](https://huggingface.co/spaces/datenwerkzeuge/Google-Play-App-Search) auf Hugging Face navigieren.
|
15 |
|
16 |
+
### 2. Suchbegriff eingeben
|
17 |
+
- Geben Sie einen Suchbegriff in das Eingabefeld **"Search Term"** ein.
|
18 |
+
|
19 |
+
### 3. Suche starten
|
20 |
+
- Klicken Sie auf die Schaltfläche **"Search"**, um die Suche zu starten.
|
21 |
+
|
22 |
+
### 4. Direkte Links anzeigen
|
23 |
+
- Zusätzlich werden die direkten Google-Play-Links zu den Apps separat angezeigt.
|
24 |
+
|
25 |
+
## Fazit
|
26 |
+
|
27 |
+
Apps im Google Play Store basierend auf einem Suchbegriff identifizieren und die Ergebnisse in einer übersichtlichen Liste darstellen, ein grundlegendes Vorgehen des Webscrapings und der Datenverarbeitung.
|
src/02_basics/pdf.qmd
CHANGED
@@ -1,10 +1,15 @@
|
|
1 |
---
|
2 |
title: "PDFs auswerten"
|
|
|
3 |
listing:
|
4 |
- id: pdf
|
5 |
contents: "pdf"
|
6 |
type: grid
|
7 |
---
|
8 |
|
|
|
|
|
|
|
|
|
9 |
::: {#pdf}
|
10 |
:::
|
|
|
1 |
---
|
2 |
title: "PDFs auswerten"
|
3 |
+
description: "Webseiten oder HTML-Dateien nach PDF-Links durchsuchen und basierend auf extrahierten Schlüsselwörtern gruppieren."
|
4 |
listing:
|
5 |
- id: pdf
|
6 |
contents: "pdf"
|
7 |
type: grid
|
8 |
---
|
9 |
|
10 |
+
## Lernziel
|
11 |
+
|
12 |
+
* Anwendung von PDF-Link-Extractor-Tools zur systematischen Sammlung von PDFs und Nutzung der PDF-Keyword-Grouping-App zur thematischen Gruppierung.
|
13 |
+
|
14 |
::: {#pdf}
|
15 |
:::
|
src/02_basics/pdf/pdf-grouping.qmd
CHANGED
@@ -1,23 +1,32 @@
|
|
1 |
---
|
2 |
title: "PDF-Keyword-Grouping-App"
|
3 |
description: "Eine App zur Gruppierung von hochgeladenen PDF-Dateien basierend auf semantischen Themen, einschließlich Keyword-Extraktion und themenbasierter Gruppierung."
|
4 |
-
author: "Benjamin"
|
5 |
-
date: "2024-12-16"
|
6 |
-
date-modified: "2024-12-16"
|
7 |
image: _5a00e9f5-52f7-4e9b-b22d-499e40257a4b.jpeg
|
8 |
---
|
9 |
|
10 |
-
# PDF-Keyword-Grouping-App
|
11 |
-
|
12 |
-
## Beschreibung
|
13 |
-
Die App gruppiert hochgeladene PDF-Dateien basierend auf semantischen Themen. Sie extrahiert relevante Schlüsselwörter aus den PDFs und ordnet sie automatisch den am besten passenden Themen zu.
|
14 |
-
|
15 |
## Funktionen
|
16 |
- **PDF-Upload**: Mehrere PDFs gleichzeitig hochladen.
|
17 |
- **Keyword-Extraktion**: Automatische Extraktion der wichtigsten Schlüsselwörter pro PDF.
|
18 |
- **Themenbasierte Gruppierung**: PDFs werden mithilfe von KI-Modellen wie KeyBERT und Sentence Transformers in semantische Gruppen aufgeteilt.
|
19 |
- **Download als ZIP**: Die gruppierten PDFs werden in einem ZIP-Archiv zum Download bereitgestellt.
|
20 |
|
21 |
-
##
|
22 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
23 |
|
|
|
|
1 |
---
|
2 |
title: "PDF-Keyword-Grouping-App"
|
3 |
description: "Eine App zur Gruppierung von hochgeladenen PDF-Dateien basierend auf semantischen Themen, einschließlich Keyword-Extraktion und themenbasierter Gruppierung."
|
|
|
|
|
|
|
4 |
image: _5a00e9f5-52f7-4e9b-b22d-499e40257a4b.jpeg
|
5 |
---
|
6 |
|
|
|
|
|
|
|
|
|
|
|
7 |
## Funktionen
|
8 |
- **PDF-Upload**: Mehrere PDFs gleichzeitig hochladen.
|
9 |
- **Keyword-Extraktion**: Automatische Extraktion der wichtigsten Schlüsselwörter pro PDF.
|
10 |
- **Themenbasierte Gruppierung**: PDFs werden mithilfe von KI-Modellen wie KeyBERT und Sentence Transformers in semantische Gruppen aufgeteilt.
|
11 |
- **Download als ZIP**: Die gruppierten PDFs werden in einem ZIP-Archiv zum Download bereitgestellt.
|
12 |
|
13 |
+
## Anleitung zur Nutzung der PDF-Keyword-Grouping-App
|
14 |
+
|
15 |
+
### 1. Öffnen der Anwendung
|
16 |
+
- Gehen Sie zur [PDF-Keyword-Grouping-App](https://huggingface.co/spaces/datenwerkzeuge/PDF-Keyword-Grouping-App) auf Hugging Face.
|
17 |
+
|
18 |
+
### 2. PDF-Dateien hochladen
|
19 |
+
- Klicken Sie auf die Schaltfläche **"PDFs hochladen"**.
|
20 |
+
- Wählen Sie die PDF-Dateien aus, die Sie gruppieren möchten. Sie können mehrere PDFs gleichzeitig hochladen.
|
21 |
+
|
22 |
+
### 3. Keyword-Extraktion und themenbasierte Gruppierung
|
23 |
+
- Die App extrahiert automatisch die wichtigsten Schlüsselwörter aus den hochgeladenen PDFs.
|
24 |
+
- Die PDFs werden mithilfe von KI-Modellen wie KeyBERT und Sentence Transformers in semantische Gruppen aufgeteilt.
|
25 |
+
|
26 |
+
### 4. Gruppierte PDFs herunterladen
|
27 |
+
- Nachdem die PDFs gruppiert wurden, stellt die App die gruppierten PDFs in einem ZIP-Archiv bereit.
|
28 |
+
- Klicken Sie auf die Schaltfläche **"Download als ZIP"**, um das ZIP-Archiv mit den gruppierten PDFs herunterzuladen.
|
29 |
+
|
30 |
+
## Fazit
|
31 |
|
32 |
+
Mit einfachen Mitteln und öffentlichen KI-Modelle wie KeyBERT und Sentence Transformers, kann man PDFs effektiv nach Themen gruppieren und so die Dokumentenverwaltung zu erleichtern.
|
src/02_basics/pdf/pdf-link-extractor.qmd
CHANGED
@@ -1,17 +1,9 @@
|
|
1 |
---
|
2 |
title: "PDF-Link-Extractor"
|
3 |
description: "Eine Anwendung zur Extraktion und Organisation von PDF-Links von Webseiten oder hochgeladenen HTML-Dateien, einschließlich Download und Komprimierung."
|
4 |
-
author: "Benjamin"
|
5 |
-
date: "2024-12-16"
|
6 |
-
date-modified: "2024-12-16"
|
7 |
image: _30a8d023-6f69-46e3-8ae1-1d7555d04902.jpeg
|
8 |
---
|
9 |
|
10 |
-
# PDF-Link-Extractor
|
11 |
-
|
12 |
-
## Beschreibung
|
13 |
-
Diese Anwendung durchsucht eine angegebene Webseite oder eine hochgeladene HTML-Datei nach PDF-Links. Die gefundenen PDF-Dateien werden anschließend heruntergeladen und in einer ZIP-Datei organisiert bereitgestellt.
|
14 |
-
|
15 |
## Funktionen
|
16 |
- **Eingabeoptionen**:
|
17 |
- URL der Webseite
|
@@ -20,6 +12,29 @@ Diese Anwendung durchsucht eine angegebene Webseite oder eine hochgeladene HTML-
|
|
20 |
- **Download & Komprimierung**: Herunterladen der PDFs und Bereitstellung in einem ZIP-Archiv.
|
21 |
- **Übersicht der gefundenen PDFs**: Anzeige der Dateigrößen und Namen.
|
22 |
|
23 |
-
##
|
24 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
25 |
|
|
|
|
1 |
---
|
2 |
title: "PDF-Link-Extractor"
|
3 |
description: "Eine Anwendung zur Extraktion und Organisation von PDF-Links von Webseiten oder hochgeladenen HTML-Dateien, einschließlich Download und Komprimierung."
|
|
|
|
|
|
|
4 |
image: _30a8d023-6f69-46e3-8ae1-1d7555d04902.jpeg
|
5 |
---
|
6 |
|
|
|
|
|
|
|
|
|
|
|
7 |
## Funktionen
|
8 |
- **Eingabeoptionen**:
|
9 |
- URL der Webseite
|
|
|
12 |
- **Download & Komprimierung**: Herunterladen der PDFs und Bereitstellung in einem ZIP-Archiv.
|
13 |
- **Übersicht der gefundenen PDFs**: Anzeige der Dateigrößen und Namen.
|
14 |
|
15 |
+
## Anleitung
|
16 |
+
|
17 |
+
### 1. Google-Suche durchführen:
|
18 |
+
- Öffnen Sie Ihren Webbrowser und gehen Sie zu [Google](https://www.google.com).
|
19 |
+
- Geben Sie in die Suchleiste den folgenden Suchbegriff ein, um nach PDF-Dateien zu suchen, die zivilgesellschaftliche Themen behandeln:
|
20 |
+
```
|
21 |
+
Digitale Gesellschaft filetype:pdf
|
22 |
+
```
|
23 |
+
- Drücken Sie die Eingabetaste, um die Suche zu starten.
|
24 |
+
|
25 |
+
### 2. Suchergebnisse speichern:
|
26 |
+
- Nachdem die Suchergebnisse angezeigt werden, speichern Sie die HTML-Seite der Suchergebnisse.
|
27 |
+
- Klicken Sie mit der rechten Maustaste auf die Seite und wählen Sie "Seite speichern unter..." oder eine ähnliche Option, je nach Browser.
|
28 |
+
- Speichern Sie die HTML-Datei auf Ihrem Computer.
|
29 |
+
|
30 |
+
### 3. PDF-Links extrahieren und herunterladen:
|
31 |
+
- Verwenden Sie die Anwendung **PDF-Link-Extractor**, um die gespeicherte HTML-Datei hochzuladen und die PDF-Links zu extrahieren.
|
32 |
+
- Gehen Sie zur Anwendung [PDF-Link-Extractor](https://huggingface.co/spaces/datenwerkzeuge/pdfs-sammeln).
|
33 |
+
- Laden Sie die gespeicherte HTML-Datei hoch.
|
34 |
+
- Die Anwendung durchsucht die HTML-Datei nach PDF-Links, lädt die gefundenen PDFs herunter und stellt sie in einem ZIP-Archiv bereit.
|
35 |
+
- Laden Sie das ZIP-Archiv herunter, um die gesammelten PDF-Dateien zu erhalten.
|
36 |
+
|
37 |
+
|
38 |
+
## Fazit
|
39 |
|
40 |
+
Einfacher Webscrapingprozess mit Suche und Sammlung von PDF-Dateien durch die Extraktion von PDF-Links aus Webseiten oder HTML-Dateien, gefolgt von einem praktischen Download und der Bereitstellung in einem komprimierten ZIP-Archiv.
|
src/02_basics/webspider.qmd
CHANGED
@@ -1,10 +1,15 @@
|
|
1 |
---
|
2 |
title: "Die erste Webspider"
|
|
|
3 |
listing:
|
4 |
- id: webspider
|
5 |
contents: "webspider"
|
6 |
type: grid
|
7 |
---
|
8 |
|
|
|
|
|
|
|
|
|
9 |
::: {#webspider}
|
10 |
:::
|
|
|
1 |
---
|
2 |
title: "Die erste Webspider"
|
3 |
+
description: "Den Webscraping nachvollziehen durch automatisches URL Extrahieren und durchlaufen von verlinkten Webseiten."
|
4 |
listing:
|
5 |
- id: webspider
|
6 |
contents: "webspider"
|
7 |
type: grid
|
8 |
---
|
9 |
|
10 |
+
## Lernziel
|
11 |
+
|
12 |
+
* Einsatz von Tools wie dem Webseiten-URL-Extraktor zur automatischen Extraktion von Links zur Veranschaulichung des Webscraping Prozesses. Verwendung einer einfachen Webspider.
|
13 |
+
|
14 |
::: {#webspider}
|
15 |
:::
|
src/02_basics/webspider/website-url-extractor.qmd
CHANGED
@@ -1,22 +1,37 @@
|
|
1 |
---
|
2 |
title: "Webseiten-URL-Extraktor"
|
3 |
description: "Ein Tool zur Extraktion und Darstellung aller Links von einer angegebenen Webseite, einschließlich Filterung und übersichtlicher Darstellung."
|
4 |
-
author: "Benjamin"
|
5 |
-
date: "2024-12-16"
|
6 |
-
date-modified: "2024-12-16"
|
7 |
image: _1fca0884-d58a-4271-b90f-90afcb2c4be9.jpeg
|
8 |
---
|
9 |
|
10 |
-
# Webseiten-URL-Extraktor
|
11 |
-
|
12 |
-
## Beschreibung
|
13 |
-
Dieses Tool extrahiert alle Links von einer angegebenen Webseite und stellt sie übersichtlich dar.
|
14 |
-
|
15 |
## Funktionen
|
16 |
- **Webseitenanalyse**: Automatische Extraktion aller URLs von einer Webseite.
|
17 |
- **Filterung**: Nur vollständige Links (z. B. beginnend mit `http`) werden angezeigt.
|
18 |
- **Einfaches Interface**: Eingabefeld für die URL und eine klare Liste der extrahierten Links.
|
19 |
|
20 |
-
##
|
21 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
22 |
|
|
|
|
1 |
---
|
2 |
title: "Webseiten-URL-Extraktor"
|
3 |
description: "Ein Tool zur Extraktion und Darstellung aller Links von einer angegebenen Webseite, einschließlich Filterung und übersichtlicher Darstellung."
|
|
|
|
|
|
|
4 |
image: _1fca0884-d58a-4271-b90f-90afcb2c4be9.jpeg
|
5 |
---
|
6 |
|
|
|
|
|
|
|
|
|
|
|
7 |
## Funktionen
|
8 |
- **Webseitenanalyse**: Automatische Extraktion aller URLs von einer Webseite.
|
9 |
- **Filterung**: Nur vollständige Links (z. B. beginnend mit `http`) werden angezeigt.
|
10 |
- **Einfaches Interface**: Eingabefeld für die URL und eine klare Liste der extrahierten Links.
|
11 |
|
12 |
+
## Anleitung
|
13 |
+
|
14 |
+
### 1. Öffnen der Anwendung
|
15 |
+
- Zur [Webseiten-URL-Extraktor-App](https://huggingface.co/spaces/datenwerkzeuge/Webseiten-URL-Extraktor) auf Hugging Face navigieren.
|
16 |
+
|
17 |
+
### 2. Eingabemethode wählen
|
18 |
+
- Eingabemethode auswählen: **URL** oder **HTML-Datei hochladen**.
|
19 |
+
|
20 |
+
### 3. URLs extrahieren
|
21 |
+
|
22 |
+
#### URL-Eingabemethode:
|
23 |
+
- URL der Webseite in das Eingabefeld eingeben (z. B. `https://example.com`).
|
24 |
+
- Auf die Schaltfläche **"URLs extrahieren"** klicken.
|
25 |
+
- Die App extrahiert alle Links von der angegebenen Webseite und zeigt sie an. Nur vollständige Links, die mit `http` beginnen, werden angezeigt.
|
26 |
+
|
27 |
+
#### HTML-Datei hochladen:
|
28 |
+
- HTML-Datei hochladen, indem auf **"HTML-Datei hochladen"** geklickt und die Datei ausgewählt wird.
|
29 |
+
- Auf die Schaltfläche **"URLs extrahieren"** klicken.
|
30 |
+
- Die App extrahiert alle Links aus der hochgeladenen HTML-Datei und zeigt sie an. Nur vollständige Links, die mit `http` beginnen, werden angezeigt.
|
31 |
+
|
32 |
+
### 4. Ergebnisse anzeigen
|
33 |
+
- Die extrahierten URLs werden in einer übersichtlichen Liste angezeigt. Die Links können direkt angeklickt werden, um sie zu öffnen.
|
34 |
+
|
35 |
+
## Fazit
|
36 |
|
37 |
+
Das Webseiten-URL-Extraktor-Tool bietet verdeutlicht das Filtern von Links auf Webseiten oder aus HTML-Dateien, indem es nur vollständige URLs darstellt.
|
src/02_basics/webspider/webspider.qmd
CHANGED
@@ -1,15 +1,11 @@
|
|
1 |
---
|
2 |
title: "Webspider"
|
3 |
description: "Eine private Webanwendung zur Extraktion strukturierter Daten von Webseiten mithilfe von Streamlit und Scrapy, einschließlich benutzerdefinierter Scraping-Parameter und Datenexport."
|
4 |
-
author: "Benjamin"
|
5 |
-
date: "2024-12-16"
|
6 |
-
date-modified: "2024-12-16"
|
7 |
image: _24e522b8-a6d0-4212-a02e-7738b3098105.jpeg
|
8 |
---
|
9 |
|
10 |
-
|
11 |
|
12 |
-
#### Hauptfunktionen:
|
13 |
1. **Benutzerdefinierte Scraping-Parameter**:
|
14 |
- Einstellung der maximalen **Tiefe** für die Navigation durch Seiten (Depth Limit).
|
15 |
- Festlegen der **Seitenanzahl**, die maximal durchsucht werden soll (Page Count Limit).
|
@@ -28,14 +24,11 @@ image: _24e522b8-a6d0-4212-a02e-7738b3098105.jpeg
|
|
28 |
- Der integrierte Spider navigiert durch die Webseiten, extrahiert Inhalte und folgt internen Links innerhalb derselben Domain.
|
29 |
- Enthält eine Funktion zur Bereinigung von Text (Entfernung von HTML-Tags, Skripten und Stilen).
|
30 |
|
31 |
-
#### Technische Highlights:
|
32 |
-
- **Streamlit** wird für die interaktive Benutzeroberfläche genutzt.
|
33 |
-
- **Scrapy** führt die eigentliche Datenextraktion durch.
|
34 |
-
- Dynamische Anpassung von Scraping-Parametern wie Tiefe und Seitenanzahl.
|
35 |
-
- Fortschrittsprotokollierung über lokale Logdateien.
|
36 |
-
- Ergebnisanzeige mit der Option, die gesammelten Daten direkt herunterzuladen.
|
37 |
-
|
38 |
**Einsatzmöglichkeiten**:
|
39 |
Die Anwendung eignet sich für die Datenerfassung aus öffentlich zugänglichen Webseiten, sei es zur Inhaltsanalyse, Datenaggregation oder weiteren Recherchezwecken.
|
40 |
|
41 |
-
**Hinweis**: Sie sollte verantwortungsvoll und im Einklang mit den geltenden Nutzungsbedingungen der Zielseiten verwendet werden.
|
|
|
|
|
|
|
|
|
|
1 |
---
|
2 |
title: "Webspider"
|
3 |
description: "Eine private Webanwendung zur Extraktion strukturierter Daten von Webseiten mithilfe von Streamlit und Scrapy, einschließlich benutzerdefinierter Scraping-Parameter und Datenexport."
|
|
|
|
|
|
|
4 |
image: _24e522b8-a6d0-4212-a02e-7738b3098105.jpeg
|
5 |
---
|
6 |
|
7 |
+
## Anleitung
|
8 |
|
|
|
9 |
1. **Benutzerdefinierte Scraping-Parameter**:
|
10 |
- Einstellung der maximalen **Tiefe** für die Navigation durch Seiten (Depth Limit).
|
11 |
- Festlegen der **Seitenanzahl**, die maximal durchsucht werden soll (Page Count Limit).
|
|
|
24 |
- Der integrierte Spider navigiert durch die Webseiten, extrahiert Inhalte und folgt internen Links innerhalb derselben Domain.
|
25 |
- Enthält eine Funktion zur Bereinigung von Text (Entfernung von HTML-Tags, Skripten und Stilen).
|
26 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
27 |
**Einsatzmöglichkeiten**:
|
28 |
Die Anwendung eignet sich für die Datenerfassung aus öffentlich zugänglichen Webseiten, sei es zur Inhaltsanalyse, Datenaggregation oder weiteren Recherchezwecken.
|
29 |
|
30 |
+
**Hinweis**: Sie sollte verantwortungsvoll und im Einklang mit den geltenden Nutzungsbedingungen der Zielseiten verwendet werden.
|
31 |
+
|
32 |
+
## Fazit
|
33 |
+
|
34 |
+
Die Webspider-Anwendung bietet eine praktische Einführung in die Welt des Webscrapings, indem sie Nutzern die Möglichkeit gibt, Daten von Webseiten zu extrahieren, zu analysieren und zu exportieren. Sie vermittelt wesentliche Kenntnisse in der Handhabung von Scraping-Parametern.
|
src/03_low_code/app_market_scraping.qmd
DELETED
@@ -1,12 +0,0 @@
|
|
1 |
-
---
|
2 |
-
title: "App Marktplatz analysieren"
|
3 |
-
description: "Informationen zu zahlreichen Apps abrufen und auswerten."
|
4 |
-
listing:
|
5 |
-
- id: app_market_scraping
|
6 |
-
contents: "app_market_scraping"
|
7 |
-
type: grid
|
8 |
-
---
|
9 |
-
|
10 |
-
::: {#app_market_scraping}
|
11 |
-
:::
|
12 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
src/03_low_code/app_market_scraping/app_market_scraping.qmd
CHANGED
@@ -1,10 +1,85 @@
|
|
1 |
---
|
2 |
title: "App-Market-Scraping"
|
3 |
description: "Ein Tool zur Extraktion und Analyse von App-Marktdaten, einschließlich benutzerdefinierter Suchparameter und Datenexport."
|
4 |
-
author: "Benjamin"
|
5 |
-
date: "2024-12-16"
|
6 |
-
date-modified: "2024-12-16"
|
7 |
image: _2f0cb788-71a6-4817-ab94-d38c346e4f6f.jpeg
|
8 |
---
|
9 |
|
10 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
---
|
2 |
title: "App-Market-Scraping"
|
3 |
description: "Ein Tool zur Extraktion und Analyse von App-Marktdaten, einschließlich benutzerdefinierter Suchparameter und Datenexport."
|
|
|
|
|
|
|
4 |
image: _2f0cb788-71a6-4817-ab94-d38c346e4f6f.jpeg
|
5 |
---
|
6 |
|
7 |
+
## Lernziele
|
8 |
+
|
9 |
+
- Installation des Google Play Scrapers
|
10 |
+
- Einlesen einer CSV-Datei mit App-URLs
|
11 |
+
- Abrufen von App-Informationen über einen Loop
|
12 |
+
- Visualisierung der abgerufenen Daten
|
13 |
+
|
14 |
+
## App Market Scraping
|
15 |
+
|
16 |
+
### 1. Installation des Google Play Scrapers
|
17 |
+
|
18 |
+
Um den Google Play Scraper zu installieren, den folgenden Befehl verwenden:
|
19 |
+
|
20 |
+
```python
|
21 |
+
!pip install google-play-scraper
|
22 |
+
```
|
23 |
+
|
24 |
+
### 2. Einlesen einer CSV-Datei mit App-URLs
|
25 |
+
|
26 |
+
Eine CSV-Datei (`app_urls.csv`) erstellen, die eine Spalte url enthält, welche die URLs der Google Play Store Apps auflistet. Beispiel:
|
27 |
+
|
28 |
+
```python
|
29 |
+
url
|
30 |
+
https://play.google.com/store/apps/details?id=com.example.app1
|
31 |
+
https://play.google.com/store/apps/details?id=com.example.app2
|
32 |
+
```
|
33 |
+
|
34 |
+
Die CSV-Datei in ein Pandas DataFrame einlesen:
|
35 |
+
|
36 |
+
```python
|
37 |
+
import pandas as pd
|
38 |
+
|
39 |
+
# CSV-Datei einlesen
|
40 |
+
df = pd.read_csv('app_urls.csv')
|
41 |
+
```
|
42 |
+
|
43 |
+
### 3. Abrufen von App-Informationen über einen Loop
|
44 |
+
|
45 |
+
Den Google Play Scraper verwenden, um Informationen über die Apps abzurufen:
|
46 |
+
|
47 |
+
```python
|
48 |
+
from google_play_scraper import app
|
49 |
+
|
50 |
+
# Funktion zum Extrahieren der App-ID aus der URL
|
51 |
+
def extract_app_id(url):
|
52 |
+
return url.split('id=')[-1]
|
53 |
+
|
54 |
+
# Liste zum Speichern der App-Informationen
|
55 |
+
app_info_list = []
|
56 |
+
|
57 |
+
# Loop über die URLs in der CSV-Datei
|
58 |
+
for url in df['url']:
|
59 |
+
app_id = extract_app_id(url)
|
60 |
+
app_info = app(app_id, lang='en', country='us')
|
61 |
+
app_info_list.append(app_info)
|
62 |
+
|
63 |
+
# Erstellen eines DataFrames mit den App-Informationen
|
64 |
+
app_info_df = pd.DataFrame(app_info_list)
|
65 |
+
```
|
66 |
+
|
67 |
+
### 4. Visualisierung der abgerufenen Daten
|
68 |
+
|
69 |
+
Die abgerufenen Daten visualisieren, z. B. die Bewertungen der Apps:
|
70 |
+
|
71 |
+
```python
|
72 |
+
import matplotlib.pyplot as plt
|
73 |
+
|
74 |
+
# Histogramm der App-Bewertungen
|
75 |
+
plt.figure(figsize=(10, 6))
|
76 |
+
plt.hist(app_info_df['score'], bins=20, color='skyblue', edgecolor='black')
|
77 |
+
plt.title('Verteilung der App-Bewertungen')
|
78 |
+
plt.xlabel('Bewertung')
|
79 |
+
plt.ylabel('Anzahl der Apps')
|
80 |
+
plt.show()
|
81 |
+
```
|
82 |
+
|
83 |
+
## Fazit
|
84 |
+
|
85 |
+
Diese Schritte ermöglichen die Installation des Google Play Scrapers, das Einlesen einer CSV-Datei mit App-URLs, das Abrufen von App-Informationen und die Visualisierung der Daten.
|
src/03_low_code/catalogue.qmd
CHANGED
@@ -7,5 +7,9 @@ listing:
|
|
7 |
type: grid
|
8 |
---
|
9 |
|
|
|
|
|
|
|
|
|
10 |
::: {#catalogue}
|
11 |
:::
|
|
|
7 |
type: grid
|
8 |
---
|
9 |
|
10 |
+
## Lernziele
|
11 |
+
|
12 |
+
**Extraktion von Buchdaten von der Website "Books to Scrape" mit Python und BeautifulSoup**: Praktische Übung im Web-Scraping, um das gezielte extrahieren aus Datenstrukturen zu verstehen.
|
13 |
+
|
14 |
::: {#catalogue}
|
15 |
:::
|
src/03_low_code/catalogue/bookstoscrape.qmd
CHANGED
@@ -1,9 +1,6 @@
|
|
1 |
---
|
2 |
title: "Web Scraping mit Python: Bücher von Books to Scrape"
|
3 |
description: "Eine Anleitung zum Scraping von Büchern von der Website Books to Scrape, einschließlich Python-Beispielen und Datenexport."
|
4 |
-
author: "Benjamin"
|
5 |
-
date: "2024-12-16"
|
6 |
-
date-modified: "2024-12-16"
|
7 |
image: _be1bcdc2-f540-4a95-a27c-775e8f2c1c07.jpeg
|
8 |
format:
|
9 |
html:
|
@@ -104,9 +101,3 @@ print(books_df.head())
|
|
104 |
# Fazit
|
105 |
|
106 |
In diesem Tutorial haben wir gelernt, wie man die Website [Books to Scrape](https://books.toscrape.com/) mit Python und `BeautifulSoup` scrapt. Wir haben die Titel und Preise der Bücher extrahiert und in einem DataFrame gespeichert. Dieses Beispiel kann als Grundlage für komplexere Scraping-Projekte dienen.
|
107 |
-
|
108 |
-
# Weiterführende Ressourcen
|
109 |
-
|
110 |
-
- [BeautifulSoup-Dokumentation](https://www.crummy.com/software/BeautifulSoup/bs4/doc/)
|
111 |
-
- [Requests-Dokumentation](https://docs.python-requests.org/en/latest/)
|
112 |
-
- [Pandas-Dokumentation](https://pandas.pydata.org/docs/)
|
|
|
1 |
---
|
2 |
title: "Web Scraping mit Python: Bücher von Books to Scrape"
|
3 |
description: "Eine Anleitung zum Scraping von Büchern von der Website Books to Scrape, einschließlich Python-Beispielen und Datenexport."
|
|
|
|
|
|
|
4 |
image: _be1bcdc2-f540-4a95-a27c-775e8f2c1c07.jpeg
|
5 |
format:
|
6 |
html:
|
|
|
101 |
# Fazit
|
102 |
|
103 |
In diesem Tutorial haben wir gelernt, wie man die Website [Books to Scrape](https://books.toscrape.com/) mit Python und `BeautifulSoup` scrapt. Wir haben die Titel und Preise der Bücher extrahiert und in einem DataFrame gespeichert. Dieses Beispiel kann als Grundlage für komplexere Scraping-Projekte dienen.
|
|
|
|
|
|
|
|
|
|
|
|
src/03_low_code/catalogue/quotes_scraper.ipynb
CHANGED
@@ -7,9 +7,6 @@
|
|
7 |
"---\n",
|
8 |
"title: \"Web Scraping mit Python: Bücher von Books to Scrape\"\n",
|
9 |
"description: \"Eine Anleitung zum Scraping von Zitate von der Website Quotes to Scrape, einschließlich Python-Beispielen und Datenexport.\"\n",
|
10 |
-
"author: \"Benjamin\"\n",
|
11 |
-
"date: \"2024-12-16\"\n",
|
12 |
-
"date-modified: \"2024-12-16\"\n",
|
13 |
"image: _2be49964-b89e-45be-8897-491eaa1aad84.jpeg\n",
|
14 |
"---"
|
15 |
]
|
|
|
7 |
"---\n",
|
8 |
"title: \"Web Scraping mit Python: Bücher von Books to Scrape\"\n",
|
9 |
"description: \"Eine Anleitung zum Scraping von Zitate von der Website Quotes to Scrape, einschließlich Python-Beispielen und Datenexport.\"\n",
|
|
|
|
|
|
|
10 |
"image: _2be49964-b89e-45be-8897-491eaa1aad84.jpeg\n",
|
11 |
"---"
|
12 |
]
|
src/03_low_code/video_transcripts.qmd
CHANGED
@@ -7,5 +7,9 @@ listing:
|
|
7 |
type: grid
|
8 |
---
|
9 |
|
|
|
|
|
|
|
|
|
10 |
::: {#video_transcripts}
|
11 |
:::
|
|
|
7 |
type: grid
|
8 |
---
|
9 |
|
10 |
+
## Lernziele
|
11 |
+
|
12 |
+
**Extraktion von YouTube-Transkripten und deren Speicherung als PDF-Dateien**: Lernen, wie man Transkripte von Bildungs- und Informationsvideos extrahiert, um diese Inhalte leichter zugänglich und weiterverwendbar für Bildungsarbeit, Advocacy und Sensibilisierungsmaßnahmen zu machen.
|
13 |
+
|
14 |
::: {#video_transcripts}
|
15 |
:::
|
src/03_low_code/video_transcripts/get_videos_for_youtube_channels.ipynb
CHANGED
@@ -7,13 +7,19 @@
|
|
7 |
"---\n",
|
8 |
"title: \"YouTube-Transkript-Extraktion\"\n",
|
9 |
"description: \"Ein Tool zur Extraktion und Analyse von YouTube-Transkripten, einschließlich der Speicherung als PDF-Dateien.\"\n",
|
10 |
-
"author: \"Benjamin\"\n",
|
11 |
-
"date: \"2024-12-16\"\n",
|
12 |
-
"date-modified: \"2024-12-16\"\n",
|
13 |
"image: _1001328a-6814-4c32-9ce2-782aeef96791.jpeg\n",
|
14 |
"---"
|
15 |
]
|
16 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
17 |
{
|
18 |
"cell_type": "code",
|
19 |
"execution_count": 5,
|
@@ -33,6 +39,15 @@
|
|
33 |
"kassenaerztliche_df = pd.read_csv('/content/kassenaerztliche-vereinigung-youtube-channels.csv')\n"
|
34 |
]
|
35 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
36 |
{
|
37 |
"cell_type": "code",
|
38 |
"execution_count": 9,
|
@@ -46,6 +61,14 @@
|
|
46 |
"combined_df = pd.concat([aerztekammer_df, kassenaerztliche_df], ignore_index=True)\n"
|
47 |
]
|
48 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
49 |
{
|
50 |
"cell_type": "code",
|
51 |
"execution_count": 11,
|
@@ -89,6 +112,14 @@
|
|
89 |
" return video_ids"
|
90 |
]
|
91 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
92 |
{
|
93 |
"cell_type": "code",
|
94 |
"execution_count": 13,
|
@@ -102,6 +133,14 @@
|
|
102 |
"combined_df['video_id'] = combined_df['id'].apply(get_video_ids)"
|
103 |
]
|
104 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
105 |
{
|
106 |
"cell_type": "code",
|
107 |
"execution_count": 15,
|
@@ -115,6 +154,14 @@
|
|
115 |
"combined_df = combined_df.explode('video_id')\n"
|
116 |
]
|
117 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
118 |
{
|
119 |
"cell_type": "code",
|
120 |
"execution_count": 17,
|
@@ -128,6 +175,14 @@
|
|
128 |
"combined_df['user_name'] = combined_df['user'].str.split('@').str[1]"
|
129 |
]
|
130 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
131 |
{
|
132 |
"cell_type": "code",
|
133 |
"execution_count": null,
|
@@ -163,6 +218,14 @@
|
|
163 |
"plt.show()"
|
164 |
]
|
165 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
166 |
{
|
167 |
"cell_type": "code",
|
168 |
"execution_count": 19,
|
@@ -175,6 +238,14 @@
|
|
175 |
"\n",
|
176 |
"combined_df.to_csv('combined_df.csv.gz', compression='gzip', index=False)"
|
177 |
]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
178 |
}
|
179 |
],
|
180 |
"metadata": {
|
|
|
7 |
"---\n",
|
8 |
"title: \"YouTube-Transkript-Extraktion\"\n",
|
9 |
"description: \"Ein Tool zur Extraktion und Analyse von YouTube-Transkripten, einschließlich der Speicherung als PDF-Dateien.\"\n",
|
|
|
|
|
|
|
10 |
"image: _1001328a-6814-4c32-9ce2-782aeef96791.jpeg\n",
|
11 |
"---"
|
12 |
]
|
13 |
},
|
14 |
+
{
|
15 |
+
"cell_type": "markdown",
|
16 |
+
"metadata": {},
|
17 |
+
"source": [
|
18 |
+
"### Laden der CSV-Dateien\n",
|
19 |
+
"\n",
|
20 |
+
"In diesem Abschnitt laden wir die CSV-Dateien als Pandas DataFrames."
|
21 |
+
]
|
22 |
+
},
|
23 |
{
|
24 |
"cell_type": "code",
|
25 |
"execution_count": 5,
|
|
|
39 |
"kassenaerztliche_df = pd.read_csv('/content/kassenaerztliche-vereinigung-youtube-channels.csv')\n"
|
40 |
]
|
41 |
},
|
42 |
+
{
|
43 |
+
"cell_type": "markdown",
|
44 |
+
"metadata": {},
|
45 |
+
"source": [
|
46 |
+
"### Kombinieren der DataFrames\n",
|
47 |
+
"\n",
|
48 |
+
"In diesem Abschnitt kombinieren wir die beiden DataFrames zu einem einzigen DataFrame."
|
49 |
+
]
|
50 |
+
},
|
51 |
{
|
52 |
"cell_type": "code",
|
53 |
"execution_count": 9,
|
|
|
61 |
"combined_df = pd.concat([aerztekammer_df, kassenaerztliche_df], ignore_index=True)\n"
|
62 |
]
|
63 |
},
|
64 |
+
{
|
65 |
+
"cell_type": "markdown",
|
66 |
+
"metadata": {},
|
67 |
+
"source": [
|
68 |
+
"### Funktion zur Video-ID-Ermittlung\n",
|
69 |
+
"In diesem Abschnitt definieren wir eine Funktion, um alle Videos von einem YouTube-Kanal zu erhalten."
|
70 |
+
]
|
71 |
+
},
|
72 |
{
|
73 |
"cell_type": "code",
|
74 |
"execution_count": 11,
|
|
|
112 |
" return video_ids"
|
113 |
]
|
114 |
},
|
115 |
+
{
|
116 |
+
"cell_type": "markdown",
|
117 |
+
"metadata": {},
|
118 |
+
"source": [
|
119 |
+
"### Video-IDs für jeden Kanal abrufen\n",
|
120 |
+
"In diesem Abschnitt rufen wir die Video-IDs für jeden Kanal im kombinierten DataFrame ab.\n"
|
121 |
+
]
|
122 |
+
},
|
123 |
{
|
124 |
"cell_type": "code",
|
125 |
"execution_count": 13,
|
|
|
133 |
"combined_df['video_id'] = combined_df['id'].apply(get_video_ids)"
|
134 |
]
|
135 |
},
|
136 |
+
{
|
137 |
+
"cell_type": "markdown",
|
138 |
+
"metadata": {},
|
139 |
+
"source": [
|
140 |
+
"### Entfalten der Video-ID-Spalte\n",
|
141 |
+
"In diesem Abschnitt erweitern wir die Video-ID-Spalte, sodass jede Zeile nur eine Video-ID enthält."
|
142 |
+
]
|
143 |
+
},
|
144 |
{
|
145 |
"cell_type": "code",
|
146 |
"execution_count": 15,
|
|
|
154 |
"combined_df = combined_df.explode('video_id')\n"
|
155 |
]
|
156 |
},
|
157 |
+
{
|
158 |
+
"cell_type": "markdown",
|
159 |
+
"metadata": {},
|
160 |
+
"source": [
|
161 |
+
"### Extrahieren des Benutzernamens\n",
|
162 |
+
"In diesem Abschnitt extrahieren wir den Benutzernamen aus der URL und fügen ihn als neue Spalte hinzu."
|
163 |
+
]
|
164 |
+
},
|
165 |
{
|
166 |
"cell_type": "code",
|
167 |
"execution_count": 17,
|
|
|
175 |
"combined_df['user_name'] = combined_df['user'].str.split('@').str[1]"
|
176 |
]
|
177 |
},
|
178 |
+
{
|
179 |
+
"cell_type": "markdown",
|
180 |
+
"metadata": {},
|
181 |
+
"source": [
|
182 |
+
"### Visualisierung der Videoanzahl\n",
|
183 |
+
"In diesem Abschnitt visualisieren wir die Anzahl der Videos pro Benutzername.\n"
|
184 |
+
]
|
185 |
+
},
|
186 |
{
|
187 |
"cell_type": "code",
|
188 |
"execution_count": null,
|
|
|
218 |
"plt.show()"
|
219 |
]
|
220 |
},
|
221 |
+
{
|
222 |
+
"cell_type": "markdown",
|
223 |
+
"metadata": {},
|
224 |
+
"source": [
|
225 |
+
"### Speichern des kombinierten DataFrames\n",
|
226 |
+
"In diesem Abschnitt speichern wir den kombinierten DataFrame als komprimierte CSV-Datei."
|
227 |
+
]
|
228 |
+
},
|
229 |
{
|
230 |
"cell_type": "code",
|
231 |
"execution_count": 19,
|
|
|
238 |
"\n",
|
239 |
"combined_df.to_csv('combined_df.csv.gz', compression='gzip', index=False)"
|
240 |
]
|
241 |
+
},
|
242 |
+
{
|
243 |
+
"cell_type": "markdown",
|
244 |
+
"metadata": {},
|
245 |
+
"source": [
|
246 |
+
"# Fazit\n",
|
247 |
+
"Dieses Notebook zeigt, wie man YouTube-Kanäle analysiert, indem man Video-IDs extrahiert, die Daten kombiniert und visualisiert, um wertvolle Einblicke in die Videoaktivitäten der Benutzer zu gewinnen."
|
248 |
+
]
|
249 |
}
|
250 |
],
|
251 |
"metadata": {
|
src/03_low_code/video_transcripts/social-media.qmd
CHANGED
@@ -1,19 +1,16 @@
|
|
1 |
---
|
2 |
title: "Web Scraping von Social-Media-Plattformen"
|
3 |
description: "Erklärung und Python-Beispiele zum Scraping von Social-Media-Plattformen unter Berücksichtigung rechtlicher, ethischer und technischer Vorgaben."
|
4 |
-
author: "Benjamin"
|
5 |
-
date: "2024-12-16"
|
6 |
-
date-modified: "2024-12-16"
|
7 |
image: _26268650-a612-4658-b5e2-4cccceb05541.jpeg
|
8 |
---
|
9 |
|
10 |
-
|
11 |
|
12 |
Web Scraping ist eine Technik, um Daten automatisiert aus Webseiten zu extrahieren. Beim Scraping von Social-Media-Plattformen wie Facebook, Twitter (jetzt X), Instagram oder LinkedIn müssen strenge rechtliche, ethische und technische Vorgaben eingehalten werden. Diese Regeln schützen sowohl die Plattformen als auch die Nutzer vor Missbrauch, Datenmanipulation und Verletzungen der Privatsphäre.
|
13 |
|
14 |
---
|
15 |
|
16 |
-
|
17 |
1. **Einhaltung der Nutzungsbedingungen**:
|
18 |
- Die Nutzungsbedingungen der Plattformen verbieten oft automatisiertes Scraping ohne ausdrückliche Genehmigung.
|
19 |
- Scraping, das die Plattform oder ihre Nutzer schädigt, ist unzulässig.
|
@@ -31,7 +28,7 @@ Web Scraping ist eine Technik, um Daten automatisiert aus Webseiten zu extrahier
|
|
31 |
|
32 |
---
|
33 |
|
34 |
-
|
35 |
- **Authentifizierung**:
|
36 |
- Die meisten Plattformen erfordern eine Anmeldung, um auf geschützte Inhalte zuzugreifen.
|
37 |
- APIs nutzen Authentifizierungsmethoden wie OAuth oder API-Keys.
|
@@ -47,9 +44,9 @@ Web Scraping ist eine Technik, um Daten automatisiert aus Webseiten zu extrahier
|
|
47 |
|
48 |
---
|
49 |
|
50 |
-
|
51 |
|
52 |
-
|
53 |
Die API ist die offizielle und empfohlene Methode, um Twitter-Daten abzufragen.
|
54 |
|
55 |
```python
|
@@ -78,7 +75,7 @@ for tweet in tweets:
|
|
78 |
|
79 |
---
|
80 |
|
81 |
-
|
82 |
Manchmal möchten Entwickler Daten von öffentlich zugänglichen Social-Media-Seiten extrahieren. Dies birgt Risiken, wenn keine Genehmigung vorliegt.
|
83 |
|
84 |
```python
|
@@ -103,7 +100,7 @@ print([title.text for title in titles])
|
|
103 |
|
104 |
---
|
105 |
|
106 |
-
|
107 |
LinkedIn stellt eine API für Unternehmenspartner zur Verfügung. Die Nutzung erfordert Zugangsbeschränkungen und Genehmigungen.
|
108 |
|
109 |
```python
|
@@ -119,7 +116,7 @@ print(profile)
|
|
119 |
|
120 |
---
|
121 |
|
122 |
-
|
123 |
Web Scraping von Social-Media-Daten ist technisch möglich, aber nur unter strikter Beachtung der rechtlichen und ethischen Vorgaben vertretbar. Die Nutzung offizieller APIs ist der empfohlene Weg, da sie den Zugriff kontrolliert und im Einklang mit den Plattformrichtlinien erlaubt.
|
124 |
|
125 |
Bevor Scraping-Projekte umgesetzt werden:
|
@@ -127,4 +124,4 @@ Bevor Scraping-Projekte umgesetzt werden:
|
|
127 |
- **Respektiere die Privatsphäre und Rechte der Nutzer.**
|
128 |
- **Nutze offizielle APIs, wo immer möglich.**
|
129 |
|
130 |
-
Die Automatisierung ohne Erlaubnis kann rechtliche Konsequenzen haben, daher ist Vorsicht geboten.
|
|
|
1 |
---
|
2 |
title: "Web Scraping von Social-Media-Plattformen"
|
3 |
description: "Erklärung und Python-Beispiele zum Scraping von Social-Media-Plattformen unter Berücksichtigung rechtlicher, ethischer und technischer Vorgaben."
|
|
|
|
|
|
|
4 |
image: _26268650-a612-4658-b5e2-4cccceb05541.jpeg
|
5 |
---
|
6 |
|
7 |
+
## Web Scraping von Social-Media-Plattformen: Erklärung und Python-Beispiele
|
8 |
|
9 |
Web Scraping ist eine Technik, um Daten automatisiert aus Webseiten zu extrahieren. Beim Scraping von Social-Media-Plattformen wie Facebook, Twitter (jetzt X), Instagram oder LinkedIn müssen strenge rechtliche, ethische und technische Vorgaben eingehalten werden. Diese Regeln schützen sowohl die Plattformen als auch die Nutzer vor Missbrauch, Datenmanipulation und Verletzungen der Privatsphäre.
|
10 |
|
11 |
---
|
12 |
|
13 |
+
## Wichtige Vorgaben und Einschränkungen
|
14 |
1. **Einhaltung der Nutzungsbedingungen**:
|
15 |
- Die Nutzungsbedingungen der Plattformen verbieten oft automatisiertes Scraping ohne ausdrückliche Genehmigung.
|
16 |
- Scraping, das die Plattform oder ihre Nutzer schädigt, ist unzulässig.
|
|
|
28 |
|
29 |
---
|
30 |
|
31 |
+
## Gemeinsamkeiten beim Scraping von Social Media
|
32 |
- **Authentifizierung**:
|
33 |
- Die meisten Plattformen erfordern eine Anmeldung, um auf geschützte Inhalte zuzugreifen.
|
34 |
- APIs nutzen Authentifizierungsmethoden wie OAuth oder API-Keys.
|
|
|
44 |
|
45 |
---
|
46 |
|
47 |
+
## Beispiele für Scraping mit Python
|
48 |
|
49 |
+
### 1. Nutzung der Twitter-API (via `tweepy`)
|
50 |
Die API ist die offizielle und empfohlene Methode, um Twitter-Daten abzufragen.
|
51 |
|
52 |
```python
|
|
|
75 |
|
76 |
---
|
77 |
|
78 |
+
### 2. Scraping einer öffentlichen Webseite mit `BeautifulSoup`
|
79 |
Manchmal möchten Entwickler Daten von öffentlich zugänglichen Social-Media-Seiten extrahieren. Dies birgt Risiken, wenn keine Genehmigung vorliegt.
|
80 |
|
81 |
```python
|
|
|
100 |
|
101 |
---
|
102 |
|
103 |
+
### 3. LinkedIn API für Profildaten (via `linkedin-api`)
|
104 |
LinkedIn stellt eine API für Unternehmenspartner zur Verfügung. Die Nutzung erfordert Zugangsbeschränkungen und Genehmigungen.
|
105 |
|
106 |
```python
|
|
|
116 |
|
117 |
---
|
118 |
|
119 |
+
## Zusammenfassung
|
120 |
Web Scraping von Social-Media-Daten ist technisch möglich, aber nur unter strikter Beachtung der rechtlichen und ethischen Vorgaben vertretbar. Die Nutzung offizieller APIs ist der empfohlene Weg, da sie den Zugriff kontrolliert und im Einklang mit den Plattformrichtlinien erlaubt.
|
121 |
|
122 |
Bevor Scraping-Projekte umgesetzt werden:
|
|
|
124 |
- **Respektiere die Privatsphäre und Rechte der Nutzer.**
|
125 |
- **Nutze offizielle APIs, wo immer möglich.**
|
126 |
|
127 |
+
Die Automatisierung ohne Erlaubnis kann rechtliche Konsequenzen haben, daher ist Vorsicht geboten.
|
src/03_low_code/video_transcripts/youtube-transcript-extraction.ipynb
CHANGED
@@ -7,13 +7,18 @@
|
|
7 |
"---\n",
|
8 |
"title: \"Videos für YouTube-Kanäle abrufen\"\n",
|
9 |
"description: \"Ein Tool zur Suche und Auflistung von Videos eines YouTube-Kanals basierend auf dem Kanalnamen, einschließlich der Anzeige von Videodetails und direkten Links.\"\n",
|
10 |
-
"author: \"Benjamin\"\n",
|
11 |
-
"date: \"2024-12-16\"\n",
|
12 |
-
"date-modified: \"2024-12-16\"\n",
|
13 |
"image: _0b1fd4bd-7f49-4655-bb32-462a52df7eba.jpeg\n",
|
14 |
"---"
|
15 |
]
|
16 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
17 |
{
|
18 |
"cell_type": "code",
|
19 |
"execution_count": 1,
|
@@ -32,6 +37,14 @@
|
|
32 |
"# ! pip install pytube youtube-transcript-api reportlab -q"
|
33 |
]
|
34 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
35 |
{
|
36 |
"cell_type": "code",
|
37 |
"execution_count": 2,
|
@@ -55,6 +68,14 @@
|
|
55 |
"import zipfile"
|
56 |
]
|
57 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
58 |
{
|
59 |
"cell_type": "code",
|
60 |
"execution_count": 3,
|
@@ -123,7 +144,23 @@
|
|
123 |
" except NoTranscriptFound:\n",
|
124 |
" return \"Es wurden keine Transkripte für dieses Video gefunden.\"\n",
|
125 |
" except Exception as e:\n",
|
126 |
-
" return f\"Allgemeiner Fehler beim Abrufen des Transkripts: {e}\"\n"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
127 |
"\n",
|
128 |
"# Funktion zum Erstellen eines PDFs\n",
|
129 |
"def save_transcript_as_pdf_with_pagination(title, transcript):\n",
|
@@ -177,9 +214,17 @@
|
|
177 |
" return filename"
|
178 |
]
|
179 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
180 |
{
|
181 |
"cell_type": "code",
|
182 |
-
"execution_count":
|
183 |
"metadata": {
|
184 |
"execution": {
|
185 |
"iopub.execute_input": "2024-12-08T19:32:38.175946Z",
|
@@ -190,21 +235,7 @@
|
|
190 |
},
|
191 |
"trusted": true
|
192 |
},
|
193 |
-
"outputs": [
|
194 |
-
{
|
195 |
-
"name": "stdout",
|
196 |
-
"output_type": "stream",
|
197 |
-
"text": [
|
198 |
-
"Verarbeite Video: B7uzC96-930\n",
|
199 |
-
"Transkript für 'B7uzC96-930' gespeichert als B7uzC96-930.pdf.\n",
|
200 |
-
"Verarbeite Video: 4QeKMnd8B7Q\n",
|
201 |
-
"Transkript für '4QeKMnd8B7Q' gespeichert als 4QeKMnd8B7Q.pdf.\n",
|
202 |
-
"Verarbeite Video: 30wxAJ5uyzs\n",
|
203 |
-
"Transkript für '30wxAJ5uyzs' gespeichert als 30wxAJ5uyzs.pdf.\n",
|
204 |
-
"ZIP-Archiv 'transcripts.zip' wurde erstellt.\n"
|
205 |
-
]
|
206 |
-
}
|
207 |
-
],
|
208 |
"source": [
|
209 |
"# Eingabe der URLs\n",
|
210 |
"urls = \"https://www.youtube.com/playlist?list=PLf8HAovJg47MN7bswKf73pffom98Fx8Q8\"\n",
|
@@ -240,7 +271,23 @@
|
|
240 |
" print(f\"Transkript für '{title}' gespeichert als {pdf_filename}.\")\n",
|
241 |
"\n",
|
242 |
" except Exception as e:\n",
|
243 |
-
" print(f\"Fehler bei der Verarbeitung von {video_url}: {e}\")\n"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
244 |
"\n",
|
245 |
"# Erstellen eines ZIP-Archivs\n",
|
246 |
"zip_filename = \"transcripts.zip\"\n",
|
@@ -252,6 +299,14 @@
|
|
252 |
"print(f\"ZIP-Archiv '{zip_filename}' wurde erstellt.\")"
|
253 |
]
|
254 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
255 |
{
|
256 |
"cell_type": "code",
|
257 |
"execution_count": 13,
|
@@ -269,6 +324,14 @@
|
|
269 |
"source": [
|
270 |
"# os.remove(zip_filename)"
|
271 |
]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
272 |
}
|
273 |
],
|
274 |
"metadata": {
|
|
|
7 |
"---\n",
|
8 |
"title: \"Videos für YouTube-Kanäle abrufen\"\n",
|
9 |
"description: \"Ein Tool zur Suche und Auflistung von Videos eines YouTube-Kanals basierend auf dem Kanalnamen, einschließlich der Anzeige von Videodetails und direkten Links.\"\n",
|
|
|
|
|
|
|
10 |
"image: _0b1fd4bd-7f49-4655-bb32-462a52df7eba.jpeg\n",
|
11 |
"---"
|
12 |
]
|
13 |
},
|
14 |
+
{
|
15 |
+
"cell_type": "markdown",
|
16 |
+
"metadata": {},
|
17 |
+
"source": [
|
18 |
+
"### Installation der benötigten Pakete\n",
|
19 |
+
"In diesem Abschnitt installieren wir die benötigten Python-Pakete.\n"
|
20 |
+
]
|
21 |
+
},
|
22 |
{
|
23 |
"cell_type": "code",
|
24 |
"execution_count": 1,
|
|
|
37 |
"# ! pip install pytube youtube-transcript-api reportlab -q"
|
38 |
]
|
39 |
},
|
40 |
+
{
|
41 |
+
"cell_type": "markdown",
|
42 |
+
"metadata": {},
|
43 |
+
"source": [
|
44 |
+
"### Importieren der Bibliotheken\n",
|
45 |
+
"In diesem Abschnitt importieren wir die notwendigen Bibliotheken für die Transkript-Extraktion und PDF-Erstellung.\n"
|
46 |
+
]
|
47 |
+
},
|
48 |
{
|
49 |
"cell_type": "code",
|
50 |
"execution_count": 2,
|
|
|
68 |
"import zipfile"
|
69 |
]
|
70 |
},
|
71 |
+
{
|
72 |
+
"cell_type": "markdown",
|
73 |
+
"metadata": {},
|
74 |
+
"source": [
|
75 |
+
"### Funktion zum Extrahieren des Transkripts\n",
|
76 |
+
"In diesem Abschnitt definieren wir eine Funktion, um Transkripte von YouTube-Videos basierend auf bevorzugten Sprachen zu extrahieren."
|
77 |
+
]
|
78 |
+
},
|
79 |
{
|
80 |
"cell_type": "code",
|
81 |
"execution_count": 3,
|
|
|
144 |
" except NoTranscriptFound:\n",
|
145 |
" return \"Es wurden keine Transkripte für dieses Video gefunden.\"\n",
|
146 |
" except Exception as e:\n",
|
147 |
+
" return f\"Allgemeiner Fehler beim Abrufen des Transkripts: {e}\"\n"
|
148 |
+
]
|
149 |
+
},
|
150 |
+
{
|
151 |
+
"cell_type": "markdown",
|
152 |
+
"metadata": {},
|
153 |
+
"source": [
|
154 |
+
"### Funktion zum Erstellen eines PDFs\n",
|
155 |
+
"In diesem Abschnitt definieren wir eine Funktion, um das extrahierte Transkript als PDF-Datei zu speichern.\n"
|
156 |
+
]
|
157 |
+
},
|
158 |
+
{
|
159 |
+
"cell_type": "code",
|
160 |
+
"execution_count": null,
|
161 |
+
"metadata": {},
|
162 |
+
"outputs": [],
|
163 |
+
"source": [
|
164 |
"\n",
|
165 |
"# Funktion zum Erstellen eines PDFs\n",
|
166 |
"def save_transcript_as_pdf_with_pagination(title, transcript):\n",
|
|
|
214 |
" return filename"
|
215 |
]
|
216 |
},
|
217 |
+
{
|
218 |
+
"cell_type": "markdown",
|
219 |
+
"metadata": {},
|
220 |
+
"source": [
|
221 |
+
"### Eingabe der URLs\n",
|
222 |
+
"In diesem Abschnitt geben wir die URLs der YouTube-Videos oder -Playlists ein, deren Transkripte wir extrahieren möchten.\n"
|
223 |
+
]
|
224 |
+
},
|
225 |
{
|
226 |
"cell_type": "code",
|
227 |
+
"execution_count": null,
|
228 |
"metadata": {
|
229 |
"execution": {
|
230 |
"iopub.execute_input": "2024-12-08T19:32:38.175946Z",
|
|
|
235 |
},
|
236 |
"trusted": true
|
237 |
},
|
238 |
+
"outputs": [],
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
239 |
"source": [
|
240 |
"# Eingabe der URLs\n",
|
241 |
"urls = \"https://www.youtube.com/playlist?list=PLf8HAovJg47MN7bswKf73pffom98Fx8Q8\"\n",
|
|
|
271 |
" print(f\"Transkript für '{title}' gespeichert als {pdf_filename}.\")\n",
|
272 |
"\n",
|
273 |
" except Exception as e:\n",
|
274 |
+
" print(f\"Fehler bei der Verarbeitung von {video_url}: {e}\")\n"
|
275 |
+
]
|
276 |
+
},
|
277 |
+
{
|
278 |
+
"cell_type": "markdown",
|
279 |
+
"metadata": {},
|
280 |
+
"source": [
|
281 |
+
"### Erstellen eines ZIP-Archivs\n",
|
282 |
+
"In diesem Abschnitt erstellen wir ein ZIP-Archiv, das alle generierten PDF-Dateien enthält.\n"
|
283 |
+
]
|
284 |
+
},
|
285 |
+
{
|
286 |
+
"cell_type": "code",
|
287 |
+
"execution_count": null,
|
288 |
+
"metadata": {},
|
289 |
+
"outputs": [],
|
290 |
+
"source": [
|
291 |
"\n",
|
292 |
"# Erstellen eines ZIP-Archivs\n",
|
293 |
"zip_filename = \"transcripts.zip\"\n",
|
|
|
299 |
"print(f\"ZIP-Archiv '{zip_filename}' wurde erstellt.\")"
|
300 |
]
|
301 |
},
|
302 |
+
{
|
303 |
+
"cell_type": "markdown",
|
304 |
+
"metadata": {},
|
305 |
+
"source": [
|
306 |
+
"### Löschen der ZIP-Datei\n",
|
307 |
+
"In diesem Abschnitt löschen wir die ZIP-Datei, falls sie nicht mehr benötigt wird."
|
308 |
+
]
|
309 |
+
},
|
310 |
{
|
311 |
"cell_type": "code",
|
312 |
"execution_count": 13,
|
|
|
324 |
"source": [
|
325 |
"# os.remove(zip_filename)"
|
326 |
]
|
327 |
+
},
|
328 |
+
{
|
329 |
+
"cell_type": "markdown",
|
330 |
+
"metadata": {},
|
331 |
+
"source": [
|
332 |
+
"# Fazit\n",
|
333 |
+
"In diesem Notebook haben wir gelernt, wie man YouTube-Transkripte extrahiert und als PDF-Dateien speichert. Wir haben die notwendigen Pakete installiert, Funktionen zur Transkript-Extraktion und PDF-Erstellung definiert, und schließlich die Transkripte von YouTube-Videos in einem ZIP-Archiv zusammengefasst. Diese Schritte ermöglichen eine effiziente Analyse und Speicherung von YouTube-Inhalten."
|
334 |
+
]
|
335 |
}
|
336 |
],
|
337 |
"metadata": {
|
src/04_use_case/forum/buergergeld_forum.ipynb
CHANGED
@@ -7,12 +7,30 @@
|
|
7 |
"---\n",
|
8 |
"title: \"Web Scraping von Foren: Bürgergeld Forum\"\n",
|
9 |
"description: \"Ein Tool zur Extraktion und Analyse von Forenbeiträgen aus dem Bürgergeld Forum, einschließlich der Verarbeitung und Visualisierung der Daten.\"\n",
|
10 |
-
"author: \"Benjamin\"\n",
|
11 |
-
"date: \"2024-12-16\"\n",
|
12 |
-
"date-modified: \"2024-12-16\"\n",
|
13 |
"---"
|
14 |
]
|
15 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
16 |
{
|
17 |
"cell_type": "code",
|
18 |
"execution_count": 186,
|
@@ -62,6 +80,14 @@
|
|
62 |
"# download_pages(base_url, start_page, end_page, output_directory)"
|
63 |
]
|
64 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
65 |
{
|
66 |
"cell_type": "code",
|
67 |
"execution_count": 187,
|
@@ -527,6 +553,21 @@
|
|
527 |
"df"
|
528 |
]
|
529 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
530 |
{
|
531 |
"cell_type": "code",
|
532 |
"execution_count": 188,
|
@@ -1006,6 +1047,14 @@
|
|
1006 |
"df"
|
1007 |
]
|
1008 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1009 |
{
|
1010 |
"cell_type": "code",
|
1011 |
"execution_count": 189,
|
@@ -1519,6 +1568,14 @@
|
|
1519 |
"df"
|
1520 |
]
|
1521 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1522 |
{
|
1523 |
"cell_type": "code",
|
1524 |
"execution_count": 190,
|
@@ -1533,6 +1590,14 @@
|
|
1533 |
"df['Zugriffe'] = df['Zugriffe'].str.split('\\n\\n\\n', n=1).str[0]"
|
1534 |
]
|
1535 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1536 |
{
|
1537 |
"cell_type": "code",
|
1538 |
"execution_count": 191,
|
@@ -1550,6 +1615,14 @@
|
|
1550 |
"df['Zugriffe'] = df['Zugriffe'].str.split('\\n').str[1]"
|
1551 |
]
|
1552 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1553 |
{
|
1554 |
"cell_type": "code",
|
1555 |
"execution_count": 192,
|
@@ -1607,6 +1680,14 @@
|
|
1607 |
"df[['Subject_Part2_2_2_split', 'Subject_Part2_2_2_rest']] = df['Subject_Part2_2_2'].str.split('\\n', n=1, expand=True)"
|
1608 |
]
|
1609 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1610 |
{
|
1611 |
"cell_type": "code",
|
1612 |
"execution_count": 196,
|
@@ -1620,6 +1701,14 @@
|
|
1620 |
"df = df.drop(columns=['Stats', 'LastPost', 'Subject_Part2', 'Subject_Part2_2', 'Subject_Part2_2_1', 'Subject', 'Subject_Part2_2_2'])"
|
1621 |
]
|
1622 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1623 |
{
|
1624 |
"cell_type": "code",
|
1625 |
"execution_count": 197,
|
@@ -1648,6 +1737,14 @@
|
|
1648 |
"print(f\"Do the 'Antworten' and 'Subject_Part2_1' columns have the same content?: {comparison_result}\")"
|
1649 |
]
|
1650 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1651 |
{
|
1652 |
"cell_type": "code",
|
1653 |
"execution_count": 198,
|
@@ -1679,6 +1776,14 @@
|
|
1679 |
"print(f\"Do the 'Date_LastPost' and 'Subject_Part2_2_2_rest' columns have the same content?: {comparison_result_date}\")"
|
1680 |
]
|
1681 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1682 |
{
|
1683 |
"cell_type": "code",
|
1684 |
"execution_count": 199,
|
@@ -1701,6 +1806,14 @@
|
|
1701 |
"})"
|
1702 |
]
|
1703 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1704 |
{
|
1705 |
"cell_type": "code",
|
1706 |
"execution_count": 200,
|
@@ -1724,6 +1837,14 @@
|
|
1724 |
"df = df[final_column_order]"
|
1725 |
]
|
1726 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1727 |
{
|
1728 |
"cell_type": "code",
|
1729 |
"execution_count": 201,
|
@@ -1745,6 +1866,14 @@
|
|
1745 |
"df['Zugriffe'] = pd.to_numeric(df['Zugriffe'], errors='coerce').fillna(0).astype(int)"
|
1746 |
]
|
1747 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1748 |
{
|
1749 |
"cell_type": "code",
|
1750 |
"execution_count": 202,
|
@@ -1759,6 +1888,14 @@
|
|
1759 |
"df['Antworten2'] = pd.to_numeric(df['Antworten2'], errors='coerce').fillna(0).astype(int)"
|
1760 |
]
|
1761 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1762 |
{
|
1763 |
"cell_type": "code",
|
1764 |
"execution_count": 216,
|
@@ -1779,6 +1916,14 @@
|
|
1779 |
"df['Jahr_Letzter_Post'] = pd.to_numeric(df['Jahr_Letzter_Post'], errors='coerce').astype('Int64')"
|
1780 |
]
|
1781 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1782 |
{
|
1783 |
"cell_type": "code",
|
1784 |
"execution_count": 217,
|
@@ -1819,6 +1964,14 @@
|
|
1819 |
"df.info()"
|
1820 |
]
|
1821 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1822 |
{
|
1823 |
"cell_type": "code",
|
1824 |
"execution_count": 211,
|
@@ -1929,7 +2082,16 @@
|
|
1929 |
"id": "TGUIR11zUVW-"
|
1930 |
},
|
1931 |
"source": [
|
1932 |
-
"## Analyse"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1933 |
]
|
1934 |
},
|
1935 |
{
|
@@ -1978,6 +2140,14 @@
|
|
1978 |
"plt.show()"
|
1979 |
]
|
1980 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1981 |
{
|
1982 |
"cell_type": "code",
|
1983 |
"execution_count": 221,
|
@@ -2023,6 +2193,14 @@
|
|
2023 |
"plt.show()"
|
2024 |
]
|
2025 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2026 |
{
|
2027 |
"cell_type": "code",
|
2028 |
"execution_count": 225,
|
@@ -2441,6 +2619,14 @@
|
|
2441 |
"result"
|
2442 |
]
|
2443 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2444 |
{
|
2445 |
"cell_type": "code",
|
2446 |
"execution_count": 226,
|
@@ -2865,7 +3051,16 @@
|
|
2865 |
"id": "FanmCt50UYMD"
|
2866 |
},
|
2867 |
"source": [
|
2868 |
-
"## Speichern"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2869 |
]
|
2870 |
},
|
2871 |
{
|
@@ -2909,6 +3104,32 @@
|
|
2909 |
"\n",
|
2910 |
"# compress_directory(directory_to_compress, output_zip_filename)"
|
2911 |
]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2912 |
}
|
2913 |
],
|
2914 |
"metadata": {
|
|
|
7 |
"---\n",
|
8 |
"title: \"Web Scraping von Foren: Bürgergeld Forum\"\n",
|
9 |
"description: \"Ein Tool zur Extraktion und Analyse von Forenbeiträgen aus dem Bürgergeld Forum, einschließlich der Verarbeitung und Visualisierung der Daten.\"\n",
|
|
|
|
|
|
|
10 |
"---"
|
11 |
]
|
12 |
},
|
13 |
+
{
|
14 |
+
"cell_type": "markdown",
|
15 |
+
"metadata": {},
|
16 |
+
"source": [
|
17 |
+
"## Lernziele\n",
|
18 |
+
"\n",
|
19 |
+
"**Web Scraping von Foren**\n",
|
20 |
+
"\n",
|
21 |
+
"* Herunterladen und Speichern von HTML-Seiten eines Forums.\n",
|
22 |
+
"* Extraktion und Analyse von Forenbeiträgen und Metadaten.\n",
|
23 |
+
"* Verarbeitung und Bereinigung der extrahierten Daten mit Pandas."
|
24 |
+
]
|
25 |
+
},
|
26 |
+
{
|
27 |
+
"cell_type": "markdown",
|
28 |
+
"metadata": {},
|
29 |
+
"source": [
|
30 |
+
"## HTML-Seiten herunterladen\n",
|
31 |
+
"Dieser Code lädt HTML-Seiten des Bürgergeld Forums herunter und speichert sie in einem Ordner.\n"
|
32 |
+
]
|
33 |
+
},
|
34 |
{
|
35 |
"cell_type": "code",
|
36 |
"execution_count": 186,
|
|
|
80 |
"# download_pages(base_url, start_page, end_page, output_directory)"
|
81 |
]
|
82 |
},
|
83 |
+
{
|
84 |
+
"cell_type": "markdown",
|
85 |
+
"metadata": {},
|
86 |
+
"source": [
|
87 |
+
"## Daten extrahieren\n",
|
88 |
+
"Dieser Code extrahiert die Texte der Elemente `<li class=\"columnSubject\">`, `<li class=\"columnStats\">` und `<li class=\"columnLastPost\">` aus den HTML-Dateien und speichert sie in einem Pandas DataFrame.\n"
|
89 |
+
]
|
90 |
+
},
|
91 |
{
|
92 |
"cell_type": "code",
|
93 |
"execution_count": 187,
|
|
|
553 |
"df"
|
554 |
]
|
555 |
},
|
556 |
+
{
|
557 |
+
"cell_type": "markdown",
|
558 |
+
"metadata": {},
|
559 |
+
"source": [
|
560 |
+
"## Daten reinigen"
|
561 |
+
]
|
562 |
+
},
|
563 |
+
{
|
564 |
+
"cell_type": "markdown",
|
565 |
+
"metadata": {},
|
566 |
+
"source": [
|
567 |
+
"### Spalte 'LastPost' aufteilen\n",
|
568 |
+
"Dieser Code teilt die Spalte `df.LastPost` in `Nutzer_LastPost` und `Datum_LastPost` auf.\n"
|
569 |
+
]
|
570 |
+
},
|
571 |
{
|
572 |
"cell_type": "code",
|
573 |
"execution_count": 188,
|
|
|
1047 |
"df"
|
1048 |
]
|
1049 |
},
|
1050 |
+
{
|
1051 |
+
"cell_type": "markdown",
|
1052 |
+
"metadata": {},
|
1053 |
+
"source": [
|
1054 |
+
"### Spalte 'Stats' aufteilen\n",
|
1055 |
+
"Dieser Code teilt die Spalte `df.Stats` in `Antworten` und `Zugriffe` auf.\n"
|
1056 |
+
]
|
1057 |
+
},
|
1058 |
{
|
1059 |
"cell_type": "code",
|
1060 |
"execution_count": 189,
|
|
|
1568 |
"df"
|
1569 |
]
|
1570 |
},
|
1571 |
+
{
|
1572 |
+
"cell_type": "markdown",
|
1573 |
+
"metadata": {},
|
1574 |
+
"source": [
|
1575 |
+
"### Spalte 'Zugriffe' bereinigen\n",
|
1576 |
+
"Dieser Code bereinigt die Spalte `df.Zugriffe`, indem nur der Inhalt bis zum ersten Vorkommen von `\\n\\n\\n` behalten wird.\n"
|
1577 |
+
]
|
1578 |
+
},
|
1579 |
{
|
1580 |
"cell_type": "code",
|
1581 |
"execution_count": 190,
|
|
|
1590 |
"df['Zugriffe'] = df['Zugriffe'].str.split('\\n\\n\\n', n=1).str[0]"
|
1591 |
]
|
1592 |
},
|
1593 |
+
{
|
1594 |
+
"cell_type": "markdown",
|
1595 |
+
"metadata": {},
|
1596 |
+
"source": [
|
1597 |
+
"### Spalten 'Antworten' und 'Zugriffe' weiter aufteilen\n",
|
1598 |
+
"Dieser Code teilt die Spalten `df.Antworten` und `df.Zugriffe` jeweils an der Stelle `\\n` und behält jeweils den zweiten Teil.\n"
|
1599 |
+
]
|
1600 |
+
},
|
1601 |
{
|
1602 |
"cell_type": "code",
|
1603 |
"execution_count": 191,
|
|
|
1615 |
"df['Zugriffe'] = df['Zugriffe'].str.split('\\n').str[1]"
|
1616 |
]
|
1617 |
},
|
1618 |
+
{
|
1619 |
+
"cell_type": "markdown",
|
1620 |
+
"metadata": {},
|
1621 |
+
"source": [
|
1622 |
+
"### Spalte 'Subject' aufteilen\n",
|
1623 |
+
"Dieser Code teilt die Spalte `df.Subject` am ersten Vorkommen von `\\n` in zwei separate Spalten.\n"
|
1624 |
+
]
|
1625 |
+
},
|
1626 |
{
|
1627 |
"cell_type": "code",
|
1628 |
"execution_count": 192,
|
|
|
1680 |
"df[['Subject_Part2_2_2_split', 'Subject_Part2_2_2_rest']] = df['Subject_Part2_2_2'].str.split('\\n', n=1, expand=True)"
|
1681 |
]
|
1682 |
},
|
1683 |
+
{
|
1684 |
+
"cell_type": "markdown",
|
1685 |
+
"metadata": {},
|
1686 |
+
"source": [
|
1687 |
+
"### Unnötige Spalten entfernen\n",
|
1688 |
+
"Dieser Code entfernt die Spalten `Stats`, `LastPost`, `Subject_Part2`, `Subject_Part2_2`, `Subject_Part2_2_1`, `Subject` und `Subject_Part2_2_2` aus dem DataFrame `df`.\n"
|
1689 |
+
]
|
1690 |
+
},
|
1691 |
{
|
1692 |
"cell_type": "code",
|
1693 |
"execution_count": 196,
|
|
|
1701 |
"df = df.drop(columns=['Stats', 'LastPost', 'Subject_Part2', 'Subject_Part2_2', 'Subject_Part2_2_1', 'Subject', 'Subject_Part2_2_2'])"
|
1702 |
]
|
1703 |
},
|
1704 |
+
{
|
1705 |
+
"cell_type": "markdown",
|
1706 |
+
"metadata": {},
|
1707 |
+
"source": [
|
1708 |
+
"### Spalteninhalte vergleichen\n",
|
1709 |
+
"Dieser Code vergleicht die Inhalte der Spalten `Antworten` und `Subject_Part2_1`.\n"
|
1710 |
+
]
|
1711 |
+
},
|
1712 |
{
|
1713 |
"cell_type": "code",
|
1714 |
"execution_count": 197,
|
|
|
1737 |
"print(f\"Do the 'Antworten' and 'Subject_Part2_1' columns have the same content?: {comparison_result}\")"
|
1738 |
]
|
1739 |
},
|
1740 |
+
{
|
1741 |
+
"cell_type": "markdown",
|
1742 |
+
"metadata": {},
|
1743 |
+
"source": [
|
1744 |
+
"### Weitere Spalteninhalte vergleichen\n",
|
1745 |
+
"Dieser Code vergleicht die Inhalte der Spalten `User_LastPost` und `Subject_Part2_2_2_split` sowie `Date_LastPost` und `Subject_Part2_2_2_rest`.\n"
|
1746 |
+
]
|
1747 |
+
},
|
1748 |
{
|
1749 |
"cell_type": "code",
|
1750 |
"execution_count": 198,
|
|
|
1776 |
"print(f\"Do the 'Date_LastPost' and 'Subject_Part2_2_2_rest' columns have the same content?: {comparison_result_date}\")"
|
1777 |
]
|
1778 |
},
|
1779 |
+
{
|
1780 |
+
"cell_type": "markdown",
|
1781 |
+
"metadata": {},
|
1782 |
+
"source": [
|
1783 |
+
"### Spalten umbenennen\n",
|
1784 |
+
"Dieser Code benennt die Spalten im DataFrame `df` um.\n"
|
1785 |
+
]
|
1786 |
+
},
|
1787 |
{
|
1788 |
"cell_type": "code",
|
1789 |
"execution_count": 199,
|
|
|
1806 |
"})"
|
1807 |
]
|
1808 |
},
|
1809 |
+
{
|
1810 |
+
"cell_type": "markdown",
|
1811 |
+
"metadata": {},
|
1812 |
+
"source": [
|
1813 |
+
"### Spaltenreihenfolge ändern\n",
|
1814 |
+
"Dieser Code ändert die Reihenfolge der Spalten im DataFrame `df`.\n"
|
1815 |
+
]
|
1816 |
+
},
|
1817 |
{
|
1818 |
"cell_type": "code",
|
1819 |
"execution_count": 200,
|
|
|
1837 |
"df = df[final_column_order]"
|
1838 |
]
|
1839 |
},
|
1840 |
+
{
|
1841 |
+
"cell_type": "markdown",
|
1842 |
+
"metadata": {},
|
1843 |
+
"source": [
|
1844 |
+
"### Spalte 'Zugriffe' formatieren\n",
|
1845 |
+
"Dieser Code formatiert die Spalte `df.Zugriffe` als ganze Zahl.\n"
|
1846 |
+
]
|
1847 |
+
},
|
1848 |
{
|
1849 |
"cell_type": "code",
|
1850 |
"execution_count": 201,
|
|
|
1866 |
"df['Zugriffe'] = pd.to_numeric(df['Zugriffe'], errors='coerce').fillna(0).astype(int)"
|
1867 |
]
|
1868 |
},
|
1869 |
+
{
|
1870 |
+
"cell_type": "markdown",
|
1871 |
+
"metadata": {},
|
1872 |
+
"source": [
|
1873 |
+
"### Spalten 'Antworten' und 'Antworten2' formatieren\n",
|
1874 |
+
"Dieser Code formatiert die Spalten `df.Antworten` und `df.Antworten2` als ganze Zahl.\n"
|
1875 |
+
]
|
1876 |
+
},
|
1877 |
{
|
1878 |
"cell_type": "code",
|
1879 |
"execution_count": 202,
|
|
|
1888 |
"df['Antworten2'] = pd.to_numeric(df['Antworten2'], errors='coerce').fillna(0).astype(int)"
|
1889 |
]
|
1890 |
},
|
1891 |
+
{
|
1892 |
+
"cell_type": "markdown",
|
1893 |
+
"metadata": {},
|
1894 |
+
"source": [
|
1895 |
+
"### Jahr aus 'Datum_Letzter_Post' extrahieren\n",
|
1896 |
+
"Dieser Code extrahiert Jahreszahlen aus der Spalte `df.Datum_Letzter_Post` und speichert sie in der Spalte `Jahr_Letzter_Post`.\n"
|
1897 |
+
]
|
1898 |
+
},
|
1899 |
{
|
1900 |
"cell_type": "code",
|
1901 |
"execution_count": 216,
|
|
|
1916 |
"df['Jahr_Letzter_Post'] = pd.to_numeric(df['Jahr_Letzter_Post'], errors='coerce').astype('Int64')"
|
1917 |
]
|
1918 |
},
|
1919 |
+
{
|
1920 |
+
"cell_type": "markdown",
|
1921 |
+
"metadata": {},
|
1922 |
+
"source": [
|
1923 |
+
"### DataFrame-Informationen anzeigen\n",
|
1924 |
+
"Dieser Code zeigt Informationen über den DataFrame `df` an.\n"
|
1925 |
+
]
|
1926 |
+
},
|
1927 |
{
|
1928 |
"cell_type": "code",
|
1929 |
"execution_count": 217,
|
|
|
1964 |
"df.info()"
|
1965 |
]
|
1966 |
},
|
1967 |
+
{
|
1968 |
+
"cell_type": "markdown",
|
1969 |
+
"metadata": {},
|
1970 |
+
"source": [
|
1971 |
+
"### Transponierte Daten anzeigen\n",
|
1972 |
+
"Dieser Code zeigt die transponierten Daten des DataFrame `df` an.\n"
|
1973 |
+
]
|
1974 |
+
},
|
1975 |
{
|
1976 |
"cell_type": "code",
|
1977 |
"execution_count": 211,
|
|
|
2082 |
"id": "TGUIR11zUVW-"
|
2083 |
},
|
2084 |
"source": [
|
2085 |
+
"## Analyse\n",
|
2086 |
+
"Dieser Abschnitt enthält die Analyse der Daten.\n"
|
2087 |
+
]
|
2088 |
+
},
|
2089 |
+
{
|
2090 |
+
"cell_type": "markdown",
|
2091 |
+
"metadata": {},
|
2092 |
+
"source": [
|
2093 |
+
"### Wordcloud der Themen\n",
|
2094 |
+
"Dieser Code zeigt die Themen mit den meisten Zugriffen als Wordcloud und entfernt zuvor deutsche Stopwörter.\n"
|
2095 |
]
|
2096 |
},
|
2097 |
{
|
|
|
2140 |
"plt.show()"
|
2141 |
]
|
2142 |
},
|
2143 |
+
{
|
2144 |
+
"cell_type": "markdown",
|
2145 |
+
"metadata": {},
|
2146 |
+
"source": [
|
2147 |
+
"### Lineplot der Jahreszahlen\n",
|
2148 |
+
"Dieser Code zeigt die Spalte `df.Jahr_Letzter_Post` als Lineplot und stellt sicher, dass die x-Achse ganze Jahreszahlen zeigt.\n"
|
2149 |
+
]
|
2150 |
+
},
|
2151 |
{
|
2152 |
"cell_type": "code",
|
2153 |
"execution_count": 221,
|
|
|
2193 |
"plt.show()"
|
2194 |
]
|
2195 |
},
|
2196 |
+
{
|
2197 |
+
"cell_type": "markdown",
|
2198 |
+
"metadata": {},
|
2199 |
+
"source": [
|
2200 |
+
"### Themen mit den geringsten Jahreszahlen\n",
|
2201 |
+
"Dieser Code zeigt die Themen und die Jahreszahl sowie `Datum_Letzter_Post` für die 10 Zeilen mit den geringsten Werten bei `df.Jahr_Letzter_Post`.\n"
|
2202 |
+
]
|
2203 |
+
},
|
2204 |
{
|
2205 |
"cell_type": "code",
|
2206 |
"execution_count": 225,
|
|
|
2619 |
"result"
|
2620 |
]
|
2621 |
},
|
2622 |
+
{
|
2623 |
+
"cell_type": "markdown",
|
2624 |
+
"metadata": {},
|
2625 |
+
"source": [
|
2626 |
+
"### Themen mit den höchsten Jahreszahlen\n",
|
2627 |
+
"Dieser Code zeigt die Themen und die Jahreszahl sowie `Datum_Letzter_Post` für die 10 Zeilen mit den höchsten Werten bei `df.Jahr_Letzter_Post`.\n"
|
2628 |
+
]
|
2629 |
+
},
|
2630 |
{
|
2631 |
"cell_type": "code",
|
2632 |
"execution_count": 226,
|
|
|
3051 |
"id": "FanmCt50UYMD"
|
3052 |
},
|
3053 |
"source": [
|
3054 |
+
"## Speichern\n",
|
3055 |
+
"Dieser Abschnitt enthält den Code zum Speichern der Daten.\n"
|
3056 |
+
]
|
3057 |
+
},
|
3058 |
+
{
|
3059 |
+
"cell_type": "markdown",
|
3060 |
+
"metadata": {},
|
3061 |
+
"source": [
|
3062 |
+
"### Ordner komprimieren\n",
|
3063 |
+
"Dieser Code komprimiert den Ordner `/content/buergergeld_forum`."
|
3064 |
]
|
3065 |
},
|
3066 |
{
|
|
|
3104 |
"\n",
|
3105 |
"# compress_directory(directory_to_compress, output_zip_filename)"
|
3106 |
]
|
3107 |
+
},
|
3108 |
+
{
|
3109 |
+
"cell_type": "markdown",
|
3110 |
+
"metadata": {},
|
3111 |
+
"source": [
|
3112 |
+
"## Fazit\n",
|
3113 |
+
"\n",
|
3114 |
+
"In diesem Notebook haben wir die grundlegenden Techniken des Web Scraping anhand des Bürgergeld Forums erlernt und angewendet. Die wichtigsten gelernten Inhalte umfassen:\n",
|
3115 |
+
"\n",
|
3116 |
+
"1. **HTML-Seiten herunterladen**:\n",
|
3117 |
+
" - Wir haben gelernt, wie man HTML-Seiten eines Forums herunterlädt und in einem Ordner speichert.\n",
|
3118 |
+
"\n",
|
3119 |
+
"2. **Daten extrahieren**:\n",
|
3120 |
+
" - Wir haben die Texte der relevanten HTML-Elemente extrahiert und in einem Pandas DataFrame gespeichert.\n",
|
3121 |
+
"\n",
|
3122 |
+
"3. **Daten bereinigen und verarbeiten**:\n",
|
3123 |
+
" - Wir haben die extrahierten Daten bereinigt und in verschiedene Spalten aufgeteilt, um sie besser analysieren zu können.\n",
|
3124 |
+
"\n",
|
3125 |
+
"4. **Daten analysieren**:\n",
|
3126 |
+
" - Wir haben verschiedene Analysetechniken angewendet, darunter das Erstellen von Wordclouds und Lineplots, um die Daten zu visualisieren und zu interpretieren.\n",
|
3127 |
+
"\n",
|
3128 |
+
"5. **Daten speichern und komprimieren**:\n",
|
3129 |
+
" - Wir haben gelernt, wie man die verarbeiteten Daten speichert und den Ordner mit den HTML-Dateien komprimiert.\n",
|
3130 |
+
"\n",
|
3131 |
+
"Diese Schritte haben uns gezeigt, wie man Web Scraping effektiv einsetzen kann, um wertvolle Informationen aus Online-Foren zu extrahieren und zu analysieren."
|
3132 |
+
]
|
3133 |
}
|
3134 |
],
|
3135 |
"metadata": {
|
src/04_use_case/jobs/Jobboerse_API.ipynb
CHANGED
@@ -7,13 +7,31 @@
|
|
7 |
"---\n",
|
8 |
"title: \"Jobangebote über die Jobbörse API abrufen\"\n",
|
9 |
"description: \"Ein Tool zur Suche und Analyse von Jobangeboten über die Jobbörse API, einschließlich der Verarbeitung und Visualisierung der Daten.\"\n",
|
10 |
-
"author: \"Benjamin\"\n",
|
11 |
-
"date: \"2024-12-16\"\n",
|
12 |
-
"date-modified: \"2024-12-16\"\n",
|
13 |
"image: _f6a36d83-c0f2-4029-a621-0ccfc358b18a.jpeg\n",
|
14 |
"---"
|
15 |
]
|
16 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
17 |
{
|
18 |
"cell_type": "code",
|
19 |
"execution_count": 2,
|
@@ -58,6 +76,14 @@
|
|
58 |
"print(response.status_code)"
|
59 |
]
|
60 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
61 |
{
|
62 |
"cell_type": "code",
|
63 |
"execution_count": 3,
|
@@ -84,6 +110,14 @@
|
|
84 |
" print(data.keys())"
|
85 |
]
|
86 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
87 |
{
|
88 |
"cell_type": "code",
|
89 |
"execution_count": 4,
|
@@ -95,6 +129,14 @@
|
|
95 |
"stellenangebote = data[\"stellenangebote\"]"
|
96 |
]
|
97 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
98 |
{
|
99 |
"cell_type": "code",
|
100 |
"execution_count": 5,
|
@@ -671,6 +713,14 @@
|
|
671 |
"df"
|
672 |
]
|
673 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
674 |
{
|
675 |
"cell_type": "code",
|
676 |
"execution_count": 6,
|
@@ -796,6 +846,14 @@
|
|
796 |
"beruf_counts\n"
|
797 |
]
|
798 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
799 |
{
|
800 |
"cell_type": "code",
|
801 |
"execution_count": 7,
|
@@ -917,6 +975,14 @@
|
|
917 |
"arbeitgeber_counts"
|
918 |
]
|
919 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
920 |
{
|
921 |
"cell_type": "code",
|
922 |
"execution_count": 8,
|
@@ -968,6 +1034,14 @@
|
|
968 |
"plt.show()"
|
969 |
]
|
970 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
971 |
{
|
972 |
"cell_type": "code",
|
973 |
"execution_count": 9,
|
@@ -1104,6 +1178,14 @@
|
|
1104 |
"df['postleitzahl']"
|
1105 |
]
|
1106 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1107 |
{
|
1108 |
"cell_type": "code",
|
1109 |
"execution_count": 10,
|
@@ -1227,6 +1309,14 @@
|
|
1227 |
"postleitzahl_counts"
|
1228 |
]
|
1229 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1230 |
{
|
1231 |
"cell_type": "code",
|
1232 |
"execution_count": 11,
|
@@ -1265,6 +1355,14 @@
|
|
1265 |
" print(f\"Failed to download GeoJSON data. Status code: {response.status_code}\")"
|
1266 |
]
|
1267 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1268 |
{
|
1269 |
"cell_type": "code",
|
1270 |
"execution_count": 24,
|
@@ -1314,6 +1412,14 @@
|
|
1314 |
"plt.show()"
|
1315 |
]
|
1316 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1317 |
{
|
1318 |
"cell_type": "code",
|
1319 |
"execution_count": 29,
|
@@ -1334,6 +1440,14 @@
|
|
1334 |
"filtered_gdf = gdf[gdf['plz_code'].isin(df['postleitzahl'])]"
|
1335 |
]
|
1336 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1337 |
{
|
1338 |
"cell_type": "code",
|
1339 |
"execution_count": 36,
|
@@ -4498,6 +4612,32 @@
|
|
4498 |
"# Display the map\n",
|
4499 |
"m"
|
4500 |
]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
4501 |
}
|
4502 |
],
|
4503 |
"metadata": {
|
|
|
7 |
"---\n",
|
8 |
"title: \"Jobangebote über die Jobbörse API abrufen\"\n",
|
9 |
"description: \"Ein Tool zur Suche und Analyse von Jobangeboten über die Jobbörse API, einschließlich der Verarbeitung und Visualisierung der Daten.\"\n",
|
|
|
|
|
|
|
10 |
"image: _f6a36d83-c0f2-4029-a621-0ccfc358b18a.jpeg\n",
|
11 |
"---"
|
12 |
]
|
13 |
},
|
14 |
+
{
|
15 |
+
"cell_type": "markdown",
|
16 |
+
"metadata": {},
|
17 |
+
"source": [
|
18 |
+
"## Lernziele\n",
|
19 |
+
"\n",
|
20 |
+
"**Nutzung der Jobbörse API**\n",
|
21 |
+
"\n",
|
22 |
+
"* Abrufen von Jobangeboten über die Jobbörse API.\n",
|
23 |
+
"* Verarbeitung und Analyse der abgerufenen Daten mit Pandas.\n",
|
24 |
+
"* Visualisierung der Daten und Erstellung von * Häufigkeitsverteilungen."
|
25 |
+
]
|
26 |
+
},
|
27 |
+
{
|
28 |
+
"cell_type": "markdown",
|
29 |
+
"metadata": {},
|
30 |
+
"source": [
|
31 |
+
"## API-Anfrage senden\n",
|
32 |
+
"Dieser Code sendet eine Anfrage an die Jobbörse API, um Jobangebote für Erzieher in Berlin abzurufen.\n"
|
33 |
+
]
|
34 |
+
},
|
35 |
{
|
36 |
"cell_type": "code",
|
37 |
"execution_count": 2,
|
|
|
76 |
"print(response.status_code)"
|
77 |
]
|
78 |
},
|
79 |
+
{
|
80 |
+
"cell_type": "markdown",
|
81 |
+
"metadata": {},
|
82 |
+
"source": [
|
83 |
+
"## API-Antwort analysieren\n",
|
84 |
+
"Dieser Code analysiert die API-Antwort und gibt die Schlüssel der JSON-Daten aus.\n"
|
85 |
+
]
|
86 |
+
},
|
87 |
{
|
88 |
"cell_type": "code",
|
89 |
"execution_count": 3,
|
|
|
110 |
" print(data.keys())"
|
111 |
]
|
112 |
},
|
113 |
+
{
|
114 |
+
"cell_type": "markdown",
|
115 |
+
"metadata": {},
|
116 |
+
"source": [
|
117 |
+
"## Stellenangebote extrahieren\n",
|
118 |
+
"Dieser Code extrahiert die Stellenangebote aus den JSON-Daten.\n"
|
119 |
+
]
|
120 |
+
},
|
121 |
{
|
122 |
"cell_type": "code",
|
123 |
"execution_count": 4,
|
|
|
129 |
"stellenangebote = data[\"stellenangebote\"]"
|
130 |
]
|
131 |
},
|
132 |
+
{
|
133 |
+
"cell_type": "markdown",
|
134 |
+
"metadata": {},
|
135 |
+
"source": [
|
136 |
+
"## Stellenangebote als DataFrame darstellen\n",
|
137 |
+
"Dieser Code stellt die Stellenangebote als Pandas DataFrame dar.\n"
|
138 |
+
]
|
139 |
+
},
|
140 |
{
|
141 |
"cell_type": "code",
|
142 |
"execution_count": 5,
|
|
|
713 |
"df"
|
714 |
]
|
715 |
},
|
716 |
+
{
|
717 |
+
"cell_type": "markdown",
|
718 |
+
"metadata": {},
|
719 |
+
"source": [
|
720 |
+
"## Häufigkeitsverteilung der Berufe\n",
|
721 |
+
"Dieser Code berechnet die Häufigkeitsverteilung der Berufe und stellt sie dar.\n"
|
722 |
+
]
|
723 |
+
},
|
724 |
{
|
725 |
"cell_type": "code",
|
726 |
"execution_count": 6,
|
|
|
846 |
"beruf_counts\n"
|
847 |
]
|
848 |
},
|
849 |
+
{
|
850 |
+
"cell_type": "markdown",
|
851 |
+
"metadata": {},
|
852 |
+
"source": [
|
853 |
+
"## Häufigkeitsverteilung der Arbeitgeber\n",
|
854 |
+
"Dieser Code berechnet die Häufigkeitsverteilung der Arbeitgeber und stellt sie dar.\n"
|
855 |
+
]
|
856 |
+
},
|
857 |
{
|
858 |
"cell_type": "code",
|
859 |
"execution_count": 7,
|
|
|
975 |
"arbeitgeber_counts"
|
976 |
]
|
977 |
},
|
978 |
+
{
|
979 |
+
"cell_type": "markdown",
|
980 |
+
"metadata": {},
|
981 |
+
"source": [
|
982 |
+
"## Differenz zwischen Termindaten berechnen und visualisieren\n",
|
983 |
+
"Dieser Code berechnet die Differenz zwischen den Termindaten der Spalten `eintrittsdatum` und `aktuelleVeroeffentlichungsdatum` und visualisiert die Differenz als Histogramm.\n"
|
984 |
+
]
|
985 |
+
},
|
986 |
{
|
987 |
"cell_type": "code",
|
988 |
"execution_count": 8,
|
|
|
1034 |
"plt.show()"
|
1035 |
]
|
1036 |
},
|
1037 |
+
{
|
1038 |
+
"cell_type": "markdown",
|
1039 |
+
"metadata": {},
|
1040 |
+
"source": [
|
1041 |
+
"## Postleitzahl extrahieren\n",
|
1042 |
+
"Dieser Code extrahiert die Postleitzahl aus der Spalte `arbeitsort`.\n"
|
1043 |
+
]
|
1044 |
+
},
|
1045 |
{
|
1046 |
"cell_type": "code",
|
1047 |
"execution_count": 9,
|
|
|
1178 |
"df['postleitzahl']"
|
1179 |
]
|
1180 |
},
|
1181 |
+
{
|
1182 |
+
"cell_type": "markdown",
|
1183 |
+
"metadata": {},
|
1184 |
+
"source": [
|
1185 |
+
"## Häufigkeitsverteilung der Postleitzahlen\n",
|
1186 |
+
"Dieser Code erstellt die Häufigkeitsverteilung der Postleitzahlen.\n"
|
1187 |
+
]
|
1188 |
+
},
|
1189 |
{
|
1190 |
"cell_type": "code",
|
1191 |
"execution_count": 10,
|
|
|
1309 |
"postleitzahl_counts"
|
1310 |
]
|
1311 |
},
|
1312 |
+
{
|
1313 |
+
"cell_type": "markdown",
|
1314 |
+
"metadata": {},
|
1315 |
+
"source": [
|
1316 |
+
"## GeoJSON-Datei herunterladen\n",
|
1317 |
+
"Dieser Code lädt die GeoJSON-Datei für die deutschen Postleitzahlen herunter.\n"
|
1318 |
+
]
|
1319 |
+
},
|
1320 |
{
|
1321 |
"cell_type": "code",
|
1322 |
"execution_count": 11,
|
|
|
1355 |
" print(f\"Failed to download GeoJSON data. Status code: {response.status_code}\")"
|
1356 |
]
|
1357 |
},
|
1358 |
+
{
|
1359 |
+
"cell_type": "markdown",
|
1360 |
+
"metadata": {},
|
1361 |
+
"source": [
|
1362 |
+
"## GeoJSON-Daten visualisieren\n",
|
1363 |
+
"Dieser Code öffnet die heruntergeladene GeoJSON-Datei und zeigt sie als Grafik mit Matplotlib.\n"
|
1364 |
+
]
|
1365 |
+
},
|
1366 |
{
|
1367 |
"cell_type": "code",
|
1368 |
"execution_count": 24,
|
|
|
1412 |
"plt.show()"
|
1413 |
]
|
1414 |
},
|
1415 |
+
{
|
1416 |
+
"cell_type": "markdown",
|
1417 |
+
"metadata": {},
|
1418 |
+
"source": [
|
1419 |
+
"## Postleitzahlen filtern\n",
|
1420 |
+
"Dieser Code wählt alle Zeilen aus der GeoJSON-Datei aus, die auch in `df.postleitzahl` enthalten sind.\n"
|
1421 |
+
]
|
1422 |
+
},
|
1423 |
{
|
1424 |
"cell_type": "code",
|
1425 |
"execution_count": 29,
|
|
|
1440 |
"filtered_gdf = gdf[gdf['plz_code'].isin(df['postleitzahl'])]"
|
1441 |
]
|
1442 |
},
|
1443 |
+
{
|
1444 |
+
"cell_type": "markdown",
|
1445 |
+
"metadata": {},
|
1446 |
+
"source": [
|
1447 |
+
"## Interaktive Deutschlandkarte erstellen\n",
|
1448 |
+
"Dieser Code stellt die Geometrie in `filtered_gdf` auf einer interaktiven Deutschlandkarte dar und markiert die Postleitzahlgebiete anhand ihrer Value Counts auf einer Farbskala."
|
1449 |
+
]
|
1450 |
+
},
|
1451 |
{
|
1452 |
"cell_type": "code",
|
1453 |
"execution_count": 36,
|
|
|
4612 |
"# Display the map\n",
|
4613 |
"m"
|
4614 |
]
|
4615 |
+
},
|
4616 |
+
{
|
4617 |
+
"cell_type": "markdown",
|
4618 |
+
"metadata": {},
|
4619 |
+
"source": [
|
4620 |
+
"## Fazit\n",
|
4621 |
+
"\n",
|
4622 |
+
"In diesem Notebook haben wir die grundlegenden Techniken zur Nutzung der Jobbörse API erlernt und angewendet. Die wichtigsten gelernten Inhalte umfassen:\n",
|
4623 |
+
"\n",
|
4624 |
+
"1. **API-Anfrage senden**:\n",
|
4625 |
+
" - Wir haben gelernt, wie man eine Anfrage an die Jobbörse API sendet, um spezifische Jobangebote abzurufen.\n",
|
4626 |
+
"\n",
|
4627 |
+
"2. **API-Antwort analysieren**:\n",
|
4628 |
+
" - Wir haben die Struktur der API-Antwort analysiert und die relevanten Daten extrahiert.\n",
|
4629 |
+
"\n",
|
4630 |
+
"3. **Datenverarbeitung und -visualisierung**:\n",
|
4631 |
+
" - Wir haben die extrahierten Jobangebote in einem Pandas DataFrame dargestellt und verschiedene Analysen durchgeführt, wie die Häufigkeitsverteilung der Berufe und Arbeitgeber.\n",
|
4632 |
+
"\n",
|
4633 |
+
"4. **Geodaten verarbeiten**:\n",
|
4634 |
+
" - Wir haben Postleitzahlen aus den Jobangeboten extrahiert und die Häufigkeitsverteilung der Postleitzahlen berechnet.\n",
|
4635 |
+
"\n",
|
4636 |
+
"5. **Interaktive Karten erstellen**:\n",
|
4637 |
+
" - Wir haben gelernt, wie man GeoJSON-Daten herunterlädt und visualisiert, sowie interaktive Karten erstellt, um die geografische Verteilung der Jobangebote darzustellen.\n",
|
4638 |
+
"\n",
|
4639 |
+
"Diese Schritte haben uns gezeigt, wie man die Jobbörse API effektiv nutzen kann, um wertvolle Informationen über Jobangebote zu extrahieren, zu analysieren und zu visualisieren."
|
4640 |
+
]
|
4641 |
}
|
4642 |
],
|
4643 |
"metadata": {
|
src/04_use_case/laws/Gesetze_im_Internet_Aktualitätendienst.ipynb
CHANGED
@@ -7,13 +7,31 @@
|
|
7 |
"---\n",
|
8 |
"title: \"RSS-Feed-Analyse: Gesetze im Internet Aktualitätendienst\"\n",
|
9 |
"description: \"Ein Tool zur Extraktion und Analyse von RSS-Feeds des Aktualitätendienstes für Gesetze im Internet, einschließlich der Verarbeitung und Visualisierung der Daten.\"\n",
|
10 |
-
"author: \"Benjamin\"\n",
|
11 |
-
"date: \"2024-12-16\"\n",
|
12 |
-
"date-modified: \"2024-12-16\"\n",
|
13 |
"image: _d38cd4e9-1da8-4d7e-9bae-f01370cd2049.jpeg\n",
|
14 |
"---"
|
15 |
]
|
16 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
17 |
{
|
18 |
"cell_type": "code",
|
19 |
"execution_count": 36,
|
@@ -40,6 +58,14 @@
|
|
40 |
"# !pip install feedparser\n"
|
41 |
]
|
42 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
43 |
{
|
44 |
"cell_type": "code",
|
45 |
"execution_count": 37,
|
@@ -56,6 +82,14 @@
|
|
56 |
"feed = feedparser.parse(feed_url)"
|
57 |
]
|
58 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
59 |
{
|
60 |
"cell_type": "code",
|
61 |
"execution_count": 38,
|
@@ -72,6 +106,14 @@
|
|
72 |
"df = pd.DataFrame(feed.entries)"
|
73 |
]
|
74 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
75 |
{
|
76 |
"cell_type": "code",
|
77 |
"execution_count": 39,
|
@@ -233,6 +275,14 @@
|
|
233 |
"df.iloc[0]\n"
|
234 |
]
|
235 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
236 |
{
|
237 |
"cell_type": "code",
|
238 |
"execution_count": 40,
|
@@ -261,6 +311,14 @@
|
|
261 |
"df.shape"
|
262 |
]
|
263 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
264 |
{
|
265 |
"cell_type": "code",
|
266 |
"execution_count": 41,
|
@@ -462,6 +520,14 @@
|
|
462 |
"df['meta_initiant'].value_counts()"
|
463 |
]
|
464 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
465 |
{
|
466 |
"cell_type": "code",
|
467 |
"execution_count": 42,
|
@@ -505,6 +571,14 @@
|
|
505 |
"plt.show()"
|
506 |
]
|
507 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
508 |
{
|
509 |
"cell_type": "code",
|
510 |
"execution_count": 43,
|
@@ -549,6 +623,14 @@
|
|
549 |
" print(\"Error: 'meta_typ' column not found in the DataFrame.\")"
|
550 |
]
|
551 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
552 |
{
|
553 |
"cell_type": "code",
|
554 |
"execution_count": 49,
|
@@ -599,6 +681,14 @@
|
|
599 |
" print(title) # Added indentation and print statement to display each title on a new line"
|
600 |
]
|
601 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
602 |
{
|
603 |
"cell_type": "code",
|
604 |
"execution_count": 51,
|
@@ -642,6 +732,32 @@
|
|
642 |
"for title in filtered_df['title']:\n",
|
643 |
" print(title)"
|
644 |
]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
645 |
}
|
646 |
],
|
647 |
"metadata": {
|
|
|
7 |
"---\n",
|
8 |
"title: \"RSS-Feed-Analyse: Gesetze im Internet Aktualitätendienst\"\n",
|
9 |
"description: \"Ein Tool zur Extraktion und Analyse von RSS-Feeds des Aktualitätendienstes für Gesetze im Internet, einschließlich der Verarbeitung und Visualisierung der Daten.\"\n",
|
|
|
|
|
|
|
10 |
"image: _d38cd4e9-1da8-4d7e-9bae-f01370cd2049.jpeg\n",
|
11 |
"---"
|
12 |
]
|
13 |
},
|
14 |
+
{
|
15 |
+
"cell_type": "markdown",
|
16 |
+
"metadata": {},
|
17 |
+
"source": [
|
18 |
+
"## Lernziele\n",
|
19 |
+
"\n",
|
20 |
+
"**RSS-Feed-Analyse**\n",
|
21 |
+
"\n",
|
22 |
+
"* Abrufen und Parsen von RSS-Feeds mit feedparser.\n",
|
23 |
+
"* Umwandlung der Feed-Daten in ein Pandas DataFrame.\n",
|
24 |
+
"* Analyse und Visualisierung der Feed-Daten."
|
25 |
+
]
|
26 |
+
},
|
27 |
+
{
|
28 |
+
"cell_type": "markdown",
|
29 |
+
"metadata": {},
|
30 |
+
"source": [
|
31 |
+
"## Bibliothek installieren\n",
|
32 |
+
"Dieser Code installiert die Bibliothek `feedparser`, die für das Parsen von RSS-Feeds verwendet wird.\n"
|
33 |
+
]
|
34 |
+
},
|
35 |
{
|
36 |
"cell_type": "code",
|
37 |
"execution_count": 36,
|
|
|
58 |
"# !pip install feedparser\n"
|
59 |
]
|
60 |
},
|
61 |
+
{
|
62 |
+
"cell_type": "markdown",
|
63 |
+
"metadata": {},
|
64 |
+
"source": [
|
65 |
+
"## RSS-Feed lesen\n",
|
66 |
+
"Dieser Code liest den RSS-Feed von der angegebenen URL mit `feedparser` und speichert ihn in einer Variablen.\n"
|
67 |
+
]
|
68 |
+
},
|
69 |
{
|
70 |
"cell_type": "code",
|
71 |
"execution_count": 37,
|
|
|
82 |
"feed = feedparser.parse(feed_url)"
|
83 |
]
|
84 |
},
|
85 |
+
{
|
86 |
+
"cell_type": "markdown",
|
87 |
+
"metadata": {},
|
88 |
+
"source": [
|
89 |
+
"## Feed in DataFrame umwandeln\n",
|
90 |
+
"Dieser Code wandelt die Feed-Daten in ein Pandas DataFrame um, um sie einfacher analysieren zu können.\n"
|
91 |
+
]
|
92 |
+
},
|
93 |
{
|
94 |
"cell_type": "code",
|
95 |
"execution_count": 38,
|
|
|
106 |
"df = pd.DataFrame(feed.entries)"
|
107 |
]
|
108 |
},
|
109 |
+
{
|
110 |
+
"cell_type": "markdown",
|
111 |
+
"metadata": {},
|
112 |
+
"source": [
|
113 |
+
"## Ersten Eintrag darstellen\n",
|
114 |
+
"Dieser Code stellt den ersten Eintrag des DataFrames dar, um einen Überblick über die Struktur der Daten zu erhalten.\n"
|
115 |
+
]
|
116 |
+
},
|
117 |
{
|
118 |
"cell_type": "code",
|
119 |
"execution_count": 39,
|
|
|
275 |
"df.iloc[0]\n"
|
276 |
]
|
277 |
},
|
278 |
+
{
|
279 |
+
"cell_type": "markdown",
|
280 |
+
"metadata": {},
|
281 |
+
"source": [
|
282 |
+
"## Größe des DataFrames anzeigen\n",
|
283 |
+
"Dieser Code zeigt die Größe des DataFrames an, um die Anzahl der Einträge und Spalten zu ermitteln.\n"
|
284 |
+
]
|
285 |
+
},
|
286 |
{
|
287 |
"cell_type": "code",
|
288 |
"execution_count": 40,
|
|
|
311 |
"df.shape"
|
312 |
]
|
313 |
},
|
314 |
+
{
|
315 |
+
"cell_type": "markdown",
|
316 |
+
"metadata": {},
|
317 |
+
"source": [
|
318 |
+
"## Häufigkeitsverteilung der Spalte 'meta_initiant'\n",
|
319 |
+
"Dieser Code stellt die Häufigkeitsverteilung der Spalte `meta_initiant` dar, um die Verteilung der Initiatoren zu analysieren.\n"
|
320 |
+
]
|
321 |
+
},
|
322 |
{
|
323 |
"cell_type": "code",
|
324 |
"execution_count": 41,
|
|
|
520 |
"df['meta_initiant'].value_counts()"
|
521 |
]
|
522 |
},
|
523 |
+
{
|
524 |
+
"cell_type": "markdown",
|
525 |
+
"metadata": {},
|
526 |
+
"source": [
|
527 |
+
"## Visualisierung der Spalte 'published'\n",
|
528 |
+
"Dieser Code visualisiert die Verteilung der Veröffentlichungsdaten in der Spalte `published` als Histogramm.\n"
|
529 |
+
]
|
530 |
+
},
|
531 |
{
|
532 |
"cell_type": "code",
|
533 |
"execution_count": 42,
|
|
|
571 |
"plt.show()"
|
572 |
]
|
573 |
},
|
574 |
+
{
|
575 |
+
"cell_type": "markdown",
|
576 |
+
"metadata": {},
|
577 |
+
"source": [
|
578 |
+
"## Kreisdiagramm der Spalte 'meta_typ'\n",
|
579 |
+
"Dieser Code stellt die Verteilung der verschiedenen Typen in der Spalte `meta_typ` als Kreisdiagramm dar.\n"
|
580 |
+
]
|
581 |
+
},
|
582 |
{
|
583 |
"cell_type": "code",
|
584 |
"execution_count": 43,
|
|
|
623 |
" print(\"Error: 'meta_typ' column not found in the DataFrame.\")"
|
624 |
]
|
625 |
},
|
626 |
+
{
|
627 |
+
"cell_type": "markdown",
|
628 |
+
"metadata": {},
|
629 |
+
"source": [
|
630 |
+
"## Titel der Einträge für 'Bundesministerium für Arbeit und Soziales'\n",
|
631 |
+
"Dieser Code filtert die Einträge im DataFrame für den Initiator `Bundesministerium für Arbeit und Soziales` und gibt die Titel der Einträge aus.\n"
|
632 |
+
]
|
633 |
+
},
|
634 |
{
|
635 |
"cell_type": "code",
|
636 |
"execution_count": 49,
|
|
|
681 |
" print(title) # Added indentation and print statement to display each title on a new line"
|
682 |
]
|
683 |
},
|
684 |
+
{
|
685 |
+
"cell_type": "markdown",
|
686 |
+
"metadata": {},
|
687 |
+
"source": [
|
688 |
+
"## Titel der Einträge für 'Bundesministerium für Gesundheit'\n",
|
689 |
+
"Dieser Code filtert die Einträge im DataFrame für den Initiator `Bundesministerium für Gesundheit` und gibt die Titel der Einträge aus.\n"
|
690 |
+
]
|
691 |
+
},
|
692 |
{
|
693 |
"cell_type": "code",
|
694 |
"execution_count": 51,
|
|
|
732 |
"for title in filtered_df['title']:\n",
|
733 |
" print(title)"
|
734 |
]
|
735 |
+
},
|
736 |
+
{
|
737 |
+
"cell_type": "markdown",
|
738 |
+
"metadata": {},
|
739 |
+
"source": [
|
740 |
+
"## Fazit\n",
|
741 |
+
"\n",
|
742 |
+
"In diesem Notebook haben wir die grundlegenden Techniken zur Analyse von RSS-Feeds anhand des Aktualitätendienstes für Gesetze im Internet erlernt und angewendet. Die wichtigsten gelernten Inhalte umfassen:\n",
|
743 |
+
"\n",
|
744 |
+
"1. **Bibliothek installieren**:\n",
|
745 |
+
" - Wir haben gelernt, wie man die Bibliothek `feedparser` installiert, um RSS-Feeds zu parsen.\n",
|
746 |
+
"\n",
|
747 |
+
"2. **RSS-Feed lesen**:\n",
|
748 |
+
" - Wir haben den RSS-Feed von einer URL gelesen und die Daten in einer Variablen gespeichert.\n",
|
749 |
+
"\n",
|
750 |
+
"3. **Feed in DataFrame umwandeln**:\n",
|
751 |
+
" - Wir haben die Feed-Daten in ein Pandas DataFrame umgewandelt, um sie einfacher analysieren zu können.\n",
|
752 |
+
"\n",
|
753 |
+
"4. **Daten analysieren und visualisieren**:\n",
|
754 |
+
" - Wir haben verschiedene Analysetechniken angewendet, darunter das Darstellen des ersten Eintrags, das Anzeigen der Größe des DataFrames, die Häufigkeitsverteilung der Spalte `meta_initiant`, die Visualisierung der Veröffentlichungsdaten und die Darstellung der Verteilung der Typen als Kreisdiagramm.\n",
|
755 |
+
"\n",
|
756 |
+
"5. **Daten filtern und ausgeben**:\n",
|
757 |
+
" - Wir haben die Einträge im DataFrame für bestimmte Initiatoren gefiltert und die Titel der Einträge ausgegeben.\n",
|
758 |
+
"\n",
|
759 |
+
"Diese Schritte haben uns gezeigt, wie man RSS-Feeds effektiv analysieren und visualisieren kann, um wertvolle Informationen zu extrahieren."
|
760 |
+
]
|
761 |
}
|
762 |
],
|
763 |
"metadata": {
|
src/_quarto.yml
CHANGED
@@ -47,19 +47,16 @@ website:
|
|
47 |
- href: basics.qmd
|
48 |
section: "No Code Übersicht"
|
49 |
contents:
|
50 |
-
- section: "PDF"
|
51 |
href: 02_basics/pdf.qmd
|
52 |
contents:
|
53 |
- href: 02_basics/pdf/pdf-link-extractor.qmd
|
54 |
-
text: "PDF
|
55 |
- href: 02_basics/pdf/pdf-grouping.qmd
|
56 |
-
text: "
|
57 |
-
-
|
58 |
-
|
59 |
-
|
60 |
-
- href: 02_basics/app_market/google-play-search.qmd
|
61 |
-
text: "Google Play Search"
|
62 |
-
- section: "Webspider"
|
63 |
href: 02_basics/webspider.qmd
|
64 |
contents:
|
65 |
- href: 02_basics/webspider/website-url-extractor.qmd
|
@@ -75,35 +72,31 @@ website:
|
|
75 |
href: 03_low_code/catalogue.qmd
|
76 |
contents:
|
77 |
- href: 03_low_code/catalogue/bookstoscrape.qmd
|
78 |
-
text: "Bücherliste scrapen"
|
79 |
- href: 03_low_code/catalogue/quotes_scraper.ipynb
|
80 |
-
text: "Zitate scrapen"
|
81 |
- href: 03_low_code/app_market_scraping/app_market_scraping.qmd
|
82 |
-
text: "App Markt analysieren"
|
83 |
- section: "Video Transkripte"
|
84 |
href: 03_low_code/video_transcripts.qmd
|
85 |
contents:
|
86 |
- href: 03_low_code/video_transcripts/social-media.qmd
|
87 |
-
text: "Hinweise Scraping Social Media"
|
88 |
- href: 03_low_code/video_transcripts/get_videos_for_youtube_channels.ipynb
|
89 |
-
text: "YouTube Channel Videos"
|
90 |
- href: 03_low_code/video_transcripts/youtube-transcript-extraction.ipynb
|
91 |
-
text: "YouTube Video Transcripts"
|
92 |
- title: "Use-Case"
|
93 |
contents:
|
94 |
- section: "Anwendungsfall Übersicht"
|
95 |
href: use_case.qmd
|
96 |
contents:
|
97 |
- href: 04_use_case/laws/Gesetze_im_Internet_Aktualitätendienst.ipynb
|
98 |
-
text: "Aktualitätendienst Gesetze"
|
99 |
- href: 04_use_case/jobs/Jobboerse_API.ipynb
|
100 |
-
text: "Jobbörse"
|
101 |
- href: 04_use_case/forum/buergergeld_forum.ipynb
|
102 |
-
text: "Buergergeld Forum"
|
103 |
-
- title: "Blog"
|
104 |
-
contents:
|
105 |
-
- href: blog.qmd
|
106 |
-
text: "Blog"
|
107 |
|
108 |
format:
|
109 |
html:
|
|
|
47 |
- href: basics.qmd
|
48 |
section: "No Code Übersicht"
|
49 |
contents:
|
50 |
+
- section: "PDF📝"
|
51 |
href: 02_basics/pdf.qmd
|
52 |
contents:
|
53 |
- href: 02_basics/pdf/pdf-link-extractor.qmd
|
54 |
+
text: "PDF Sammler🔍"
|
55 |
- href: 02_basics/pdf/pdf-grouping.qmd
|
56 |
+
text: "PDFs gruppieren🗂️"
|
57 |
+
- href: 02_basics/app_market/google-play-search.qmd
|
58 |
+
text: "Google Play Search🛒"
|
59 |
+
- section: "Webspider🕸️"
|
|
|
|
|
|
|
60 |
href: 02_basics/webspider.qmd
|
61 |
contents:
|
62 |
- href: 02_basics/webspider/website-url-extractor.qmd
|
|
|
72 |
href: 03_low_code/catalogue.qmd
|
73 |
contents:
|
74 |
- href: 03_low_code/catalogue/bookstoscrape.qmd
|
75 |
+
text: "Bücherliste scrapen📚"
|
76 |
- href: 03_low_code/catalogue/quotes_scraper.ipynb
|
77 |
+
text: "Zitate scrapen💬"
|
78 |
- href: 03_low_code/app_market_scraping/app_market_scraping.qmd
|
79 |
+
text: "App Markt analysieren📱"
|
80 |
- section: "Video Transkripte"
|
81 |
href: 03_low_code/video_transcripts.qmd
|
82 |
contents:
|
83 |
- href: 03_low_code/video_transcripts/social-media.qmd
|
84 |
+
text: "Hinweise Scraping Social Media⚠️"
|
85 |
- href: 03_low_code/video_transcripts/get_videos_for_youtube_channels.ipynb
|
86 |
+
text: "YouTube Channel Videos🎥"
|
87 |
- href: 03_low_code/video_transcripts/youtube-transcript-extraction.ipynb
|
88 |
+
text: "YouTube Video Transcripts📝"
|
89 |
- title: "Use-Case"
|
90 |
contents:
|
91 |
- section: "Anwendungsfall Übersicht"
|
92 |
href: use_case.qmd
|
93 |
contents:
|
94 |
- href: 04_use_case/laws/Gesetze_im_Internet_Aktualitätendienst.ipynb
|
95 |
+
text: "Aktualitätendienst Gesetze📜"
|
96 |
- href: 04_use_case/jobs/Jobboerse_API.ipynb
|
97 |
+
text: "Jobbörse💼"
|
98 |
- href: 04_use_case/forum/buergergeld_forum.ipynb
|
99 |
+
text: "Buergergeld Forum💬"
|
|
|
|
|
|
|
|
|
100 |
|
101 |
format:
|
102 |
html:
|
src/basics.qmd
CHANGED
@@ -1,17 +1,32 @@
|
|
1 |
---
|
2 |
listing:
|
3 |
- id: no_code
|
4 |
-
contents: ["/02_basics/webspider.qmd","/02_basics/pdf.qmd","/02_basics/app_market
|
5 |
type: grid
|
6 |
---
|
7 |
|
8 |
-
|
9 |
|
10 |
-
|
11 |
-
|
12 |
-
* Einsatz von Tools wie dem Webseiten-URL-Extraktor zur automatischen Extraktion von Links zur Veranschaulichung des Webscraping Prozesses. Verwendung einer einfachen Webspider.
|
13 |
-
* Anwendung von PDF-Link-Extractor-Tools zur systematischen Sammlung von PDFs und Nutzung der PDF-Keyword-Grouping-App zur thematischen Gruppierung.
|
14 |
-
* Identifizierung und Auswertung von Apps eines individuellen Themenbereich (bspw. zivilgesellschaftlich oder Gesundheit).
|
15 |
|
16 |
::: {#no_code}
|
17 |
:::
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
---
|
2 |
listing:
|
3 |
- id: no_code
|
4 |
+
contents: ["/02_basics/webspider.qmd","/02_basics/pdf.qmd","/02_basics/app_market"]
|
5 |
type: grid
|
6 |
---
|
7 |
|
8 |
+
"No Code" ermöglicht es auch Nicht-Programmierern, komplexe Aufgaben wie Webscraping durchzuführen, ohne tiefgehende Kenntnisse in Programmiersprachen zu haben. No-Code-Tools sind besonders nützlich für schnelle Prototypenerstellung, Automatisierung von Arbeitsabläufen und die Lösung spezifischer Probleme, ohne dass umfangreiche Entwicklungsressourcen benötigt werden.
|
9 |
|
10 |
+
## Tutorials
|
|
|
|
|
|
|
|
|
11 |
|
12 |
::: {#no_code}
|
13 |
:::
|
14 |
+
|
15 |
+
## No-Code Scraping
|
16 |
+
|
17 |
+
### ParseHub
|
18 |
+
|
19 |
+
[ParseHub](https://www.parsehub.com/) ist ein No-Code-Webscraping-Tool, das es Benutzern ermöglicht, Daten von Webseiten zu extrahieren, ohne eine einzige Zeile Code schreiben zu müssen.
|
20 |
+
|
21 |
+
- **Visuelle Auswahl**: Klicken Sie auf Elemente auf der Webseite, um sie für das Scraping auszuwählen.
|
22 |
+
- **Automatisierung**: Planen Sie Scraping-Aufgaben, um Daten regelmäßig zu extrahieren.
|
23 |
+
- **Datenexport**: Exportieren Sie die gesammelten Daten in verschiedenen Formaten wie CSV, Excel und JSON.
|
24 |
+
|
25 |
+
### Octoparse
|
26 |
+
|
27 |
+
[Octoparse](https://www.octoparse.com/) bietet eine intuitive Drag-and-Drop-Oberfläche, mit der Benutzer Scraping-Workflows erstellen können, ohne eine einzige Zeile Code schreiben zu müssen.
|
28 |
+
|
29 |
+
- **Drag-and-Drop-Interface**: Erstellen Sie Scraping-Workflows durch einfaches Ziehen und Ablegen von Elementen.
|
30 |
+
- **Cloud-basierte Ausführung**: Führen Sie Scraping-Aufgaben in der Cloud aus, um die Leistung zu maximieren und lokale Ressourcen zu schonen.
|
31 |
+
- **Datenexport**: Exportieren Sie die gesammelten Daten in verschiedenen Formaten wie CSV, Excel und JSON.
|
32 |
+
- **API-Integration**: Integrieren Sie die gesammelten Daten direkt in Ihre Anwendungen über APIs.
|
src/low_code.qmd
CHANGED
@@ -1,14 +1,9 @@
|
|
1 |
---
|
2 |
listing:
|
3 |
- id: low_code
|
4 |
-
contents: ["03_low_code/catalogue.qmd","03_low_code/app_market_scraping.qmd","03_low_code/video_transcripts.qmd"]
|
5 |
type: grid
|
6 |
---
|
7 |
|
8 |
-
|
9 |
-
|
10 |
-
**Extraktion von Buchdaten von der Website "Books to Scrape" mit Python und BeautifulSoup**: Praktische Übung im Web-Scraping, um das gezielte extrahieren aus Datenstrukturen zu verstehen.
|
11 |
-
|
12 |
-
**Scraping von App-Marktdaten**: Erstellen einer Übersicht über den App-Marktplatz, um Apps zu identifizieren, die für die Arbeit von Non-Profit-Organisationen und zivilgesellschaftlichen Akteuren nützlich sein können.
|
13 |
-
|
14 |
-
**Extraktion von YouTube-Transkripten und deren Speicherung als PDF-Dateien**: Lernen, wie man Transkripte von Bildungs- und Informationsvideos extrahiert, um diese Inhalte leichter zugänglich und weiterverwendbar für Bildungsarbeit, Advocacy und Sensibilisierungsmaßnahmen zu machen.
|
|
|
1 |
---
|
2 |
listing:
|
3 |
- id: low_code
|
4 |
+
contents: ["03_low_code/catalogue.qmd","03_low_code/app_market_scraping/app_market_scraping.qmd","03_low_code/video_transcripts.qmd"]
|
5 |
type: grid
|
6 |
---
|
7 |
|
8 |
+
::: {low_code}
|
9 |
+
:::
|
|
|
|
|
|
|
|
|
|
src/use_case.qmd
CHANGED
@@ -5,25 +5,5 @@ listing:
|
|
5 |
type: grid
|
6 |
---
|
7 |
|
8 |
-
## Lernziele
|
9 |
-
|
10 |
-
**Web Scraping von Foren**
|
11 |
-
|
12 |
-
* Herunterladen und Speichern von HTML-Seiten eines Forums.
|
13 |
-
* Extraktion und Analyse von Forenbeiträgen und Metadaten.
|
14 |
-
* Verarbeitung und Bereinigung der extrahierten Daten mit Pandas.
|
15 |
-
|
16 |
-
**Nutzung der Jobbörse API**
|
17 |
-
|
18 |
-
* Abrufen von Jobangeboten über die Jobbörse API.
|
19 |
-
* Verarbeitung und Analyse der abgerufenen Daten mit Pandas.
|
20 |
-
* Visualisierung der Daten und Erstellung von * Häufigkeitsverteilungen.
|
21 |
-
|
22 |
-
**RSS-Feed-Analyse**
|
23 |
-
|
24 |
-
* Abrufen und Parsen von RSS-Feeds mit feedparser.
|
25 |
-
* Umwandlung der Feed-Daten in ein Pandas DataFrame.
|
26 |
-
* Analyse und Visualisierung der Feed-Daten.
|
27 |
-
|
28 |
::: {#use_case}
|
29 |
:::
|
|
|
5 |
type: grid
|
6 |
---
|
7 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
8 |
::: {#use_case}
|
9 |
:::
|