Verwenden Sie AWS Lambda, um Nachrichten zu kratzen und LINE regelmäßig über Updates zu informieren [Python]

Einführung

Dies ist mein erster Beitrag. Ich bin ein Student, der seit ungefähr einem halben Jahr Programmieren studiert, aber ich möchte das, was ich gelernt habe, nach und nach ausgeben, also werde ich es veröffentlichen. Ich denke, es gibt viele unordentliche und schmutzige Punkte, wie zum Beispiel, wie man den Code schreibt, also zögern Sie nicht, darauf hinzuweisen.

Ziele / Verfahren

Verwenden Sie, wie der Titel schon sagt, regelmäßig ein Tool namens AWS Lambda (Yahoo News Articles. Scraping alle 6 Stunden) und Verwenden der LINE-Messaging-API für aktualisierte Artikel in Ihrem LINE-Konto Das Ziel ist es, Sie zu benachrichtigen. Die Entwicklungsumgebung verwendet Cloud9 unter Berücksichtigung der Zusammenarbeit mit Lambda.

In Bezug auf das Verfahren (1) Erhalten Sie 20 Artikeltitel und URLs von News Site mit Pythons Beautiful Soup-Modul. Die URL lautet AWS Schreiben Sie in die CSV-Datei in S3. (Der zu schreibende Teil ist am Ende des Programms fertig.) (2) Vergleichen Sie die URL der vorherigen Ausführung (lesen Sie csv aus S3) mit der diesmal erfassten URL, um das Update zu finden. (3) Benachrichtigen Sie den Titel und die URL des aktualisierten Artikels mithilfe der LINE-Messaging-API. Es wird in der Reihenfolge sein.

