Le concours AtCoder se déroule de manière irrégulière, mais j'oublie parfois de le programmer, et cela semble déranger ma famille, alors j'ai décidé de l'automatiser (je ne sais pas si je peux le faire). J'ai utilisé Google Colaboratory pour l'exécution. Étant un débutant en programmation, le code peut être désordonné ou erroné. Pardon.
Code réel Obtenez uniquement le nom, la date et le lien du concours programmé AtCoder dans la "Liste des concours" sur la page d'accueil d'AtCoder et créez-en une liste.
from bs4 import BeautifulSoup #Importation de belle soupe
import requests #Importer des demandes
import datetime
import re
url = "https://atcoder.jp/contests/"
response = requests.get(url).text
soup = BeautifulSoup(response, 'html.parser') #Belle initialisation de soupe
tags = soup.select("tbody a") #Sélectionnez toutes les balises sous tbody
l=[]
l_n=[]
l_link=[]
l_n1=[]
now=datetime.datetime.now().strftime('%Y-%m-%d %H:%M') #Obtenez l'année, le mois, le jour et l'heure en cours
for i in tags:
l.append(i.text) #Récupérez le texte dans la balise a
l.append(i.get("href")) #Obtenez le lien attaché à la balise a
l.remove("practice contest")
l.remove("/contests/practice")
l.remove("AtCoder Library Practice Contest")
l.remove("/contests/practice2")
l=[l[i:i + 4] for i in range(0,len(l), 4)]
for i in range(len(l)):
l[i][0]=l[i][0][0:16]
del l[i][1]
if (l[i][0][0:4] > now[0:4]) or (l[i][0][0:4] == now[0:4] and l[i][0][5:7] > now[5:7])
or (l[i][0][0:4] == now[0:4] and l[i][0][5:7] == now[5:7] and l[i][0][8:10] >= now[8:10]): #Supprimer les concours passés de la liste
l_n.append(l[i])
for i in range(len(l_n)):
l_link.append("https://atcoder.jp"+l_n[i][2]) #Changer le lien relatif en lien absolu
Il était difficile d'obtenir l'heure de début, l'heure de fin, le classement et les pénalités du concours, alors j'ai sauté sur chaque lien pour l'obtenir.
for i in l_link:
url_n=i
response_n = requests.get(url_n).text
soup_n = BeautifulSoup(response_n, 'html.parser') #Belle initialisation de soupe
tags2=soup_n.select("span.mr-2")+soup_n.select("small.contest-duration") #Obtenez évalué, pénalité, temps d'attente, etc.
for j in tags2:
l_n1.append(j.text)
l_n1=[l_n1[i:i + 4] for i in range(0,len(l_n1), 4)]
for i in range(len(l_n1)):
l_n1[i][1]=l_n1[i][1][13:]
l_n1[i][1]=l_n1[i][1].replace("-","~")
l_n1[i][2]=l_n1[i][2][9:]
l_n1[i][3]=re.sub("\n","",l_n1[i][3])
l_n1[i][3]=re.sub("\t","",l_n1[i][3])
l_n1[i][3]=l_n1[i][3][54:60]
del l_n1[i][0]
for i in range(len(l_n)):
l_n[i]+=l_n1[i]
(Référence: https://dividable.net/programming/python/python-scraping)
Collez les données récupérées dans une feuille de calcul.
from google.colab import auth
from oauth2client.client import GoogleCredentials
import gspread
auth.authenticate_user()
gc = gspread.authorize(GoogleCredentials.get_application_default())
worksheet = gc.open('AtCoderNewContestList').get_worksheet(0) #Spécifiez la première feuille d'une feuille de calcul nommée AtCoderNewContestList
for i in range(len(l_n)):
if worksheet.update_acell("B"+str(i+2),l_n[i][1]) in worksheet.range('B2:B10'): #Ne pas traiter si le concours a déjà été ajouté
continue
else:
worksheet.update_acell("B"+str(i+2),l_n[i][1])
worksheet.update_acell("C"+str(i+2), l_n[i][0][0:4]+"/"+l_n[i][0][5:7]+"/"+l_n[i][0][8:10])
worksheet.update_acell("D"+str(i+2),l_n[i][0][11:])
worksheet.update_acell("E"+str(i+2),l_n[i][-1])
worksheet.update_acell("F"+str(i+2),l_n[i][3])
worksheet.update_acell("G"+str(i+2),l_n[i][4])
worksheet.update_acell("H"+str(i+2),"https://atcoder.jp"+l_n[i][2])
worksheet.update_acell("A"+str(i+2),"")
Le résultat est ci-dessous. Cela fonctionne plutôt bien.
Ajoutez des rendez-vous à Google Agenda à l'aide de GAS. Pour diverses raisons, j'ai décidé de créer un nouveau compte Google, d'accéder à la feuille de calcul créée et de créer un calendrier pour extraire des données avec GAS. Je ne peux plus accéder au compte que j'ai créé au début. Pourquoi? Vous pouvez écrire du code GAS en sélectionnant "Script Editor" dans "Tools" dans la feuille de calcul. (GAS peut comprendre le contenu du code mais ne peut pas l'écrire, j'ai donc copié et édité le code sur le site ci-dessous.) (Référence: https://qiita.com/cazimayaa/items/5fdfbc060dff7a11ee15)
function myFunction() {
//Obtenir la feuille de la feuille de calcul actuellement sélectionnée
var sheet = SpreadsheetApp.getActiveSheet();
//Récupérez le contenu de la cellule à partir de la feuille obtenue
var values = sheet.getDataRange().getValues();
var calendar = CalendarApp.getDefaultCalendar();
//* La 0ème partie de var i est l'en-tête, donc commencez par 1.
for (var i = 1; i < values.length; i++) {
var status = values[i][0];
if (
status != "Déjà" // 連携の欄がDéjàになっていなかったら処理を行う
) {
//date prévue
var date = values[i][2];
//Heure de début
var startTime = values[i][3];
var startDateTime = new Date(date.getFullYear(),
date.getMonth(),
date.getDate(),
startTime.getHours(),
startTime.getMinutes(), 0);
//heure de fin
var endTime = values[i][4];
var endDateTime = new Date(date.getFullYear(),
date.getMonth(),
date.getDate(),
endTime.getHours(),
endTime.getMinutes(), 0);
//Titre
var title = values[i][1]+values[i][8];
var options = {
description: values[i][7]
}
// var event = calendar.createEvent(title, startDateTime, endDateTime);
//Ajoutez simplement des options à l'argument
var event = calendar.createEvent(title, startDateTime, endDateTime, options);
//S'inscrire au calendrier
sheet.getRange(i + 1, 1).setValue("Déjà"); // 連携の欄をDéjàにする
}
}
}
Cela peut être bien tel quel, mais je veux lier le calendrier lorsque la feuille de calcul est mise à jour, alors définissez un déclencheur. (Référence: [https://auto-worker.com/blog/?p=1646](https://auto-worker.com/blog/?p=1646 https://auto-worker.com/blog/? p = 1646))) A partir de "Déclenchement du projet en cours", exécutez la fonction lorsque la feuille est modifiée.
Après exécution calendrier Tableur Je l'ai fait.
Je voulais vraiment que le code Python s'exécute automatiquement sur une base régulière, mais je l'ai arrêté car ce serait un problème.
Recommended Posts