Holen Sie sich RSS-Feeds mit Python + Pandas → Post to Mattermost & Save to DB

Was ich getan habe

Ich wollte Mattermost vorstellen und etwas ausprobieren, also habe ich ein Programm zum Posten von RSS-Feeds erstellt. (Später ist es ein Geheimnis, dass ich bemerkt habe, dass es ein [offizielles Projekt] gab (https://github.com/bitbackofen/Rss-Atom-Feed-Integration-for-Mattermost))

Ich dachte, dass es auf verschiedene Arten angewendet werden könnte, also verarbeitete ich das erworbene Futter mit Pandas. Ich habe beschlossen, es in der DB zu speichern.

Umgebung

PostgreSQL wurde aus dem Docker-Image eingeführt.

docker pull postgres:9.5
docker run -p 5432:5432 --name postgres-server -v /var/lib/postgresql:/var/lib/postgresql:rw  postgres:9.5
firewall-cmd --permanent --add-port=5432/tcp
firewall-cmd --reload

Dadurch sollte ein PostgreSQL-Container gestartet werden, der vorerst remote verbunden werden kann. Docker ist bequem. .. ..

Andere Umgebungskonstruktionen werden weggelassen und Python wird in der Pyenv-Umgebung implementiert.

1. Holen Sie sich den RSS-Feed.

Wir verwenden eine Python-Bibliothek namens "feedparser". Ich habe es mit pip installiert und mich auf diesen Bereich bezogen.

http://qiita.com/shunsuke227ono/items/da52a290f78924c1f485

import feedparser

RSS_URL = "http://b.hatena.ne.jp/hotentry/it.rss"
print("Start get feed from %s" % (RSS_URL))
feed = feedparser.parse(RSS_URL)

Jetzt können Sie den Feed erhalten. (Übrigens habe ich einen heißen Eintrag in der Technologiekategorie von Hatena bekommen.)

2. Extrahieren Sie den abgerufenen Feed in pandas.DataFrame

Zuordnung zu pandas.DataFrame zur Vereinfachung der zukünftigen Verarbeitung.

import pandas as pd
entries = pd.DataFrame(feed.entries)

...das Ende. Pandas ist ausgezeichnet.

Im Fall von Hatenas RSS-Feed wurden die folgenden 12 Spaltenelemente erfasst.

Zu diesem Zeitpunkt können Sie die Daten mit der Pandas-Funktion frei bearbeiten.

3. Suchen Sie nach neuen Feeds

feedparser ist sehr praktisch, erhält den Feed jedoch zum Zeitpunkt des Zugriffs, sodass er mit dem in der Vergangenheit erhaltenen Feed dupliziert wird.

Hier kommt die Bedeutung der Erweiterung auf DataFrame zum Ausdruck! Im Folgenden finden Sie ein Beispiel für das Extrahieren und Anzeigen nur neuer Feeds durch Betreiben von DataFrame.

already_print_feeds = pd.Series()

while True:
        time.sleep(300)
        feed = feedparser.parse(RSS_URL)
        entries = pd.DataFrame(feed.entries)
        new_entries = entries[~entries['id'].isin(already_print_feeds)]
        if not new_entries.empty:
            for key, row in new_entries.iterrows():
                feedinfo = "[**%s**](%s)\n\n>%s"%(row['title'],row['link'],tag_re.sub('',row['summary']))
                print(feedinfo)
        already_print_feeds = already_print_feeds.append(new_entries['id'])

Ein kleiner Kommentar

new_entries = entries[~entries['id'].isin(already_print_feeds)]

Es werden nur Neuankömmlinge aus dem abgerufenen RSS-Feed abgerufen.

Es wird angenommen, dass "schon_print_feeds" die "ID" der bisher erhaltenen RSS-Feeds enthält.

Dann von den Feeds, die in "Einträgen" gespeichert sind, Da Serires mit "True" nur für neue Zeilen gesetzt ist, wird zurückgegeben, Wenn Sie dies als Index für "Einträge" angeben, können Sie nur Neuankömmlinge extrahieren.

~entries['id'].isin(already_print_feeds)
# =>
0     False
1     True # => ★New!
2     False
3     False
4     False
5     False
6     False
7     False
8     False
9     False
10    False
11    False
12    False
13    False
14    False
15    False
16    False
17    False
18    False
19    True # => ★New!
20    False
21    False
22    False
23    False
24    False
25    False
26    False
27    False
28    False
29    False
Name: id, dtype: bool

Sie können die ID des neuen Feeds, der bisher angezeigt wurde, zu "ready_print_feeds "hinzufügen.

already_print_feeds = already_print_feeds.append(new_entries['id'])

: warning: Mit dem obigen Code werden Daten jedoch auf unbestimmte Zeit in again_print_feeds akkumuliert, sodass sie eines Tages (Speicher) ausfallen. Lassen Sie uns einmal am Tag flashen oder aus der Datenbank lesen

4. In DB speichern (PostgreSQL)

Speichern Sie den abgerufenen RSS-Feed in PostgreSQL. Die Spalten sind jedoch auf Folgendes eingegrenzt.

Erstellen Sie zunächst eine Tabelle in der Datenbank.

create table feed ( id text primary key , link text, title text, summary text, updated timestamp );

Zur Zeit habe ich eine Primärschlüsseleinschränkung in id eingefügt und aktualisiert ist ein Zeitstempeltyp. (Es scheint, dass die aktualisierte Version von Hatenas Feed so wie er ist als Zeitstempeltyp eingefügt werden kann.)

from sqlalchemy import create_engine

DATABASE_CONN = "postgresql://xxxx:xxxx@xxxxx:xxx/xxxx"
DATABASE_TABLE = "feed"
# connect database
engine = create_engine(DATABASE_CONN)

# Store database
stored_entries = new_entries.ix[:, [
                "id", "link", "title", "summary", "updated"]]
stored_entries.to_sql(DATABASE_TABLE, engine, index=False, if_exists='append')

Verwenden Sie die Methode "to_sql" des DataFrame.

Auf diese Weise wird die Indexspalte zum Zeitpunkt der Speicherung nicht willkürlich hinzugefügt.

Anschließend werden der bereits vorhandenen Tabelle Daten hinzugefügt.

5. Post to Matter Most

Es ist sehr einfach, mit einer Python-Bibliothek namens "request" zu posten, die HTTP-Anfragen sendet.

import requests
import json

mattermosturl = "MatterMost eingehende Webhook-URL"
username = "Lieblingsname"
header = {'Content-Type': 'application/json'}
payload = {
        "text": feedinfo,
        "username": username,
        }

resp = requests.post(mattermosturl,
                     headers=header, data=json.dumps(payload))

damit

Da ich es Pandas zugeordnet habe, Ich möchte auch Dinge wie maschinelles Lernen tun.

Recommended Posts

Holen Sie sich RSS-Feeds mit Python + Pandas → Post to Mattermost & Save to DB
Mit Python auf Twitter posten
Konvertieren Sie mit Python für .NET von Pandas DataFrame in System.Data.DataTable
Versuchen Sie, eine Excel-Datei mit Python (Pandas / XlsxWriter) zu betreiben
Versuchen Sie, eine Excel-Datei mit Python (Pandas / XlsxWriter) zu betreiben
Ermöglichen Sie die schnelle Ausführung von Python-Skripten in Cloud Run mithilfe des Responders
Speichern Sie Bilder mit Python3-Anforderungen
Post von Python nach Slack
[Python] Liste in Pandas konvertieren [Pandas]
Starten Sie mit Python zu Selen
Datenanalyse mit Python-Pandas
Post an Slack in Python
Ich habe versucht, mit Pandas eine Pferderenn-Datenbank zu erstellen
python / pandas / dataframe / So erhalten Sie die einfachste Zeile / Spalte / Index / Spalte
Verarbeiten Sie das Ausführungsergebnis von Splunk mit Python und speichern Sie es in einer Datei
So erhalten Sie mithilfe der Mastodon-API Follower und Follower von Python
Python-Handspiel (RDKit-Deskriptorberechnung: SDF zu CSV mit Pandas)
[Python] Ich habe versucht, mithilfe der YouTube-Daten-API verschiedene Informationen abzurufen!
So installieren Sie Python mit Anaconda
[Python] Laden von CSV-Dateien mit Pandas
Link, um mit Python zu beginnen
[Python] Verwendung der Pandas-Serie
Post von Python auf Facebook Timeline
[Lambda] [Python] Von Lambda auf Twitter posten!
So erhalten Sie die Python-Version
Erste Schritte mit Python
[Einführung in Python] Verwenden wir Pandas
Holen Sie sich ein Kommunikationsmemo in Python
Poste ein Bild von Python auf Tumblr
Versuchen Sie, Statistiken mit e-Stat abzurufen
[Einführung in Python] Verwenden wir Pandas
Mit Python 3 einfach auf Twitter posten
[Nanonets] Wie poste ich Memo [Python]
[Einführung in Python] Verwenden wir Pandas
Python-Version, um nicht verwendete Ports zu erhalten
So erhalten Sie den Wert aus dem Parameterspeicher in Lambda (mit Python)
POST-Fotos mit Microsoft Bing Image Search API, um Image Insights (Python) zu erhalten
Versuchen Sie, die Datenbank unter IBM i mit Python + JDBC mithilfe von JayDeBeApi zu starten