Skip to content

freubreu88-byte/linkedin-post-scraper

Repository files navigation

LinkedIn Post Scraper

Scrapt LinkedIn-Posts von konfigurierten Accounts (Unternehmen, Showcase-Seiten und persönliche Profile) über die Apify API, speichert jeden Post als Markdown-Datei mit Frontmatter und erzeugt einen lesbaren Report mit Executive Summary und Engagement-Statistiken pro Account.

Gedacht für Marketing- und Research-Teams, die systematisch beobachten wollen, was Wettbewerber, Partner oder Branchenkontakte auf LinkedIn veröffentlichen — ohne manuell durch Feeds zu scrollen.

Features

  • Company-, Showcase- und Profil-URLs werden automatisch erkannt
  • Inkrementelles Scrapen: nur neue Posts werden geladen (Duplikate via Post-ID)
  • Markdown-Output mit Frontmatter (Autor, Datum, Likes, Comments, Shares, Reactions, Reposts)
  • Report mit Top-Posts nach Engagement und Pro-Account-Tabellen
  • Einzelne Accounts gezielt scrapen per CLI-Flag

Voraussetzungen

  • Python 3.9+
  • Apify Account mit API-Token
  • Zugriff auf den Apify-Actor A3cAPGpwBEG8RJwse (LinkedIn Posts Scraper)

Setup

1. Repository klonen und Dependencies installieren

git clone https://github.com/<user>/linkedin-post-scraper.git
cd linkedin-post-scraper
pip install -r requirements.txt

2. Apify-Token besorgen und .env anlegen

  1. In der Apify Console einloggen
  2. Personal API Token kopieren
  3. .env aus der Vorlage erstellen:
cp .env.example .env
  1. In der .env das Token eintragen:
APIFY_API_TOKEN=apify_api_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Die .env ist via .gitignore geschützt und wird nicht committet.

3. Accounts konfigurieren

Erstelle eine accounts.json im Projektroot (Beispielstruktur liegt in accounts.example.json):

{
  "accounts": [
    {
      "name": "Firma ABC",
      "url": "https://www.linkedin.com/company/firma-abc/"
    },
    {
      "name": "Showcase XY",
      "url": "https://www.linkedin.com/showcase/showcase-xy/"
    },
    {
      "name": "Max Mustermann",
      "url": "https://www.linkedin.com/in/max-mustermann/"
    }
  ],
  "defaultMaxPosts": 20
}

URL-Typen:

Typ URL-Muster Beispiel
Unternehmensseite /company/<slug>/ https://www.linkedin.com/company/example/
Showcase-Seite /showcase/<slug>/ https://www.linkedin.com/showcase/example/
Persönliches Profil /in/<slug>/ https://www.linkedin.com/in/example/

defaultMaxPosts steuert, wie viele Posts pro Account beim ersten Lauf geholt werden (default: 20). Bei späteren Läufen werden nur neue Posts seit dem letzten Scrape geladen (max 10 pro Account, es sei denn --full wird übergeben).

Auch accounts.json ist in .gitignore — deine Accountliste bleibt lokal.

Nutzung

Alle konfigurierten Accounts scrapen

python3 scrape.py

Nur bestimmte Accounts scrapen

python3 scrape.py --accounts "Firma ABC,Max Mustermann"

Mehr Posts pro Account holen

python3 scrape.py --max-posts 50

Ohne Report-Generierung

python3 scrape.py --no-report

Vollständigen Scrape erzwingen (ignoriert Cache)

python3 scrape.py --full

Output-Struktur

linkedin-post-scraper/
├── scrape.py
├── accounts.json              # Deine Konfiguration (nicht im Git)
├── .env                       # Dein API-Token (nicht im Git)
├── posts/                     # Gescrapte Posts pro Account
│   ├── firma-abc/
│   │   ├── 2026-04-15-<post-id>.md
│   │   └── 2026-04-10-<post-id>.md
│   └── max-mustermann/
│       └── 2026-04-12-<post-id>.md
└── reports/                   # Zeitgestempelte Reports
    └── 2026-04-21-0800-scrape-report.md

Jeder Post wird als Markdown mit Frontmatter gespeichert:

---
author: "Firma ABC"
author_url: "https://www.linkedin.com/company/firma-abc/"
author_info: "Packaging Solutions • 5.000 Follower"
date: "2026-04-15"
post_id: "7185..."
post_url: "https://www.linkedin.com/feed/update/..."
likes: 124
comments: 18
shares: 4
is_repost: false
reactions: "like: 98, celebrate: 20, support: 6"
---

Posttext...

## Bilder

![](https://media.licdn.com/...)

Für AI-Agents (Claude Code, Cursor, ...)

Dieser Scraper lässt sich gut als Tool in einen Agent-Workflow integrieren. Typischer Ablauf:

  1. Accounts einrichten — Agent fragt den User, welche Profile/Companies/Showcases beobachtet werden sollen, und erstellt accounts.json.
  2. Scrape ausführenpython3 scrape.py
  3. Report lesen — Agent liest den generierten Report aus reports/
  4. Engagement-Analyse — Agent liest die Top-Posts als Markdown aus posts/ und fasst zusammen:
    • Welches Format performt am besten?
    • Welche Themen erzeugen Engagement?
    • Content-Ideen für das eigene Team

Claude Code Skill

Das Repo enthält einen fertigen Claude Code Skill unter .claude/skills/linkedin-scraper/SKILL.md. Er steuert den kompletten Ablauf: Config prüfen → Scrape ausführen → Report generieren → Top-Posts analysieren → Takeaways formulieren.

Sobald das Repo geklont ist, erkennt Claude Code den Skill automatisch. Auslöser-Phrasen:

  • "linkedin scrapen"
  • "posts scrapen"
  • "was posten die auf linkedin"
  • "linkedin report"
  • "konkurrenz linkedin"

Um den Skill auch außerhalb dieses Projekts verfügbar zu machen, einfach den Ordner .claude/skills/linkedin-scraper/ nach ~/.claude/skills/linkedin-scraper/ kopieren.

CLI-Flags Übersicht

Flag Beschreibung Default
--max-posts N Max Posts pro Account 20 (bzw. defaultMaxPosts aus accounts.json)
--accounts "A,B" Nur diese Accounts scrapen alle
--no-report Report-Generierung überspringen Report wird erzeugt
--full Cache ignorieren, alles neu holen inkrementell

Apify-Kosten

Der Actor A3cAPGpwBEG8RJwse rechnet über dein Apify-Konto ab. Preise siehe Actor-Seite in Apify. Bei ca. 10 Accounts × 20 Posts ist ein Lauf meist im Free-Tier möglich — check dein Usage-Dashboard.

Lizenz

MIT — siehe LICENSE

About

LinkedIn Post Scraper via Apify API — Markdown-Output + Engagement-Reports

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages