Self Made WordPress Exporter und Takte zur Content Analyse

Für eine Überarbeitung bestehender WordPress Beiträge wollte ich die Beiträge sorgenfrei in ein anderes System exportieren, um dort Änderungen an den Inhalten vorzunehmen. Normalerweise kann man das auch direkt im aktiven WordPress Backend einer Seite erledigen. Nur waren dabei auch Plugin-Tests und diverse Selfmade-Algorithmen im Spiel, die man lieber nicht am Live-System ausprobiert. Das nötige Python-Skript für einen Export lässt beliebige WordPress Blogs in ein WordPress-System transferieren. Die Struktur des Python Notebooks erlaubt auch zusätzliche Addons.

Export vorbereiten: WordPress lokal installieren (empfohlen)

Beim Programmieren einer automatisierten Content Analyse von bestehenden WordPress Beiträgen, ist der Exporter an sich als Kuppelprodukt entstanden. Mit dem Exporter kann der RSS-Feed eines beliebigen WordPress Blogs ausgelesen und in ein WordPress System importiert werden.

Grundsätzlich: Wo das System letztendlich installiert wird, ist egal. Egal wird es dann nicht, wenn man die Sicherheitsfrage stellt. Aus Sicherheitsgründen empfehle ich ausdrücklich den Import in ein geschütztes Backend auf einer Subdomain (Blockieren Sie Suchmaschinen und externe Zugriffe). Das Skript verwendet einen Zugang per xmlrpc.php. Es ist bekannt, dass dies ein Sicherheitsrisiko darstellt. Eine lokale WordPress-Installation per XAMP, MAMP oder wie sie auch immer heißen mögen, wird empfohlen.

Das Skript für einen schnellen WordPress Export

🔥 Im ersten Schritt müssen die Daten eingegeben werden:

Falls es keinen Client gibt zum Bearbeiten und Ausführen von Jupyter Notebooks (Ich empfehle an dieser Stelle dringend Anaconda), dann kann das auch als einfaches Python-Skript ausgeführt werden. Diese Libraries müssen installiert werden:

# Importe
from bs4 import BeautifulSoup
import urllib.request
from urllib.error import HTTPError
from wordpress_xmlrpc import Client, WordPressPost
from wordpress_xmlrpc.methods.taxonomies import *
from wordpress_xmlrpc.methods.posts import *
from wordpress_xmlrpc.methods.users import *
from wordpress_xmlrpc.methods import *
from prettytable import PrettyTable
import nltk
import re
import html

Nun zum Code. Im ersten Schritt muss man selbst aktiv werden. Die folgenden Daten müssen hinterlegt werden:

# DATEN EINTRAGEN
########################################################################################

# Welche Domain soll es denn sein?
DOMAIN = "DOMAIN_EINTRAGEN" # http://example.com
# Domain zum Backend?
BACKEND_URL = "BACKEND_DOMAIN_EINTRAGEN" # http://backend.example.com

# WordPress Login für Backend
wp_user = "USER" # username für WordPress Backend
wp_pass = "PASSWORT" # passwort für WordPress Backend

########################################################################################

Dieser Abschnitt bereitet eine Duplikatsprüfung vor. Damit nicht Duplikate im Backend landen, ziehe ich mir die aktuellen Beiträge aus dem Backend und integriere eine Funktionsaufruf später in der Import-Funktion, um Duplikate zu vermeiden.

# Function: Duplikats-Check: Wir wollen nicht den selben Artikel mehrfach im Backend.
########################################################################################
def noduplicate(candidate):
    
    if candidate in old_posts:
        return False
    
    return True
########################################################################################



# Function: Alle bestehenden Titles in old_posts ablegen
########################################################################################
i = 1

while True:
    
    try:
        
        with urllib.request.urlopen(DOMAIN + '/feed/?paged=' + str(i)) as response:
            feedXYZ = response.read()
        
        soup = BeautifulSoup(feedXYZ, 'xml')

        for item in soup.find_all('item'):

            title = item.title.string
            old_posts.append(title)
        
        i = i + 1
        
    except (HTTPError):
            break         
########################################################################################

Damit wir auch alle Artikel erhalten, loope ich über eine einfache Variable i über die Paginierung des RSS-Feeds.

Im nächsten Abschnitt werden die Artikel in das Backend importiert:

# Schleife, um (neue) Artikel in das Backenend aufzunehmen
########################################################################################
j = 1

while True:
    
    try:
        
        with urllib.request.urlopen(DOMAIN + '/feed/?paged=' + str(j)) as response:
            feedXYZ = response.read()
        
        soup = BeautifulSoup(smokevoteFeed, 'xml')

        for item in soup.find_all('item'):

            pair = (item.title.string, item.encoded)
            
            if (noduplicate(item.title.string)):
                new_posts.append(pair)
        
        j = j + 1
        
    except (HTTPError):
            break
########################################################################################

# function: WordPressXport
########################################################################################
def WordPressXport():
    for pair in new_posts:
    
        post = WordPressPost()
        post.title = str(pair[0])
        post.content = str(pair[1]) 
        post.terms_names = {'post_tag': ['rss-export']}
        post.post_status = 'publish'
        wordpressClient.call(NewPost(post))
########################################################################################

Am Schluss wird eine Tabelle exemplarisch generiert, die Daten zu den Beiträgen präsentiert. In der Version auf Github sind drei Standard-Abfragen implementiert.

RSS Export für WordPress

Weitere Untersuchungsmetriken sind beispielsweise:

  • Termfrequenzen im Textkorpus
  • Anzahl der Wörter im Textkorpus (muss um HTML-Tags bereinigt werden!!!)
  • Anzahl der Elemente zählen (img, p,..)
  • Anzahl der Links innerhalb des Textkorpus
  • In Kombination mit SERP Scrapern inverse Frequenzen berechnen
  • Berechnung von Linkprofilen untereinander

Das Jupyter Notebook gibt’s hier github.com/onlinemarketingscience/wordpress-exporter.