So kratzen Sie Webseiten und veröffentlichen Inhalte auf Twitter mit Python 3

Der Autor hat The Computer History Museum ausgewählt, um eine Spende als Teil des Write for DOnations zu erhalten. Programm.

Einführung

Twitter Bots bieten eine leistungsstarke Möglichkeit, Ihre sozialen Medien zu verwalten und Informationen aus dem Microblogging-Netzwerk zu extrahieren. Durch die Nutzung der vielseitigen APIs von Twitter kann ein Bot eine Menge Dinge tun: Tweeten, Retweeten, "Lieblings-Tweet", Leute mit bestimmten Interessen verfolgen, automatisch antworten und so weiter. Obwohl Menschen die Macht ihres Bots missbrauchen können und dies zu einer negativen Erfahrung für andere Benutzer führt, zeigen Untersuchungen, dass Menschen Twitter-Bots als glaubwürdige Informationsquelle ansehen. Beispielsweise kann ein Bot Ihre Follower mit Inhalten beschäftigen, auch wenn Sie nicht online sind. Einige Bots liefern sogar wichtige und hilfreiche Informationen, wie @EarthquakesSF. Die Anwendungen für Bots sind unbegrenzt. Ab 2019 machen Bots schätzungsweise etwa 24% aller Tweets auf Twitter aus.

In diesem Tutorial erstellen Sie einen Twitter-Bot mit this Twitter API library für Python. Sie verwenden API-Schlüssel von Ihrem Twitter-Konto, um Ihren Bot zu autorisieren und einen zu erstellen, mit dem Sie Inhalte von zwei Websites scrappen können. Außerdem programmieren Sie Ihren Bot so, dass abwechselnd und in festgelegten Zeitintervallen Inhalte von diesen beiden Websites getwittert werden. Beachten Sie, dass Sie in diesem Lernprogramm Python 3 verwenden.

Voraussetzungen

Sie benötigen Folgendes, um dieses Lernprogramm abzuschließen:

Schritt 1 - Einrichten Ihres Entwicklerkontos und Zugriff auf Ihre Twitter-API-Schlüssel

Bevor Sie mit dem Codieren Ihres Bots beginnen, benötigen Sie die API-Schlüssel für Twitter, um die Anforderungen Ihres Bots zu erkennen. In diesem Schritt richten Sie Ihr Twitter-Entwicklerkonto ein und greifen auf Ihre API-Schlüssel für Ihren Twitter-Bot zu.

Um Ihre API-Schlüssel zu erhalten, gehen Sie zu https://developer.twitter.com [developer.twitter.com] und registrieren Sie Ihre Bot-Anwendung bei Twitter, indem Sie oben rechts auf der Seite auf * Übernehmen * klicken.

Klicken Sie nun auf * Entwickleraccount beantragen *.

Klicken Sie anschließend auf "Weiter", um Ihren Twitter-Benutzernamen mit der Bot-Anwendung zu verknüpfen, die Sie in diesem Tutorial erstellen.

Bild: https: //assets.digitalocean.com/articles/TwitterPython/step1a.png [Twitter Benutzername Assoziation mit Bot]

Auf der nächsten Seite wählen Sie für die Zwecke dieses Lernprogramms die Option * Ich fordere Zugang für meinen persönlichen Gebrauch an *, da Sie einen Bot für Ihren persönlichen Bildungsgebrauch erstellen.

image: https://assets.digitalocean.com/articles/TwitterPython/step1b.png [Persönliche Verwendung der Twitter-API]

Fahren Sie nach der Auswahl Ihres * Kontonamens * und * Landes * mit dem nächsten Abschnitt fort. Wählen Sie für * Welche Anwendungsfälle interessieren Sie? * Die Optionen * Tweets veröffentlichen und kuratieren * und * Studentenprojekt / Code lernen * aus. Diese Kategorien veranschaulichen am besten, warum Sie dieses Lernprogramm abschließen.

Geben Sie anschließend eine Beschreibung des Bots ein, den Sie erstellen möchten. Twitter benötigt dies, um sich vor Bot-Missbrauch zu schützen. 2018 führten sie eine solche Überprüfung ein. In diesem Lernprogramm werden Sie technisch ausgerichtete Inhalte von https://thenewstack.io [The New Stack] und https://blog.coursera.org [The Coursera Blog] scrappen.

Wenn Sie entscheiden, was in das Feld * description * eingegeben werden soll, geben Sie Ihre Antwort für die Zwecke dieses Lernprogramms in den folgenden Zeilen ein:

_Ich verfolge ein Tutorial, um einen Twitter-Bot zu erstellen, der Inhalte von Websites wie thenewstack.io (The New Stack) und blog.coursera.org (Courseras Blog) entfernt und Zitate aus diesen twittert. Der gestrichene Inhalt wird aggregiert und über Python-Generatorfunktionen in einem Round-Robin-Verfahren getwittert.

Wählen Sie schließlich * Nein * für * Werden Ihre Produkte, Dienstleistungen oder Analysen Twitter-Inhalte oder abgeleitete Informationen einer staatlichen Stelle zur Verfügung stellen? *

Akzeptieren Sie anschließend die Nutzungsbedingungen von Twitter, klicken Sie auf "Antrag einreichen" und bestätigen Sie Ihre E-Mail-Adresse. Twitter sendet Ihnen nach dem Absenden dieses Formulars eine Bestätigungs-E-Mail.

Sobald Sie Ihre E-Mail-Adresse bestätigt haben, erhalten Sie eine Seite * Bewerbung wird geprüft * mit einem Feedback-Formular für den Bewerbungsprozess.

Sie erhalten auch eine weitere E-Mail von Twitter bezüglich der Überprüfung:

Bild: https://assets.digitalocean.com/articles/TwitterPython/step1e.png [E-Mail zur Anwendungsüberprüfung]

Der Zeitplan für die Überprüfung von Twitter-Bewerbungen kann erheblich variieren. Oftmals wird Twitter dies jedoch innerhalb weniger Minuten bestätigen. Sollte die Prüfung Ihres Antrags jedoch länger dauern, ist dies nicht ungewöhnlich und sollte innerhalb von ein oder zwei Tagen bei Ihnen eingehen. Sobald Sie eine Bestätigung erhalten haben, hat Twitter Sie autorisiert, Ihre Schlüssel zu generieren. Sie können auf diese unter der Registerkarte * Schlüssel und Token * zugreifen, indem Sie auf die Detailschaltfläche Ihrer App unter developer.twitter.com/apps klicken.