Für die LINE-Messaging-API Webseitenaktualisierungen mit LINE BOT überwachen Scraping mit BeautifulSoup ist Web Scraping mit BeautifulSoup Zum Lesen und Schreiben der S3-CSV-Datei Python-Code zum einfachen Lesen der AWS S3-CSV-Datei und [Schreiben eines Pandas-Datenrahmens in CSV in S3]( Ich habe auf den Artikel um https://www.jitsejan.com/write-dataframe-to-csv-on-s3.html verwiesen.

Code

import urllib.request
from bs4 import BeautifulSoup
import csv
import pandas as pd
import io
import boto3
import s3fs
import itertools
from linebot import LineBotApi
from linebot.models import TextSendMessage

def lambda_handler(event, context):
    
    url = 'https://follow.yahoo.co.jp/themes/051839da5a7baa353480'
    html = urllib.request.urlopen(url)
    #HTML-Perspektive
    soup = BeautifulSoup(html, "html.parser")
    
    
    def news_scraping(soup=soup):
        """
Titel und URL des Artikels abrufen
        """
        title_list = []
        titles = soup.select('#wrapper > section.content > ul > li:nth-child(n) > a.detailBody__wrap > div.detailBody__cnt > p.detailBody__ttl')
    
        for title in titles:
            title_list.append(title.string)
    
        url_list = []   
        urls = soup.select('#wrapper > section.content > ul > li:nth-child(n) > a.detailBody__wrap')
        
        for url in urls:
            url_list.append(url.get('href'))
       
        return title_list,url_list
        
    def get_s3file(bucket_name, key):
        """
Lesen Sie csv aus S3
        """
        s3 = boto3.resource('s3')
        s3obj = s3.Object(bucket_name, key).get()
    
        return io.TextIOWrapper(io.BytesIO(s3obj['Body'].read()))
        
    def write_df_to_s3(csv_list):
        """
Schreiben Sie an S3
        """
        csv_buffer = io.StringIO()
        csv_list.to_csv(csv_buffer,index=False,encoding='utf-8-sig')
        s3_resource = boto3.resource('s3')
        s3_resource.Object('Eimername','Dateiname').put(Body=csv_buffer.getvalue())
    
    def send_line(content):
        access_token = ********
        #Füllen Sie das Channel-Zugriffstoken aus
        line_bot_api = LineBotApi(access_token)
        line_bot_api.broadcast(TextSendMessage(text=content))
    
    ex_csv =[]
    #Geben Sie die URL für das vorherige Scraping ein
    for rec in csv.reader(get_s3file('Eimername', 'Dateiname')):
        ex_csv.append(rec)
    
    ex_csv = ex_csv[1:]
    #index=Es sollte als False geschrieben worden sein, aber der Index 0 am Anfang des gelesenen csv(?)Wurde geschrieben
    ex_csv = list(itertools.chain.from_iterable(ex_csv))
    #Da das gelesene CSV ein zweidimensionales Array war, wurde es in ein eindimensionales Array konvertiert
    
    title,url = news_scraping()
    #Scraping-Ausführung
    csv_list = url
    
    #ex_Extrahieren Sie Aktualisierungen durch Vergleich mit CSV
    for i in range(20):
        if csv_list[i] in ex_csv[0]:
        #Ich habe verwendet, weil es nicht genau passte
            num = i
        #ex_Der Artikel am Anfang von csv ist csv_Finden Sie heraus, welcher Nummer in der Liste sie entspricht
            break
        else:
            num = 'all'

    if num == 'all':
        send_list = [None]*2*20
        send_list[::2] = title
        send_list[1::2] = url
        send_list = "\n".join(send_list)
    #Fügen Sie abwechselnd Titel und URL ein und brechen Sie
    
    elif num == 0:
        send_list = 'Keine neuen Nachrichten'
    
    else:
        send_list = [None]*2*num
        send_list[::2] = title[:num]
        send_list[1::2] = url[:num]
        send_list = "\n".join(send_list)
    ##Fügen Sie abwechselnd Titel und URL ein und brechen Sie
    
    send_line(send_list)
    
    csv_list = pd.DataFrame(csv_list)
    #Wenn Sie als Liste in S3 schreiben, tritt ein Fehler auf. Konvertieren Sie daher den Datentyp.
    write_df_to_s3(csv_list)
    #CSV auf S3_Liste schreiben und fertig

Das war's für den Code. (Es war besser, eine Funktion zu definieren, bei der send_list aus num erstellt wird.) Stellen Sie es anschließend auf Remote bereit und legen Sie die regelmäßige Ausführung in [Amazon CloudWatch Events] fest (https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/events/WhatIsCloudWatchEvents.html). Ich denke, es ist besser, mit Cron-Ausdruck zu planen, um in bestimmten Zeitintervallen ausgeführt zu werden. Sie müssen vorsichtig sein, da Sie S3 mit IAM Zugriffsberechtigungen erteilen müssen.

abschließend

Das Lesen und Schreiben von CSV von S3 verlief nicht wie erwartet. Insbesondere beim Schreiben scheint es Raum für Verbesserungen zu geben, beispielsweise die Tatsache, dass es sich um ein zweidimensionales Array handelt.

Eigentlich hatte ich vorher das Schaben mit Selnium, Headless-Chrome und Lambda geübt (zusätzlich zur ersten Verwendung von Lambda hatte ich viele Fehler im Zusammenhang mit Chrome Binary und hatte es schwer). Daher konnte ich diesmal den Code in relativ kurzer Zeit schreiben. Das heißt, es ist viel mehr Arbeit als lokales Schaben. Ich habe hier die Verwendung von Lambda weggelassen, aber es ist ziemlich verwirrend. Bitte lesen Sie andere Artikel.

Vor kurzem habe ich an Django und Twitter API gearbeitet. Wenn ich hier etwas bemerke, werde ich es erneut veröffentlichen.

Vielen Dank.

Recommended Posts

Verwenden Sie AWS Lambda, um Nachrichten zu kratzen und LINE regelmäßig über Updates zu informieren [Python]
Verwenden Sie AWS Lambda, um einen Mechanismus zu erstellen, der Slack benachrichtigt, wenn der von CloudWatch überwachte Wert in Python überschritten wird
Eine Geschichte über das Schreiben von AWS Lambda und ein wenig Abhängigkeit von den Standardwerten von Python-Argumenten
[Python] Lassen Sie sich täglich von LINE über das Ranking der Suchergebnisse auf Ihrer Website informieren.
Zusammenfassung des Studiums von Python zur Verwendung von AWS Lambda
[Python] Erstellen Sie ein Skript, das FeedParser und LINE Notify verwendet, um LINE über die neuesten Informationen zum neuen Koronavirus des Ministeriums für Gesundheit, Arbeit und Soziales zu informieren.
Anweisungen zur Verwendung der AWS-Befehlszeilenschnittstelle (Python / awscli) unter Mac OS X.
Verschieben Sie CloudWatch-Protokolle regelmäßig mit Lambda nach S3
Regelmäßiges Serverless Scraping mit AWS Lambda + Scrapy Teil 1
Laden Sie Daten mit einem Befehl und einer Aktualisierung auf s3 von aws hoch und löschen Sie die verwendeten Daten (unterwegs).
Verschiedene Möglichkeiten, die letzte Zeile einer CSV-Datei in Python zu lesen
Führen Sie regelmäßig Python-Programme auf AWS Lambda aus
Senden Sie eine Nachricht mit Python an LINE (LINE Notify)
Ich möchte Python in der Umgebung von pyenv + pipenv unter Windows 10 verwenden
Verwenden Sie libsixel, um Sixel in Python auszugeben und das Matplotlib-Diagramm an das Terminal auszugeben.
Erstellen Sie eine Python-Umgebung, um die Theorie und Implementierung von Deep Learning zu erlernen
[Python] Ein Programm, das die Anzahl der Aktualisierungen der höchsten und niedrigsten Datensätze berechnet
Berücksichtigung der Stärken und Schwächen von Python
Ich habe versucht, Twitter Scraper mit AWS Lambda zu verwenden, aber es hat nicht funktioniert.
[Einführung in die Statistik] Welche Art von Verteilung ist die t-Verteilung, die Chi-Quadrat-Verteilung und die F-Verteilung? Eine kleine Zusammenfassung der Verwendung von [Python]
[Python3] Machen Sie einen Screenshot einer Webseite auf dem Server und schneiden Sie sie weiter zu
Es war ein Leben, das ich auf AWS Lambda OCR wollte, um die Charaktere zu lokalisieren.
Verwenden Sie AWS Lambda + LINE Benachrichtigen, um LINE zu benachrichtigen, dass Sie Ihren Regenschirm nicht vergessen, wenn Sie nach Hause kommen
Eine kleine Geschichte, die beim Schreiben von Twilio-Anwendungen mit Python auf AWS Lambda süchtig macht
Unterstützung für Python 2.7-Laufzeit auf AWS Lambda (ab 2020.1)
Ich möchte Lambda mit Python auf Mac AWS!
Vorgehensweise zum Erstellen eines Linienbot in AWS Lambda
Python Hinweis: Das Rätsel, einer Variablen eine Variable zuzuweisen
Verwenden Sie Python, um Windows und Mac zu überwachen und Informationen zu den Apps zu sammeln, an denen Sie arbeiten
[C / C ++] Übergeben Sie den in C / C ++ berechneten Wert an eine Python-Funktion, um den Prozess auszuführen, und verwenden Sie diesen Wert in C / C ++.
Holen Sie sich die passende Zeichenfolge in den regulären Ausdruck und verwenden Sie sie beim Ersetzen unter Python3 erneut
Ich möchte den Schnittpunkt einer Bezier-Kurve und einer geraden Linie finden (Bezier-Clipping-Methode)
Slack-Benachrichtigung, wenn ein bestimmtes Wort auf Twitter mit Heroku mit Python gemurmelt wird
Ich habe eine Funktion zum Trimmen des Bildes von Python openCV erstellt. Verwenden Sie sie daher bitte.
Scraping mit Python + Selen, um überholte Apple-Produkte in Ihren Warenkorb zu legen und per Zeile zu benachrichtigen
[Python] Ein Programm, um die Anzahl der Äpfel und Orangen zu ermitteln, die geerntet werden können
So erhalten Sie Informationen von Organisationen, Cost Explorer eines anderen AWS-Kontos bei Lambda (Python)
Gepostet als Anhang zu Slack auf AWS Lambda (Python)
Verwendung der Methode __call__ in der Python-Klasse
[Hyperledger Iroha] Hinweise zur Verwendung des Python SDK
[Python] Zusammenfassung der Verwendung von Split- und Join-Funktionen
Installieren Sie pyenv auf MacBookAir und wechseln Sie Python zur Verwendung
[Einführung in AWS] Memorandum zum Erstellen eines Webservers auf AWS
Veröffentlichen Sie regelmäßig Bilder von Papillon auf Python + AWS Lambda + Slack
Ich möchte die Natur von Python und Pip kennenlernen
[Python] Ermöglicht den Import von pip3-Paketen in AWS Lambda
Schreiben Sie ein Skript in Shell und Python, um Sie in Slack zu benachrichtigen, wenn der Vorgang abgeschlossen ist
Verarbeiten Sie die mit Redshift entladene gzip-Datei mit Python of Lambda, gzipen Sie sie erneut und laden Sie sie in S3 hoch
[Python] Die Rolle des Sterns vor der Variablen. Teilen Sie den Eingabewert und weisen Sie ihn einer Variablen zu
[Python] Ich habe versucht, mit argparse ein einfaches Programm zu erstellen, das in der Befehlszeile funktioniert
Die Geschichte, zum ersten Mal seit 5 Jahren wieder an die Front zurückzukehren und Python Django umzugestalten
[Python] Verwendung der for-Anweisung. Eine Methode zum Extrahieren durch Angabe eines Bereichs oder von Bedingungen.
Erfahren Sie anhand eines einfachen Regressionsmodells den Ablauf der Bayes'schen Schätzung und die Verwendung von Pystan
Ich möchte die Frage nach der Methode "__init__" und dem Argument "self" der Python-Klasse klären.
Wie benutzt man Python Lambda?
[Python-Scraping] Geben Sie die URL und den Titel der Site mit einem bestimmten Schlüsselwort in eine Textdatei ein
Über den Fehler, den ich beim Versuch, Adafruit_DHT von Python auf Raspberry Pi zu verwenden, festgestellt habe