[PYTHON] Ich habe versucht, das Update von "Hameln" mit "Beautiful Soup" und "IFTTT" zu benachrichtigen.

Einführung

Als ich Benachrichtigungs-App aktualisieren, um ein Romanautor zu werden , mithilfe der API die Aktualisierungsinformationen der Arbeit von Meine Seite Ich dachte, ich wäre nicht süchtig nach dem, was ich tun wollte, also habe ich es mit einer neuartigen Version der Posting-Site namens Hameln geschafft.

Wie geht's?

Es ist eine Anwendung, die LINE Notify über Hameln-Aktualisierungsinformationen mit BeautifulSoup4 und IFTTT benachrichtigt.

Umgebung

Vor der Vorbereitung ... Bestätigung und Vorsicht hinsichtlich des Unterschieds zwischen API und Scraping

Dieses Mal werden wir Scraping verwenden. </ b> Es ist eine Technologie, die gesetzlich geregelt ist. Schauen wir uns also die Geschichte des Gesetzes an. Ich denke, das erste, was zu beachten ist, ist, die Server der Site nicht zu überlasten. Dieses Mal wird time.sleep (1) als Gegenmaßnahme nach dem Abrufen oder Posten verwendet, um eine Wartezeit zu erstellen.

Vorbereitung (Applet mit IFTTT erstellen)

Es ist ein Dienst, der andere Dienste als IFTTT verknüpft. Verbinden Sie diesmal Webhooks und LINE Notify und lassen Sie sie Benachrichtigungen an Ihre LINE senden. Vorgehensweise </ b>

  1. Registrieren Sie sich bei IFTTT
  2. Klicken Sie oben rechts auf dem Bildschirm auf Erstellen. Der Bildschirm wechselt zu dem Bildschirm "if + This Then That". Siehe die Abbildung unten. ifttt_ifttt.PNG
  3. Klicken Sie auf + Dies. Geben Sie Webhooks in die Suchleiste ein, um sie auszuwählen.
  4. Klicken Sie auf die Spalte "Webanforderung empfangen". Wenn Sie zum folgenden Bildschirm gelangen, geben Sie Ihren Lieblingsnamen unter "Ereignisname" ein. Ich werde es später verwenden. ifttt_2.PNG
  5. Klicken Sie auf + That. Wählen Sie LINE und klicken Sie auf das Feld "Nachricht senden".
  6. Melden Sie sich bei LINE an, setzen Sie den Inhalt der Nachricht auf "Wert1: Wert1 \
    " (es spielt keine Rolle, wenn Sie dies nicht tun) und klicken Sie auf "Aktion erstellen". ifttt_3.PNG
  7. Überprüfen Sie den Inhalt und klicken Sie auf Fertig stellen.
  8. Klicken Sie auf Durchsuchen, geben Sie Webhooks in das Suchfenster ein und wählen Sie die Registerkarte Dienste. Klicken Sie auf Webhooks. Vielleicht können Sie von diesem Link gehen ...?
  9. Klicken Sie auf Dokumentation und Sie sollten "Ihr Schlüssel ist: ~~~~~" sehen. Notieren Sie sich dies. Ich werde es später verwenden. Dies ist das Ende von IFTTT.

Beschreibung des Quellcodes

Erklären Sie kurz den Quellcode. import

import requests
from bs4 import BeautifulSoup
from urllib.parse import urljoin
import csv
import time

post_ifttt() Es ist eine Funktion, um eine Benachrichtigung von IFTTT an LINE Notify zu senden. Hier verwenden wir den Applet-Namen und den Webhooks-Schlüssel. Ich habe es auch in der Update-Benachrichtigung verwendet, um Romanautor zu werden.

def post_ifttt(json):
    # json: {value1: " content "}
    url = (
        "https://maker.ifttt.com/trigger/"
        + # Applet Name
        + "/with/key/"
        + # Webhooks Key
    )
    requests.post(url, json)