Rufen Sie schließlich die Registerkarte "Berechtigungen" auf der Seite Ihrer App auf und setzen Sie die Option "Zugriffsberechtigung" auf "Lesen und Schreiben", da Sie auch Tweet-Inhalte schreiben möchten. Normalerweise verwenden Sie den schreibgeschützten Modus für Forschungszwecke wie das Analysieren von Trends, Data Mining usw. Mit der letzten Option können Benutzer Chatbots in ihre vorhandenen Apps integrieren, da Chatbots Zugriff auf direkte Nachrichten benötigen.

Sie haben Zugriff auf die leistungsstarke API von Twitter, die ein wichtiger Bestandteil Ihrer Bot-Anwendung ist. Jetzt richten Sie Ihre Umgebung ein und beginnen mit dem Aufbau Ihres Bots.

Schritt 2 - Das Wesentliche aufbauen

In diesem Schritt schreiben Sie Code, um Ihren Bot mithilfe der API-Schlüssel bei Twitter zu authentifizieren, und erstellen den ersten programmgesteuerten Tweet über Ihr Twitter-Handle. Dies ist ein guter Meilenstein auf Ihrem Weg zum Ziel, einen Twitter-Bot zu erstellen, der Inhalte von https://thenewstack.io [The New Stack] und https://blog.coursera.org [Coursera Blog] und entfernt twittert sie regelmäßig.

Zunächst richten Sie einen Projektordner und eine bestimmte Programmierumgebung für Ihr Projekt ein.

Erstellen Sie Ihren Projektordner:

mkdir

In den Projektordner verschieben:

cd

Erstellen Sie dann eine neue virtuelle Python-Umgebung für Ihr Projekt:

python3 -m venv

Aktivieren Sie dann Ihre Umgebung mit dem folgenden Befehl:

source /bin/activate

Dadurch wird der Eingabeaufforderung in Ihrem Terminalfenster ein "+ (Vogel-Umgebung) +" vorangestellt.

Wechseln Sie nun in Ihren Texteditor und erstellen Sie eine Datei mit dem Namen "+ credentials.py +", in der Ihre Twitter-API-Schlüssel gespeichert werden:

nano credentials.py

Fügen Sie den folgenden Inhalt hinzu und ersetzen Sie den hervorgehobenen Code durch Ihre Schlüssel von Twitter:

bird / credentials.py

ACCESS_TOKEN=''
ACCESS_SECRET=''
CONSUMER_KEY=''
CONSUMER_SECRET=''

Jetzt installieren Sie die Haupt-API-Bibliothek zum Senden von Anfragen an Twitter. Für dieses Projekt benötigen Sie die folgenden Bibliotheken: "+ nltk ", " request ", " twitter ", " lxml ", " random " und " time ". ` random ` und ` time +` sind Teil der Python-Standardbibliothek, sodass Sie diese Bibliotheken nicht separat installieren müssen. Um die restlichen Bibliotheken zu installieren, verwenden Sie pip, einen Paketmanager für Python.

Öffnen Sie Ihr Terminal, vergewissern Sie sich, dass Sie sich im Projektordner befinden, und führen Sie den folgenden Befehl aus:

pip3 install lxml nltk requests twitter
  • "+ lxml " und " Anfragen +": Sie werden sie für das Web-Scraping verwenden.

  • + twitter: Dies ist die Bibliothek für API-Aufrufe an die Twitter-Server.

  • + nltk +: (Toolkit in natürlicher Sprache) Sie werden verwenden, um Absätze von Blogs in Sätze aufzuteilen.

  • + random +: Hiermit können Sie zufällig Teile eines gesamten Blogposts auswählen.

  • + time +: Mit dieser Option können Sie Ihren Bot nach bestimmten Aktionen in regelmäßigen Abständen zum Schlafen bringen.

Sobald Sie die Bibliotheken installiert haben, können Sie mit der Programmierung beginnen. Jetzt importieren Sie Ihre Anmeldeinformationen in das Hauptskript, mit dem der Bot ausgeführt wird. Erstellen Sie in Ihrem Texteditor neben "+ credentials.py " eine Datei im "+" - Projektverzeichnis und nennen Sie sie "+ bot.py +":

nano bot.py

In der Praxis würden Sie die Funktionalität Ihres Bots auf mehrere Dateien verteilen, wenn er immer komplexer wird. In diesem Lernprogramm fügen Sie jedoch Ihren gesamten Code zu Demonstrationszwecken in ein einziges Skript ein: "+ bot.py +".

Zuerst testen Sie Ihre API-Schlüssel, indem Sie Ihren Bot autorisieren. Beginnen Sie mit dem Hinzufügen des folgenden Snippets zu "+ bot.py +":

bird / bot.py

import random
import time

from lxml.html import fromstring
import nltk
nltk.download('punkt')
import requests
from twitter import OAuth, Twitter

import credentials

Hier importieren Sie die erforderlichen Bibliotheken. und in einigen Fällen importieren Sie die erforderlichen functions aus den Bibliotheken. Sie werden die Funktion + fromstring + später im Code verwenden, um die Zeichenfolgenquelle einer gestrichenen Webseite in eine Baumstruktur zu konvertieren, die es einfacher macht, relevante Informationen von der Seite zu extrahieren. + OAuth + hilft Ihnen bei der Erstellung eines Authentifizierungsobjekts aus Ihren Schlüsseln, und + Twitter + erstellt das Haupt-API-Objekt für die weitere Kommunikation mit den Servern von Twitter.

Erweitern Sie nun + bot.py + mit den folgenden Zeilen:

bird / bot.py

...
tokenizer = nltk.data.load('tokenizers/punkt/english.pickle')

oauth = OAuth(
       credentials.ACCESS_TOKEN,
       credentials.ACCESS_SECRET,
       credentials.CONSUMER_KEY,
       credentials.CONSUMER_SECRET
   )
t = Twitter(auth=oauth)

