[PYTHON] J'ai essayé de notifier la mise à jour de "Hameln" en utilisant "Beautiful Soup" et "IFTTT"

introduction

Lorsque j'ai créé l'application de notification de mise à jour pour devenir romancier à l'aide de l'API, mettez à jour les informations du travail à partir de Ma page Je pensais que je ne serais pas accro à ce que je voulais faire, alors je l'ai fait avec une nouvelle version du site de publication appelée Hameln.

Que faire?

C'est une application qui notifie LINE Notify des informations de mise à jour de Hameln en utilisant BeautifulSoup4 et IFTTT.

environnement

Avant la préparation ... Confirmation et mise en garde concernant la différence entre API et scraping

Cette fois, nous utiliserons le grattage. </ b> C'est une technologie qui est réglementée par la loi, alors vérifions l'histoire de la loi. Je pense que la première chose à noter est de ne pas surcharger les serveurs du site. Cette fois, comme contre-mesure, après avoir reçu ou affiché, time.sleep (1) est utilisé pour créer un temps d'attente.

Préparation (Créer une applet avec IFTTT )

C'est un service qui relie des services différents de IFTTT. Cette fois, connectez les Webhooks et LINE Notify et demandez-leur d'envoyer des notifications à votre LINE. Procédure </ b>

  1. Inscrivez-vous à IFTTT
  2. Cliquez sur Créer en haut à droite de l'écran. L'écran passera à l'écran qui dit "si + ceci alors cela". Voir la figure ci-dessous. ifttt_ifttt.PNG
  3. Cliquez sur + Ceci. Tapez Webhooks dans la barre de recherche pour les sélectionner.
  4. Cliquez sur la colonne «Recevoir une demande Web». Lorsque vous arrivez à l'écran ci-dessous, entrez votre nom préféré dans "Nom de l'événement". Je l'utiliserai plus tard. ifttt_2.PNG
  5. Cliquez sur + Cela. Sélectionnez LINE et cliquez sur le champ "Envoyer un message".
  6. Connectez-vous à LINE, définissez le contenu du message sur "Value1: Value1 \
    " (peu importe si vous ne le faites pas) et cliquez sur "Create Action". ifttt_3.PNG
  7. Vérifiez le contenu et cliquez sur Terminer.
  8. Cliquez sur Explorer, saisissez Webhooks dans la fenêtre de recherche et sélectionnez l'onglet Services. Cliquez sur Webhooks. Peut-être pouvez-vous aller à partir de ce lien ...?
  9. Cliquez sur Documentation et vous devriez voir "Votre clé est: ~~~~~", alors prenez-en note. Je l'utiliserai plus tard. C'est la fin de IFTTT.

Description du code source

Expliquez brièvement le code source. import

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

post_ifttt() C'est une fonction pour envoyer une notification d'IFTTT à LINE Notify. Ici, nous utilisons le nom de l'applet et la clé Webhooks. Je l'ai également utilisé dans la notification de mise à jour pour devenir romancier.

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

extract() C'est la fonction sous-jacente de ce code. Il sera utilisé dans la partie décrite plus loin. Extrayez l'un des ["Titre"], ["Nombre d'histoires"] et ["URL"] du HTML en fonction de la condition et enregistrez-le dans la liste. Il peut être un peu difficile de voir la branche. Il aurait peut-être été préférable d'écrire les instructions de condition if en parallèle. Les parties «<» et «\» sont des instructions if qui suppriment les balises HTML et n'extraient que les attributs souhaités.

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=="dernier":
                            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

Connexion </ b> Puisque le scraping se fait à partir de Ma page de Hameln, POSTEZ les informations nécessaires depuis l'écran de connexion et connectez-vous. Les informations requises pour le processus de connexion varient d'un site à l'autre et peuvent être vérifiées à partir des outils de développement, mais dans Hameln, c'est "id, pass, mode". Le mode est également "last_entry_end" pour tout le monde. POSTEZ ces informations et connectez-vous. L'utilisation détaillée de la soupe Beautifu est résumée dans l'article ci-dessous, alors jetez un œil.

##############################################################
#                           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)

À propos, input.txt est un fichier d'entrée dans lequel l'ID et le mot de passe sont enregistrés dans cet ordre avec un espace demi-largeur. Exemple)

input.txt


ID_hoge passwd_hoge 

Sortie du nom d'utilisateur </ b> La partie du nom d'utilisateur est extraite du HTML de la page d'informations utilisateur. Facile.

###############################################################
#                        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 + "!")

Obtenez des informations sur vos romans préférés à partir de chaque page préférée </ b> Il existe plusieurs pages favorites. Ainsi, à partir de chaque page, stockez respectivement ["Title"], ["Number of stories"] et ["URL"] dans le titre de la liste, latest_no et ncode. Recherchez les mises à jour ultérieurement et enregistrez-les dans un fichier.

###############################################################
#                        Page Transition                      #
###############################################################
a_list = soup_myage.select(".section.pickup a")
favo_a = ""
for _ in a_list:
    if("Vers la liste des favoris" 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, "dernier", 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, "dernier", latest_no)
    extract(bookmark_titles, "href", ncode)
    time.sleep(1)

Acquisition de données </ b> Stockez les informations nouvellement acquises dans bookmark_info et stockez les informations précédemment acquises dans les données. Vérifiez ensuite s'il a été mis à jour.

###############################################################
#                        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]) + "A été mis à jour.\n" + latest[2])
                json = {"value1" : str(latest[0]) +"A été mis à jour.\n" + latest[2]}
                post_ifttt(json)

Écrire les informations de mise à jour dans le fichier </ 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 Importé sur GitHub ( ici ). Jetez-y un œil si vous le souhaitez.

À la fin

Le processus de connexion était la partie la plus intéressante des connaissances acquises grâce à cette application. Vous ne transmettez pas simplement votre identifiant et votre mot de passe. De plus, l'automatisation a été réalisée avec le planificateur de tâches. Pour plus de détails sur l'utilisation du planificateur de tâches, veuillez consulter la section de référence.

Les références

Recommended Posts