extract() Dies ist die zugrunde liegende Funktion dieses Codes. Es wird in dem später beschriebenen Teil verwendet. Extrahieren Sie je nach Bedingung einen von ["Titel"], ["Anzahl der Geschichten"] und ["URL"] aus HTML und speichern Sie ihn in der Liste. Es kann etwas schwierig sein, den Zweig zu sehen. Es wäre vielleicht besser gewesen, die if-Bedingungserklärungen parallel zu schreiben. Die Teile "<" und "" sind if-Anweisungen, die HTML-Tags entfernen und nur die gewünschten Attribute extrahieren.

def extract(info, condition, li):
    for item in info:
        if condition in str(item):
            a = ""
            is_a = 0
            if condition!="href":
                for s in str(item):
                    if s=="<" and is_a==1:
                        is_a = 0
                        li.append(a)
                        break
                    if is_a==1:
                        if condition=="neueste":
                            if "0" <= s and s <= "9":
                                a+=s
                        else:
                            a += s
                    if s==">" and is_a==0:
                        is_a = 1
            else:
                if "mode=user" in str(item):
                    continue
                for s in str(item):
                    if s=="\"" and is_a==1:
                        is_a = 0
                        li.append(a)
                        break
                    if is_a==1:
                        a += s
                    if s=="\"" and is_a==0:
                        is_a = 1

Anmelden </ b> Da das Scraping über Hamelns Meine Seite erfolgt, POSTEN Sie die erforderlichen Informationen über den Anmeldebildschirm und melden Sie sich an. Die für den Anmeldevorgang erforderlichen Informationen variieren von Standort zu Standort und können mit den Entwicklertools überprüft werden. In Hameln ist dies jedoch "id, pass, mode". Der Modus ist auch "last_entry_end" für alle. POSTEN Sie diese Informationen und melden Sie sich an. Die detaillierte Verwendung von Beautifu-Suppe ist im folgenden Artikel zusammengefasst. Schauen Sie also bitte vorbei.

##############################################################
#                           Log in                           #
##############################################################
# id, pass
with open("input.txt") as f:
    """
    input.txt: [ID PASS]
    """
    s = f.read().split()
    ID = s[0]
    PASS = s[1]

session = requests.session()

url_login = "https://syosetu.org/?mode=login"
response = session.get(url_login)
time.sleep(1)

login_info = {
    "id":ID,
    "pass":PASS,
    "mode":"login_entry_end"
}

res = session.post(url_login, data=login_info)
res.raise_for_status() # for error
time.sleep(1)

Input.txt ist übrigens eine Eingabedatei, in der die ID und das Passwort in dieser Reihenfolge mit einem halben Leerzeichen gespeichert werden. Beispiel)

input.txt


ID_hoge passwd_hoge 

Ausgabe des Benutzernamens </ b> Der Benutzername wird aus dem HTML-Code der Benutzerinformationsseite extrahiert. Einfach.

###############################################################
#                        Print User Name                      #
###############################################################

soup_myage = BeautifulSoup(res.text, "html.parser")

account_href = soup_myage.select_one(".spotlight li a").attrs["href"]
url_account = urljoin(url_login, account_href)

res_account = session.get(url_account)
res_account.raise_for_status()
time.sleep(1)

soup_account = BeautifulSoup(res_account.text, "html.parser")
user_name = str((soup_account.select(".section3 h3"))[0])[4:-5].split("/")[0]

print("Hello "+ user_name + "!")

Informationen zu Ihren Lieblingsromanen finden Sie auf jeder Lieblingsseite </ b> Es gibt mehrere Lieblingsseiten. Speichern Sie daher auf jeder Seite ["Titel"], ["Anzahl der Storys"] und ["URL"] im Listentitel, latest_no bzw. ncode. Suchen Sie später nach Updates und speichern Sie sie in einer Datei.