+ nltk.download ('punkt') + lädt einen Datensatz herunter, der zum Parsen von Absätzen und zum Tokenisieren (Aufteilen) in kleinere Komponenten erforderlich ist. + tokenizer + ist das Objekt, das Sie später im Code zum Aufteilen von in Englisch geschriebenen Absätzen verwenden werden.

"+ oauth " ist das Authentifizierungsobjekt, das erstellt wird, indem die importierte " OAuth " - Klasse mit Ihren API-Schlüsseln gespeist wird. Sie authentifizieren Ihren Bot über die Zeile ` t = Twitter (auth = oauth) `. " ACCESS_TOKEN " und " ACCESS_SECRET " helfen bei der Erkennung Ihrer Anwendung. Schließlich helfen " CONSUMER_KEY " und " CONSUMER_SECRET ", das Handle zu erkennen, über das die Anwendung mit Twitter interagiert. Mit diesem " t +" - Objekt teilen Sie Twitter Ihre Anfragen mit.

Speichern Sie nun diese Datei und führen Sie sie in Ihrem Terminal mit dem folgenden Befehl aus:

python3 bot.py

Ihre Ausgabe sieht ungefähr so ​​aus, was bedeutet, dass Ihre Autorisierung erfolgreich war:

Output[nltk_data] Downloading package punkt to /Users/binaryboy/nltk_data...
[nltk_data]   Package punkt is already up-to-date!

Wenn Sie eine Fehlermeldung erhalten, überprüfen Sie Ihre gespeicherten API-Schlüssel mit denen in Ihrem https://developer.twitter.com [Twitter-Entwicklerkonto] und versuchen Sie es erneut. Stellen Sie außerdem sicher, dass die erforderlichen Bibliotheken korrekt installiert sind. Wenn nicht, benutzen Sie + pip3 + erneut, um sie zu installieren.

Jetzt können Sie versuchen, etwas programmgesteuert zu twittern. Geben Sie denselben Befehl auf dem Terminal mit dem Flag "+ -i +" ein, um den Python-Interpreter nach der Ausführung Ihres Skripts zu öffnen:

python3 -i bot.py

Geben Sie als Nächstes Folgendes ein, um einen Tweet über Ihr Konto zu senden:

t.statuses.update(status="Just setting up my Twttr bot")

Öffnen Sie jetzt Ihre Twitter-Timeline in einem Browser. Oben in Ihrer Timeline wird ein Tweet mit den von Ihnen geposteten Inhalten angezeigt.

Schließen Sie den Interpreter, indem Sie "+ quit () " oder " CTRL + D +" eingeben.

Ihr Bot verfügt nun über die grundlegende Fähigkeit zum Twittern. Um Ihren Bot so zu entwickeln, dass er nützliche Inhalte twittert, werden Sie im nächsten Schritt Web-Scraping einbinden.

Schritt 3 - Scraping Websites für Ihre Tweet-Inhalte

Um Ihre Timeline mit etwas interessanterem Inhalt zu versehen, entfernen Sie den Inhalt von https://thenewstack.io [dem neuen Stapel] und https://blog.coursera.org [Coursera Blog] und senden ihn an Twitter in Form von Tweets. Um die entsprechenden Daten von Ihren Zielwebsites zu entfernen, müssen Sie im Allgemeinen mit deren HTML-Struktur experimentieren. Jeder Tweet, der von dem Bot stammt, den Sie in diesem Tutorial erstellen, enthält einen Link zu einem Blog-Post von den ausgewählten Websites sowie ein zufälliges Zitat aus diesem Blog. Sie implementieren dieses Verfahren in einer Funktion, die speziell für das Scrapen von Inhalten aus Coursera vorgesehen ist, und nennen es daher "+ scrape_coursera () +".

Öffne zuerst + bot.py +:

nano bot.py

Fügen Sie die Funktion + scrape_coursera () + am Ende Ihrer Datei hinzu:

bird / bot.py

...
t = Twitter(auth=oauth)

Um Informationen aus dem Blog zu entfernen, fordern Sie zunächst die entsprechende Webseite von den Servern von Coursera an. Dazu verwenden Sie die Funktion + get () + aus der Bibliothek + orders +. + get () + nimmt eine URL auf und ruft die entsprechende Webseite auf. Sie übergeben also "+ blog.coursera.org " als Argument an " get () ". Sie müssen jedoch auch einen Header in Ihrer GET-Anfrage angeben, um sicherzustellen, dass die Server von Coursera Sie als echten Kunden erkennen. Fügen Sie der Funktion " scrape_coursera () +" die folgenden hervorgehobenen Zeilen hinzu, um eine Kopfzeile bereitzustellen:

bird / bot.py

def scrape_coursera():

Dieser Header enthält Informationen zu einem definierten Webbrowser, der auf einem bestimmten Betriebssystem ausgeführt wird. Solange diese Informationen (normalerweise als "+ User-Agent +" bezeichnet) echten Webbrowsern und Betriebssystemen entsprechen, spielt es keine Rolle, ob die Header-Informationen mit dem tatsächlichen Webbrowser und Betriebssystem auf Ihrem Computer übereinstimmen. Daher funktioniert dieser Header für alle Systeme einwandfrei.

Nachdem Sie die Überschriften definiert haben, fügen Sie die folgenden hervorgehobenen Zeilen hinzu, um eine GET-Anforderung an Coursera zu senden, indem Sie die URL der Blog-Webseite angeben:

bird / bot.py

...
def scrape_coursera():
   HEADERS = {
       'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5)'
                     ' AppleWebKit/537.36 (KHTML, like Gecko) Cafari/537.36'
       }

Dadurch wird die Webseite auf Ihren Computer abgerufen und die Informationen von der gesamten Webseite in der Variablen "+ r " gespeichert. Sie können den HTML-Quellcode der Webseite mit dem Attribut " content " von " r " bewerten. Daher entspricht der Wert von " r.content +" dem Wert, der angezeigt wird, wenn Sie die Webseite in Ihrem Browser überprüfen, indem Sie mit der rechten Maustaste auf die Seite klicken und die Option "Element überprüfen" auswählen.

