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.
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.
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.
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.