Der AtCoder-Wettbewerb findet unregelmäßig statt, aber ich habe manchmal vergessen, ihn zu planen, und es schien meine Familie zu stören, deshalb habe ich beschlossen, ihn zu automatisieren (ich weiß nicht, ob ich das kann). Ich habe Google Colaboratory für die Ausführung verwendet. Als Anfänger in der Programmierung kann der Code unordentlich oder falsch sein. Es tut uns leid.
Tatsächlicher Code Holen Sie sich nur den Namen, das Datum und den Link des geplanten AtCoder-Wettbewerbs aus der "Wettbewerbsliste" auf der AtCoder-Homepage und machen Sie daraus eine Liste.
from bs4 import BeautifulSoup #Import von schöner Suppe
import requests #Importanforderungen
import datetime
import re
url = "https://atcoder.jp/contests/"
response = requests.get(url).text
soup = BeautifulSoup(response, 'html.parser') #Schöne Suppeninitialisierung
tags = soup.select("tbody a") #Wählen Sie alle Tags unter tbody aus
l=[]
l_n=[]
l_link=[]
l_n1=[]
now=datetime.datetime.now().strftime('%Y-%m-%d %H:%M') #Holen Sie sich das aktuelle Jahr, Monat, Tag, Uhrzeit
for i in tags:
l.append(i.text) #Holen Sie sich den Text in das a-Tag
l.append(i.get("href")) #Holen Sie sich den Link an das a-Tag angehängt
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]): #Entfernen Sie vergangene Wettbewerbe aus der Liste
l_n.append(l[i])
for i in range(len(l_n)):
l_link.append("https://atcoder.jp"+l_n[i][2]) #Ändern Sie den relativen Link in den absoluten Link
Es war schwierig, die Startzeit, die Endzeit, die Bewertung und die Strafen des Wettbewerbs zu ermitteln, deshalb bin ich zu jedem Link gesprungen, um ihn zu erhalten.
for i in l_link:
url_n=i
response_n = requests.get(url_n).text
soup_n = BeautifulSoup(response_n, 'html.parser') #Schöne Suppeninitialisierung
tags2=soup_n.select("span.mr-2")+soup_n.select("small.contest-duration") #Bewertung, Strafe, Haltezeit usw.
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]
(Referenz: https://dividable.net/programming/python/python-scraping)
Fügen Sie die abgerufenen Daten in eine Tabelle ein.
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) #Geben Sie das erste Blatt einer Tabelle mit dem Namen AtCoderNewContestList an
for i in range(len(l_n)):
if worksheet.update_acell("B"+str(i+2),l_n[i][1]) in worksheet.range('B2:B10'): #Nicht verarbeiten, wenn der Wettbewerb bereits hinzugefügt wurde
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),"")
Das Ergebnis ist unten. Es funktioniert ziemlich gut.
Fügen Sie mithilfe von GAS Termine zu Google Kalender hinzu. Aus verschiedenen Gründen habe ich beschlossen, ein neues Google-Konto zu erstellen, auf die erstellte Tabelle zuzugreifen und einen Zeitplan zum Extrahieren von Daten mit GAS zu erstellen. Ich kann nicht mehr auf das Konto zugreifen, das ich zu Beginn erstellt habe. Warum? Sie können GAS-Code schreiben, indem Sie "Skript-Editor" unter "Extras" in der Tabelle auswählen. (GAS kann den Inhalt des Codes verstehen, aber nicht schreiben, daher habe ich den Code auf der folgenden Site kopiert und bearbeitet.) (Referenz: https://qiita.com/cazimayaa/items/5fdfbc060dff7a11ee15)
function myFunction() {
//Holen Sie sich das Blatt der aktuell ausgewählten Tabelle
var sheet = SpreadsheetApp.getActiveSheet();
//Holen Sie sich den Inhalt der Zelle aus dem erhaltenen Blatt
var values = sheet.getDataRange().getValues();
var calendar = CalendarApp.getDefaultCalendar();
//* Der 0. Teil von var i ist der Header. Beginnen Sie also bei 1.
for (var i = 1; i < values.length; i++) {
var status = values[i][0];
if (
status != "Bereits" // 連携の欄がBereitsになっていなかったら処理を行う
) {
//geplantes Datum
var date = values[i][2];
//Startzeit
var startTime = values[i][3];
var startDateTime = new Date(date.getFullYear(),
date.getMonth(),
date.getDate(),
startTime.getHours(),
startTime.getMinutes(), 0);
//Endzeit
var endTime = values[i][4];
var endDateTime = new Date(date.getFullYear(),
date.getMonth(),
date.getDate(),
endTime.getHours(),
endTime.getMinutes(), 0);
//Titel
var title = values[i][1]+values[i][8];
var options = {
description: values[i][7]
}
// var event = calendar.createEvent(title, startDateTime, endDateTime);
//Fügen Sie dem Argument einfach Optionen hinzu
var event = calendar.createEvent(title, startDateTime, endDateTime, options);
//Registrieren Sie sich im Kalender
sheet.getRange(i + 1, 1).setValue("Bereits"); // 連携の欄をBereitsにする
}
}
}
Es mag in Ordnung sein, aber ich möchte den Kalender verknüpfen, wenn die Tabelle aktualisiert wird. Setzen Sie also einen Auslöser. (Referenz: [https://auto-worker.com/blog/?p=1646](https://auto-worker.com/blog/?p=1646 https://auto-worker.com/blog/? p = 1646))) Führen Sie unter "Auslöser des aktuellen Projekts" die Funktion aus, wenn das Blatt geändert wird.
Nach der Ausführung Kalender Kalkulationstabelle Ich habs gemacht.
Ich wollte wirklich, dass der Python-Code regelmäßig automatisch ausgeführt wird, aber ich habe ihn gestoppt, weil es ein Ärger wäre.
Recommended Posts