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.
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.
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.)
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.
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'])
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
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.
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))
Da ich es Pandas zugeordnet habe, Ich möchte auch Dinge wie maschinelles Lernen tun.
Recommended Posts