Ceci est mon premier message posté. Je suis un étudiant qui étudie la programmation depuis environ six mois, mais j'aimerais publier petit à petit ce que j'ai appris, alors je le posterai. Je pense qu'il y a beaucoup de points désordonnés et sales tels que la façon d'écrire le code, alors n'hésitez pas à le souligner.
Comme le titre l'indique, utilisez régulièrement un outil appelé lambda sur AWS (Yahoo News Articles) ( Grattage toutes les 6 heures) et utilisation de l 'API de messagerie LINE pour les articles mis à jour dans votre compte LINE Le but est de vous avertir. L'environnement de développement utilise cloud9 en tenant compte de la coopération avec lambda.
Concernant la procédure (1) Obtenez 20 titres d'articles et URL à partir du Site d'actualités en utilisant le module Beautiful Soup de Python, et l'URL est AWS Ecrivez dans le fichier csv placé dans S3. (La partie à écrire se fait à la fin du programme.) (2) Comparez l'url de l'exécution précédente (lire csv depuis S3) avec l'url acquise cette fois pour trouver la mise à jour. (3) Notifiez le titre et l'url de l'article mis à jour à l'aide de l'API de messagerie LINE. Ce sera dans l'ordre.
Pour l'API de messagerie LINE, Surveiller les mises à jour de la page Web avec LINE BOT Scraping avec BeautifulSoup est Web scraping avec BeautifulSoup Pour lire et écrire le fichier csv S3, code Python pour simplement lire le fichier CSV AWS S3 et [Ecrire une trame de données Pandas au format CSV sur S3]( J'ai fait référence à l'article autour de https://www.jitsejan.com/write-dataframe-to-csv-on-s3.html).
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)
#perspective html
soup = BeautifulSoup(html, "html.parser")
def news_scraping(soup=soup):
"""
Obtenir le titre et l'URL de l'article
"""
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):
"""
Lire csv depuis 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):
"""
Écrire dans 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('Nom du godet','nom de fichier').put(Body=csv_buffer.getvalue())
def send_line(content):
access_token = ********
#Remplissez le jeton d'accès à la chaîne
line_bot_api = LineBotApi(access_token)
line_bot_api.broadcast(TextSendMessage(text=content))
ex_csv =[]
#Saisissez l'URL du scraping précédent
for rec in csv.reader(get_s3file('Nom du godet', 'nom de fichier')):
ex_csv.append(rec)
ex_csv = ex_csv[1:]
#index=Il aurait dû être écrit False, mais l'index 0 au début de la lecture csv(?)Était écrit
ex_csv = list(itertools.chain.from_iterable(ex_csv))
#Étant donné que le csv lu était un tableau à deux dimensions, il a été converti en un
title,url = news_scraping()
#Exécution de grattage
csv_list = url
#ex_Extraire les mises à jour en comparant avec csv
for i in range(20):
if csv_list[i] in ex_csv[0]:
#Je l'ai utilisé parce que ça ne correspond pas exactement
num = i
#ex_L'article au début de csv est csv_Découvrez à quel numéro dans la liste il correspond
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)
#Insérez le titre et l'URL en alternance, puis interrompez
elif num == 0:
send_list = 'Pas de nouvelles'
else:
send_list = [None]*2*num
send_list[::2] = title[:num]
send_list[1::2] = url[:num]
send_list = "\n".join(send_list)
##Insérez le titre et l'URL en alternance, puis interrompez
send_line(send_list)
csv_list = pd.DataFrame(csv_list)
#Si vous écrivez dans S3 sous forme de liste, une erreur se produira, alors convertissez le type de données.
write_df_to_s3(csv_list)
#CSV sur S3_Rédiger la liste et terminer
Voilà pour le code. (Il était préférable de définir une fonction où send_list est créé à partir de num) Ensuite, déployez-le sur distant et définissez l'exécution périodique dans Amazon CloudWatch Events. Je pense qu'il est préférable de planifier avec Cron expression pour s'exécuter à des intervalles de temps spécifiques. Vous devez être prudent car vous devez accorder des droits d'accès à S3 avec IAM.
La lecture et l'écriture de csv de S3 ne se sont pas déroulées comme prévu. En particulier, il semble y avoir place à l'amélioration, comme le fait qu'il soit devenu un tableau bidimensionnel lors de l'écriture.
En fait, j'avais déjà pratiqué le grattage avec du sélnium, du chrome sans tête et du lambda (en plus d'utiliser lambda pour la première fois, j'ai eu beaucoup d'erreurs liées au chrome binaire et j'ai eu du mal). Par conséquent, j'ai pu écrire le code en un temps relativement court cette fois. Cela dit, c'est beaucoup plus de travail que le grattage local. J'ai omis comment utiliser lambda ici, mais c'est assez déroutant, alors veuillez vous référer à d'autres articles.
Récemment, j'ai travaillé sur django et Twitter API, donc si je remarque quelque chose ici, je le posterai à nouveau.
Merci beaucoup.