Hier haben Sie auch die Funktion "+ fromstring " hinzugefügt. Sie können den Quellcode der Webseite an die Funktion " fromstring " übergeben, die aus der Bibliothek " lxml " importiert wurde, um die Struktur " tree " der Webseite zu erstellen. Mit dieser _Baumstruktur_ können Sie bequem auf verschiedene Teile der Webseite zugreifen. HTML-Quellcode hat eine bestimmte baumartige Struktur. Jedes Element ist im Tag ` <html> +` eingeschlossen und danach verschachtelt.

Öffnen Sie nun "+ https: // blog.coursera.org +" in einem Browser und überprüfen Sie die HTML-Quelle mit den Entwicklertools des Browsers. Klicken Sie mit der rechten Maustaste auf die Seite und wählen Sie die Option * Inspect Element *. Am unteren Rand des Browsers wird ein Fenster mit einem Teil des HTML-Quellcodes der Seite angezeigt.

Klicken Sie anschließend mit der rechten Maustaste auf die Miniaturansicht eines sichtbaren Blogposts und sehen Sie sich diesen an. Die HTML-Quelle hebt die relevanten HTML-Zeilen hervor, in denen diese Blog-Miniaturansicht definiert ist. Sie werden feststellen, dass alle Blog-Posts auf dieser Seite in einem "+ <div> " -Tag mit einer _Klasse_ von "" Recent "+" definiert sind:

Aus diesem Grund verwenden Sie in Ihrem Code alle diese Elemente des Blog-Posts "+ div +" über die XPath. Dies ist eine bequeme Methode, um Elemente von a zu adressieren Website.

Erweitern Sie dazu Ihre Funktion in + bot.py + wie folgt:

bird / bot.py

...
def scrape_coursera():
   HEADERS = {
       'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5)'
                     ' AppleWebKit/537.36 (KHTML, like Gecko) Cafari/537.36'
                   }
   r = requests.get('https://blog.coursera.org', headers=HEADERS)
   tree = fromstring(r.content)

Hier teilt der XPath (die Zeichenfolge, die an "+ tree.xpath () " übergeben wird) mit, dass Sie " div " - Elemente aus der gesamten Webseitenquelle von "_class_" + "recent" + "möchten. Das ` // ` entspricht dem Durchsuchen der gesamten Webseite, ` div ` weist die Funktion an, nur die ` div ` - Elemente zu extrahieren, und ` [@ class =" recent "] ` fordert sie auf, nur diese zu extrahieren ` div ` Elemente, die die Werte ihres Attributs ` class ` als `" recent "+` haben.

Sie benötigen diese Elemente jedoch nicht selbst, sondern nur die Links, auf die sie verweisen, damit Sie auf die einzelnen Blog-Posts zugreifen können, um deren Inhalt zu durchsuchen. Aus diesem Grund extrahieren Sie alle Links mit den Werten der Anker-Tags "+ href ", die sich in den vorherigen Tags " div +" der Blog-Beiträge befinden.

Um Ihr bisheriges Programm zu testen, rufen Sie die Funktion "+ scrape_coursera () " am Ende von " bot.py +" auf.

Speichern und beenden Sie + bot.py +.

Führen Sie nun "+ bot.py +" mit folgendem Befehl aus:

python3 bot.py

In Ihrer Ausgabe wird eine list mit folgenden URLs angezeigt:

Output['https://blog.coursera.org/career-stories-from-inside-coursera/', 'https://blog.coursera.org/unlock-the-power-of-data-with-python-university-of-michigan-offers-new-programming-specializations-on-coursera/', ...]

Nachdem Sie die Ausgabe überprüft haben, können Sie die letzten beiden hervorgehobenen Zeilen aus dem Skript + bot.py + entfernen:

bird / bot.py

...
def scrape_coursera():
   ...
   tree = fromstring(r.content)
   links = tree.xpath('//div[@class="recent"]//div[@class="title"]/a/@href')

Erweitern Sie nun die Funktion in + bot.py + mit der folgenden hervorgehobenen Zeile, um den Inhalt eines Blogposts zu extrahieren:

bird / bot.py

...
def scrape_coursera():
   ...
   links = tree.xpath('//div[@class="recent"]//div[@class="title"]/a/@href')

Sie iterieren über jeden Link, rufen den entsprechenden Blog-Beitrag ab, extrahieren einen zufälligen Satz aus dem Beitrag und twittern diesen Satz zusammen mit der entsprechenden URL als Zitat. Das Extrahieren eines zufälligen Satzes besteht aus drei Teilen:

  1. Alle Absätze im Blogbeitrag als Liste erfassen.

  2. Zufälliges Auswählen eines Absatzes aus der Liste der Absätze.

  3. Auswahl eines zufälligen Satzes aus diesem Absatz.

Sie führen diese Schritte für jeden Blog-Beitrag aus. Um eine abzurufen, stellen Sie eine GET-Anfrage für den Link.

Nachdem Sie nun Zugriff auf den Inhalt eines Blogs haben, führen Sie den Code ein, der diese drei Schritte ausführt, um den gewünschten Inhalt daraus zu extrahieren. Fügen Sie Ihrer Scraping-Funktion, die die drei Schritte ausführt, die folgende Erweiterung hinzu:

bird / bot.py

...
def scrape_coursera():
   ...
   for link in links:
       r = requests.get(link, headers=HEADERS)
       blog_tree = fromstring(r.content)

Wenn Sie den Blog-Beitrag durch Öffnen des ersten Links überprüfen, werden Sie feststellen, dass alle Absätze zum Tag "+ div " gehören, dessen Klasse " entry-content " ist. Daher extrahieren Sie alle Absätze als Liste mit ` paras = blog_tree.xpath ('// div [@ class =" entry-content "] / p') +`.

Die Listenelemente sind keine wörtlichen Absätze. Sie sind "+ Element " _Objekte_. Um den Text aus diesen _Objekten_ zu extrahieren, verwenden Sie die Methode ` text_content () `. Diese Zeile folgt Pythons https://www.digitalocean.com/community/tutorials/understanding-list-comprehensions-in-python-3[_list understand_] Entwurfsmuster, das eine Sammlung mit einer Schleife definiert, die normalerweise in a geschrieben ist einzelne Zeile. In ` bot.py ` extrahieren Sie den Text für jedes Absatzelement _object_ und speichern ihn in einer _list_, wenn der Text nicht leer ist. Um einen Absatz zufällig aus dieser Liste von Absätzen auszuwählen, verwenden Sie das Modul ` random +`.