###############################################################
#                        Page Transition                      #
###############################################################
a_list = soup_myage.select(".section.pickup a")
favo_a = ""
for _ in a_list:
    if("Zur Favoritenliste" in _):
        favo_a = _
        break

url_favo = urljoin(url_login, favo_a.attrs["href"])

res_favo = session.get(url_favo)
res_favo.raise_for_status()
time.sleep(1)

soup_favo = BeautifulSoup(res_favo.text, "html.parser")
bookmark_titles = soup_favo.select(".section3 h3 a")
bookmark_latest = soup_favo.select(".section3 p a")
titles = []
latest_no = []
ncode = []

extract(bookmark_titles, "novel", titles)
extract(bookmark_latest, "neueste", latest_no)
extract(bookmark_titles, "href", ncode)
###############################################################
#                     Start Page Transition                   #
###############################################################
number_of_bookmarks_h2 = soup_favo.select_one(".heading h2")
number_of_bookmarks = ""
for s in str(number_of_bookmarks_h2)[4:-5]:
    if s>="0" and s<='9':
        number_of_bookmarks += s
number_of_bookmarks = int(number_of_bookmarks)
number_of_favo_pages = number_of_bookmarks // 10 + 1

for i in range(2,number_of_favo_pages+1):
    url_favo = "https://syosetu.org/?mode=favo&word=&gensaku=&type=&page=" + str(i)
    res_favo = session.get(url_favo)
    res_favo.raise_for_status()
    soup_favo = BeautifulSoup(res_favo.text, "html.parser")
    bookmark_titles = soup_favo.select(".section3 h3 a")
    bookmark_latest = soup_favo.select(".section3 p a")
    extract(bookmark_titles, "novel", titles)
    extract(bookmark_latest, "neueste", latest_no)
    extract(bookmark_titles, "href", ncode)
    time.sleep(1)

Datenerfassung </ b> Speichern Sie die neu erfassten Informationen in bookmark_info und die zuvor erfassten Informationen in Daten. Überprüfen Sie dann, ob es aktualisiert wurde.

###############################################################
#                        Get Latest Data                      #
###############################################################
bookmark_info = []
for i in range(len(titles)):
    bookmark_info.append([titles[i], latest_no[i], ncode[i]])

###############################################################
#                       Get Previous Data                     #
###############################################################
read_file = "hameln.csv"
with open(read_file, encoding="utf-8") as f:
    reader = csv.reader(f)
    data = [row for row in reader]

###############################################################
#              Check Whether Novels are Updated               #
###############################################################
"""
previous data: data
latest data: bookmark_info
"""
for prev in data:
    for latest in bookmark_info:
        if prev[0] == latest[0]:
            # check
            if prev[1] != latest[1]:
                print(str(latest[0]) + "Wurde aktualisiert.\n" + latest[2])
                json = {"value1" : str(latest[0]) +"Wurde aktualisiert.\n" + latest[2]}
                post_ifttt(json)

Schreiben Sie Aktualisierungsinformationen in die Datei </ b>

###############################################################
#                    Write Latest Information                 #
###############################################################
output = "hameln.csv"
with open(output, mode='w', newline="", encoding="utf-8") as f:
    writer = csv.writer(f)
    for i in range(len(bookmark_info)):
        writer.writerow([bookmark_info[i][0], bookmark_info[i][1], bookmark_info[i][2]])

GitHub Auf GitHub hochgeladen ( hier ). Bitte schauen Sie, wenn Sie möchten.

Am Ende

Der Anmeldevorgang war der interessanteste Teil des Wissens, das mit dieser App gewonnen wurde. Sie geben nicht nur Ihre ID und Ihr Passwort weiter. Die Automatisierung wurde auch mit dem Taskplaner durchgeführt. Einzelheiten zur Verwendung des Taskplaners finden Sie im Referenzabschnitt.

Verweise

Recommended Posts