Schließlich müssen Sie noch einen zufälligen Satz aus diesem Absatz auswählen, der in der Variablen "+ para " gespeichert ist. Für diese Aufgabe zerlegen Sie den Absatz zunächst in Sätze. Ein Ansatz, um dies zu erreichen, ist die Verwendung der Python-Methode ` split () `. Dies kann jedoch schwierig sein, da ein Satz an mehreren Haltepunkten geteilt werden kann. Um Ihre Aufteilungsaufgaben zu vereinfachen, können Sie daher die Verarbeitung natürlicher Sprachen über die Bibliothek ` nltk ` nutzen. Das zuvor in diesem Tutorial definierte " tokenizer +" - Objekt ist für diesen Zweck hilfreich.

Nachdem Sie nun eine Liste von Sätzen haben, rufen Sie "+ random.choice () " auf, um einen zufälligen Satz zu extrahieren. Sie möchten, dass dieser Satz ein Zitat für einen Tweet ist. Er darf also nicht länger als 280 Zeichen sein. Aus ästhetischen Gründen wählen Sie jedoch einen Satz aus, der weder zu groß noch zu klein ist. Sie legen fest, dass Ihr Tweet-Satz eine Länge zwischen 60 und 210 Zeichen haben soll. Der Satz ` random.choice () +` picks erfüllt dieses Kriterium möglicherweise nicht. Um den richtigen Satz zu identifizieren, unternimmt Ihr Skript zehn Versuche und überprüft jedes Mal das Kriterium. Sobald der zufällig aufgenommene Satz Ihr Kriterium erfüllt, können Sie aus der Schleife ausbrechen.

Obwohl die Wahrscheinlichkeit ziemlich gering ist, ist es möglich, dass keiner der Sätze innerhalb von zehn Versuchen diese Größenbedingung erfüllt. In diesem Fall ignorieren Sie den entsprechenden Blog-Beitrag und fahren mit dem nächsten fort.

Nun, da Sie einen Satz zu zitieren haben, können Sie ihn mit dem entsprechenden Link twittern. Sie können dies tun, indem Sie eine Zeichenfolge ausgeben, die den zufällig ausgewählten Satz sowie den entsprechenden Blog-Link enthält. Der Code, der diese "+ scrape_coursera () +" - Funktion aufruft, sendet den erhaltenen String über die Twitter-API an Twitter.

Erweitern Sie Ihre Funktion wie folgt:

bird / bot.py

...
def scrape_coursera():
   ...
   for link in links:
       ...
       para_tokenized = tokenizer.tokenize(para)
       for _ in range(10):
           text = random.choice(para)
           if text and 60 < len(text) < 210:
               break

Das Skript führt die Anweisung "+ else " nur dann aus, wenn die vorhergehende " for " - Schleife nicht unterbrochen wird. Daher passiert es nur, wenn die Schleife keinen Satz finden kann, der Ihrer Größenbedingung entspricht. In diesem Fall geben Sie einfach " None " zurück, sodass der Code, der diese Funktion aufruft, feststellen kann, dass es nichts zu twittern gibt. Anschließend wird die Funktion erneut aufgerufen und der Inhalt für den nächsten Blog-Link abgerufen. Wenn die Schleife jedoch unterbrochen wird, bedeutet dies, dass die Funktion einen geeigneten Satz gefunden hat. Das Skript führt die Anweisung " else +" nicht aus, und die Funktion liefert eine Zeichenfolge, die aus dem Satz und dem Blog-Link besteht und durch ein einzelnes Leerzeichen getrennt ist.

Die Implementierung der Funktion + scrape_coursera () + ist fast abgeschlossen. Wenn Sie eine ähnliche Funktion zum Scratchen einer anderen Website ausführen möchten, müssen Sie einen Teil des Codes wiederholen, den Sie zum Scratchen von Courseras Blog geschrieben haben. Um zu vermeiden, dass Teile des Codes neu geschrieben und dupliziert werden, und um sicherzustellen, dass das Skript Ihres Bots dem DRY -Prinzip (Don’t Repeat Yourself) folgt, identifizieren und abstrahieren Sie Teile des Codes aus, den Sie für jede später geschriebene Scraper-Funktion immer wieder verwenden werden.

Unabhängig davon, auf welcher Website die Funktion ausgeführt wird, müssen Sie einen Absatz zufällig auswählen und dann einen zufälligen Satz aus diesem ausgewählten Absatz auswählen. Sie können diese Funktionen in separaten Funktionen extrahieren. Dann können Sie diese Funktionen einfach aus Ihren Abstreiferfunktionen aufrufen und das gewünschte Ergebnis erzielen. Sie können + HEADERS + auch außerhalb der Funktion + scrape_coursera () + definieren, damit alle Scraper-Funktionen sie verwenden können. Daher sollte im folgenden Code die "+ HEADERS +" - Definition der Schaberfunktion vorausgehen, damit Sie sie eventuell für andere Schaber verwenden können:

bird / bot.py

...






def scrape_coursera():
   r = requests.get('https://blog.coursera.org', headers=HEADERS)
   ...

Jetzt können Sie die Funktion + extract_paratext () + definieren, um einen zufälligen Absatz aus einer Liste von Absatzobjekten zu extrahieren. Der zufällige Absatz wird als "+ paras +" - Argument an die Funktion übergeben und gibt die mit einem Token versehene Form des ausgewählten Absatzes zurück, die Sie später zum Extrahieren von Sätzen verwenden werden:

bird / bot.py

...
HEADERS = {
       'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5)'
                     ' AppleWebKit/537.36 (KHTML, like Gecko) Cafari/537.36'
       }










def scrape_coursera():
   r = requests.get('https://blog.coursera.org', headers=HEADERS)
   ...

Als nächstes definieren Sie eine Funktion, die einen zufälligen Satz geeigneter Länge (zwischen 60 und 210 Zeichen) aus dem als Argument erhaltenen tokenisierten Absatz extrahiert, den Sie als "+ para " bezeichnen können. Wird ein solcher Satz nach zehn Versuchen nicht entdeckt, gibt die Funktion stattdessen ` None ` zurück. Fügen Sie den folgenden hervorgehobenen Code hinzu, um die Funktion ` extract_text () +` zu definieren:

bird / bot.py

...

def extract_paratext(paras):
   ...
   return tokenizer.tokenize(para)














def scrape_coursera():
   r = requests.get('https://blog.coursera.org', headers=HEADERS)
   ...

Nachdem Sie diese neuen Hilfsfunktionen definiert haben, können Sie die Funktion + scrape_coursera () + wie folgt neu definieren:

bird / bot.py

...
def extract_paratext():
   for _ in range(10):<^>
       text = random.choice(para)
   ...


def scrape_coursera():



   r = requests.get(url, headers=HEADERS)
   tree = fromstring(r.content)
   links = tree.xpath('//div[@class="recent"]//div[@class="title"]/a/@href')

   for link in links:
       r = requests.get(link, headers=HEADERS)
       blog_tree = fromstring(r.content)
       paras = blog_tree.xpath('//div[@class="entry-content"]/p')





       yield '"%s" %s' % (text, link)

Speichern und beenden Sie + bot.py +.

Hier verwenden Sie "+ yield " anstelle von " return ", da die Scraper-Funktion beim Durchlaufen der Links die Tweet-Zeichenfolgen nacheinander ausgibt. Das bedeutet, wenn Sie den Scraper ` sc `, definiert als ` sc = scrape_coursera () `, zum ersten Mal aufrufen, erhalten Sie den Tweet-String, der dem ersten Link in der Liste der Links entspricht, die Sie mit der Scraper-Funktion berechnet haben . Wenn Sie den folgenden Code im Interpreter ausführen, erhalten Sie " string_1 " und " string_2 " (siehe unten), wenn die Variable " links " in " scrape_coursera () " eine Liste enthält, die wie "" aussieht ["https://thenewstack.io/cloud-native-live-twistlocks-virtual-conference/", "https://blog.coursera.org/unlock-the-power-of-data-with-python-university" -of-michigan-bietet-neue-programmierspezialisierungen-auf-coursera / ", …​] +` an.

python3 -i bot.py

Instanziiere den Scraper und nenne ihn "+ sc +":

>>> sc = scrape_coursera()

Es ist jetzt ein Generator; Es generiert oder kratzt relevante Inhalte von Coursera nacheinander. Sie können nacheinander auf den gestrichenen Inhalt zugreifen, indem Sie nacheinander + next () + über + sc + aufrufen:

>>> string_1 = next(sc)
>>> string_2 = next(sc)

Jetzt können Sie die von Ihnen definierten Zeichenfolgen "+ drucken +", um den gestrichenen Inhalt anzuzeigen:

>>> print(string_1)
"Other speakers include Priyanka Sharma, director of cloud native alliances at GitLab and Dan Kohn, executive director of the Cloud Native Computing Foundation." https://thenewstack.io/cloud-native-live-twistlocks-virtual-conference/
>>>
>>> print(string_2)
"You can learn how to use the power of Python for data analysis with a series of courses covering fundamental theory and project-based learning." https://blog.coursera.org/unlock-the-power-of-data-with-python-university-of-michigan-offers-new-programming-specializations-on-coursera/
>>>

Wenn Sie stattdessen "+ return " verwenden, können Sie die Zeichenfolgen nicht einzeln und nacheinander abrufen. Wenn Sie einfach das ` yield ` durch ` return ` in ` scrape_coursera () ` ersetzen, erhalten Sie immer den String, der dem ersten Blog-Beitrag entspricht, anstatt den ersten beim ersten Aufruf, den zweiten beim zweiten anruf und so weiter. Sie können die Funktion so ändern, dass einfach eine _Liste_ aller Zeichenfolgen zurückgegeben wird, die allen Verknüpfungen entsprechen. Dies ist jedoch speicherintensiver. Außerdem kann diese Art von Programm möglicherweise innerhalb kurzer Zeit viele Anfragen an die Server von Coursera richten, wenn Sie die gesamte _Liste_ schnell abrufen möchten. Dies könnte dazu führen, dass Ihr Bot vorübergehend vom Zugriff auf eine Website ausgeschlossen wird. Daher eignet sich " Ertrag +" am besten für eine Vielzahl von Schabeaufträgen, bei denen Sie nur Informationen benötigen, die einzeln geschabt werden.

Schritt 4 - Zusätzliche Inhalte kratzen

In diesem Schritt erstellen Sie einen Scraper für https://thenewstack.io [thenewstack.io]. Der Vorgang ähnelt dem, den Sie im vorherigen Schritt ausgeführt haben. Dies ist also eine kurze Übersicht.

Öffnen Sie die Website in Ihrem Browser und überprüfen Sie die Seitenquelle. Sie werden hier feststellen, dass alle Blog-Abschnitte "+ div " Elemente der Klasse " normalstory-box +" sind.

image: https: //assets.digitalocean.com/articles/TwitterPython/step4a.png [HTML-Quelleninspektion der New Stack-Website]

Jetzt erstellen Sie eine neue Scraper-Funktion mit dem Namen "+ scrape_thenewstack () +" und stellen eine GET-Anfrage an "https://thenewstack.io [thenewstack.io]". Extrahieren Sie als Nächstes die Links zu den Blogs aus diesen Elementen und durchlaufen Sie die einzelnen Links. Fügen Sie den folgenden Code hinzu, um dies zu erreichen:

bird / bot.py

...
def scrape_coursera():
   ...
   yield '"%s" %s' % (text, link)

Sie verwenden das Flag "+ verify = False ", da auf Websites manchmal Sicherheitszertifikate abgelaufen sind und der Zugriff darauf in Ordnung ist, wenn keine vertraulichen Daten betroffen sind, wie hier. Das Flag " verify = False" weist die Methode "+ request.get" an, die Zertifikate nicht zu überprüfen und den Datenabruf wie gewohnt fortzusetzen. Andernfalls gibt die Methode einen Fehler bezüglich abgelaufener Sicherheitszertifikate aus.

Sie können jetzt die Absätze des Blogs extrahieren, die den einzelnen Links entsprechen, und die Funktion + extract_paratext () + verwenden, die Sie im vorherigen Schritt erstellt haben, um einen zufälligen Absatz aus der Liste der verfügbaren Absätze zu entfernen. Zum Schluss extrahieren Sie einen zufälligen Satz aus diesem Absatz mit der Funktion + extract_text () + und dann + yield + mit dem entsprechenden Blog-Link. Fügen Sie Ihrer Datei den folgenden hervorgehobenen Code hinzu, um diese Aufgaben auszuführen:

bird / bot.py

...
def scrape_thenewstack():
   ...
   links = tree.xpath('//div[@class="normalstory-box"]/header/h2/a/@href')

   for link in links:

Sie haben jetzt eine Vorstellung davon, was ein Schabevorgang im Allgemeinen umfasst. Sie können jetzt Ihre eigenen, benutzerdefinierten Schaber erstellen, mit denen Sie beispielsweise die Bilder in Blog-Posts anstatt in zufälligen Anführungszeichen schaben können. Dafür können Sie nach den relevanten + <img> + Tags suchen. Sobald Sie den richtigen Pfad für Tags festgelegt haben, die als Bezeichner dienen, können Sie auf die Informationen in Tags zugreifen, indem Sie die Namen der entsprechenden Attribute verwenden. Zum Beispiel können Sie beim Scrappen von Bildern auf die Verknüpfungen von Bildern zugreifen, indem Sie deren Attribute + src + verwenden.

Zu diesem Zeitpunkt haben Sie zwei Scraper-Funktionen zum Scrappen von Inhalten von zwei verschiedenen Websites und zwei Hilfsfunktionen zum Wiederverwenden von Funktionen erstellt, die für beide Scraper gleich sind. Jetzt, da Ihr Bot weiß, wie man twittert und was man twittert, schreiben Sie den Code, um den gestrichenen Inhalt zu twittern.

Schritt 5 - Tweeten des geschabten Inhalts

In diesem Schritt erweitern Sie den Bot, um Inhalte von den beiden Websites zu entfernen und über Ihr Twitter-Konto zu twittern. Genauer gesagt, Sie möchten, dass der Inhalt der beiden Websites abwechselnd und in regelmäßigen Abständen von zehn Minuten auf unbestimmte Zeit getwittert wird. Daher verwenden Sie infinite while loop, um die gewünschte Funktionalität zu implementieren. Sie tun dies im Rahmen einer "+ main () +" - Funktion, die den übergeordneten Kernprozess implementiert, dem Ihr Bot folgen soll:

bird / bot.py

...
def scrape_thenewstack():
   ...
   yield '"%s" %s' % (text, link)

Sie erstellen zunächst eine Liste der Namen der zuvor definierten Scraping-Funktionen und nennen sie "+ news_funcs ". Dann erstellen Sie eine leere Liste, die die eigentlichen Schaberfunktionen enthält, und benennen diese Liste als " news_iterators ". Sie füllen es dann aus, indem Sie jeden Namen in der Liste " news_funcs " durchgehen und den entsprechenden Iterator in der Liste " news_iterators " anhängen. Sie verwenden die in Python integrierte Funktion " globals () ". Dies gibt ein Wörterbuch zurück, das Variablennamen den tatsächlichen Variablen in Ihrem Skript zuordnet. Ein Iterator wird angezeigt, wenn Sie eine Scraper-Funktion aufrufen: Wenn Sie beispielsweise " coursera_iterator = scrape_coursera () " schreiben, ist " coursera_iterator " ein Iterator, für den Sie " next () " aufrufen können Anrufe. Jeder Aufruf von ` next () ` gibt einen String zurück, der ein Zitat und den dazugehörigen Link enthält, genau wie in der Anweisung ` yield ` der Funktion ` scrape_coursera () ` definiert. Jeder Aufruf von ` next () ` durchläuft eine Iteration der ` for`-Schleife in der Funktion` + scrape coursera () + `. Daher können Sie nur so viele "+ next () " - Aufrufe tätigen, wie Blog-Links in der Funktion " scrape_coursera () " vorhanden sind. Sobald diese Anzahl überschritten wird, wird eine " StopIteration +" - Ausnahme ausgelöst.

Sobald beide Iteratoren die Liste "+ news_iterators " gefüllt haben, startet die Hauptschleife " while ". Darin befindet sich eine " für " - Schleife, die jeden Iterator durchläuft und versucht, den zu twitternden Inhalt abzurufen. Nachdem Sie den Inhalt erhalten haben, twittert Ihr Bot ihn und ruht sich dann für zehn Minuten aus. Wenn der Iterator keinen weiteren Inhalt zu bieten hat, wird eine " StopIteration +" - Ausnahme ausgelöst, bei der Sie den Iterator durch erneute Instanziierung aktualisieren, um zu überprüfen, ob neuere Inhalte auf der Quell-Website verfügbar sind. Anschließend fahren Sie mit dem nächsten Iterator fort, falls verfügbar. Andernfalls, wenn die Ausführung das Ende der Iteratorenliste erreicht, starten Sie von Anfang an neu und twittern den nächsten verfügbaren Inhalt. Dadurch twittert Ihr Bot so lange, wie Sie möchten, abwechselnd Inhalte von den beiden Scrapern.

Jetzt müssen Sie nur noch die Funktion + main () + aufrufen. Sie tun dies, wenn das Skript vom Python-Interpreter direkt aufgerufen wird:

bird / bot.py

...
def main():
   print('---Bot started---\n')<^>
   news_funcs = ['scrape_coursera', 'scrape_thenewstack']
   ...

Das Folgende ist eine fertige Version des Skripts + bot.py +. Sie können auch das Skript in diesem GitHub-Repository anzeigen.

bird / bot.py

"""Main bot script - bot.py
For the DigitalOcean Tutorial.
"""


import random
import time


from lxml.html import fromstring
import nltk
nltk.download('punkt')
import requests

from twitter import OAuth, Twitter


import credentials

tokenizer = nltk.data.load('tokenizers/punkt/english.pickle')

oauth = OAuth(
       credentials.ACCESS_TOKEN,
       credentials.ACCESS_SECRET,
       credentials.CONSUMER_KEY,
       credentials.CONSUMER_SECRET
   )
t = Twitter(auth=oauth)

HEADERS = {
       'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5)'
                     ' AppleWebKit/537.36 (KHTML, like Gecko) Cafari/537.36'
       }


def extract_paratext(paras):
   """Extracts text from <p> elements and returns a clean, tokenized random
   paragraph."""

   paras = [para.text_content() for para in paras if para.text_content()]
   para = random.choice(paras)
   return tokenizer.tokenize(para)


def extract_text(para):
   """Returns a sufficiently-large random text from a tokenized paragraph,
   if such text exists. Otherwise, returns None."""

   for _ in range(10):
       text = random.choice(para)
       if text and 60 < len(text) < 210:
           return text

   return None


def scrape_coursera():
   """Scrapes content from the Coursera blog."""
   url = 'https://blog.coursera.org'
   r = requests.get(url, headers=HEADERS)
   tree = fromstring(r.content)
   links = tree.xpath('//div[@class="recent"]//div[@class="title"]/a/@href')

   for link in links:
       r = requests.get(link, headers=HEADERS)
       blog_tree = fromstring(r.content)
       paras = blog_tree.xpath('//div[@class="entry-content"]/p')
       para = extract_paratext(paras)
       text = extract_text(para)
       if not text:
           continue

       yield '"%s" %s' % (text, link)


def scrape_thenewstack():
   """Scrapes news from thenewstack.io"""

   r = requests.get('https://thenewstack.io', verify=False)

   tree = fromstring(r.content)
   links = tree.xpath('//div[@class="normalstory-box"]/header/h2/a/@href')

   for link in links:
       r = requests.get(link, verify=False)
       tree = fromstring(r.content)
       paras = tree.xpath('//div[@class="post-content"]/p')
       para = extract_paratext(paras)
       text = extract_text(para)
       if not text:
           continue

       yield '"%s" %s' % (text, link)


def main():
   """Encompasses the main loop of the bot."""
   print('Bot started.')
   news_funcs = ['scrape_coursera', 'scrape_thenewstack']
   news_iterators = []
   for func in news_funcs:
       news_iterators.append(globals()[func]())
   while True:
       for i, iterator in enumerate(news_iterators):
           try:
               tweet = next(iterator)
               t.statuses.update(status=tweet)
               print(tweet, end='\n')
               time.sleep(600)
           except StopIteration:
               news_iterators[i] = globals()[newsfuncs[i]]()


if __name__ == "__main__":
   main()

Speichern und beenden Sie + bot.py +.

Das Folgende ist eine Beispielausführung von "+ bot.py +":

python3 bot.py

Sie erhalten eine Ausgabe mit dem Inhalt, den Ihr Bot geschabt hat, in einem ähnlichen Format wie dem folgenden:

Output[nltk_data] Downloading package punkt to /Users/binaryboy/nltk_data...
[nltk_data]   Package punkt is already up-to-date!
---Bot started---

"Take the first step toward your career goals by building new skills." https://blog.coursera.org/career-stories-from-inside-coursera/

"Other speakers include Priyanka Sharma, director of cloud native alliances at GitLab and Dan Kohn, executive director of the Cloud Native Computing Foundation." https://thenewstack.io/cloud-native-live-twistlocks-virtual-conference/

"You can learn how to use the power of Python for data analysis with a series of courses covering fundamental theory and project-based learning." https://blog.coursera.org/unlock-the-power-of-data-with-python-university-of-michigan-offers-new-programming-specializations-on-coursera/

"“Real-user monitoring is really about trying to understand the underlying reasons, so you know, ‘who do I actually want to fly with?" https://thenewstack.io/how-raygun-co-founder-and-ceo-spun-gold-out-of-monitoring-agony/

Nach einem Probelauf Ihres Bots wird auf Ihrer Twitter-Seite eine vollständige Zeitleiste mit programmgesteuerten Tweets angezeigt, die von Ihrem Bot gepostet wurden. Es wird ungefähr so ​​aussehen:

image: https: //assets.digitalocean.com/articles/TwitterPython/step5a.png [Programmatische Tweets gepostet]

Wie Sie sehen, twittert der Bot die überarbeiteten Blog-Links mit zufälligen Anführungszeichen aus jedem Blog als Highlights. Dieser Feed ist jetzt ein Informations-Feed mit Tweets, die zwischen Blog-Zitaten von Coursera und thenewstack.io wechseln. Sie haben einen Bot erstellt, der Inhalte aus dem Web aggregiert und auf Twitter veröffentlicht. Sie können jetzt den Umfang dieses Bots nach Ihren Wünschen erweitern, indem Sie weitere Abstreifer für verschiedene Websites hinzufügen. Der Bot twittert Inhalte aller Abstreifer in einem Round-Robin-Verfahren und in den von Ihnen gewünschten Zeitintervallen.

Fazit

In diesem Tutorial haben Sie einen einfachen Twitter-Bot mit Python erstellt und einige Inhalte aus dem Web für Ihren Bot zum Twittern gekratzt. Es gibt viele Bot-Ideen, die man ausprobieren kann. Sie können auch Ihre eigenen Ideen für ein Bot-Utility umsetzen. Sie können die vielseitigen Funktionen der Twitter-API kombinieren und etwas Komplexeres erstellen. Eine Version eines anspruchsvolleren Twitter-Bots finden Sie unter chirps, einem Twitter-Bot-Framework, das einige fortgeschrittene Konzepte wie Multithreading verwendet, damit der Bot mehrere Dinge gleichzeitig ausführt. Es gibt auch einige witzige Bots wie misheardly. Der Kreativität beim Erstellen von Twitter-Bots sind keine Grenzen gesetzt. Es ist wichtig, die richtigen API-Endpunkte für die Implementierung Ihres Bots zu finden.

Schließlich ist es wichtig, die Bot-Etikette („Botiquette“) zu beachten, wenn Sie Ihren nächsten Bot erstellen. Wenn Ihr Bot beispielsweise Retweeting beinhaltet, lassen Sie den gesamten Tweetetext einen Filter passieren, um missbräuchliche Sprachen zu erkennen, bevor Sie sie erneut twittern. Sie können solche Funktionen mit regulären Ausdrücken und in natürlicher Sprache implementieren. Befolgen Sie bei der Suche nach Quellen, die Sie durchsuchen können, Ihr Urteilsvermögen und vermeiden Sie solche, die Fehlinformationen verbreiten. Weitere Informationen zu Botiquette finden Sie unter this blog post von Joe Mayo zum Thema.