Ver resultados
El código fuente está en la parte inferior, pero si realmente quieres aprender sobre los rastreadores de python o las personas que quieren entender mis ideas, espero que puedas leer mi interpretación detallada con paciencia, de lo contrario, estos códigos nunca pertenecerán al juego que estás a punto de
comenzar
.
Proceso de producción
ideas de rastreo
En primer lugar, visitamos el lugar rodeado por ctftime
, que es la información de la competencia ctf en curso y la próxima competencia ctf. Puede
ver que la página de inicio no brinda la URL de la competencia relevante, solo el nombre de la competencia y la hora de la competencia.
Visite un sitio web para
averiguar los detalles Hay toda la información que queremos en la página web, y podemos obtener la información rastreando cada sitio web detallado.
Finalmente encontró la ley, cada sitio web detallado se compone de los siguientes métodos
https://ctftime.org/event/XXXX
Y xxxx se puede ver en la página de inicio
, por lo que mi pensamiento es claro, primero rastrea el número de cuatro dígitos correspondiente en la página de inicio, luego crea una nueva URL y rastrea la nueva URL para obtener información.
juego en curso
Descubrí que cuando seleccioné
<table width="100%">
, se seleccionará nuestra información de destino, luego comenzaremos desde aquí
headers = {
'User-Agent': "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36"
}
r = requests.get(url, headers=headers)
bs_url = BeautifulSoup(r.text, 'html.parser')
ctf_today = bs_url.find_all('table', width='100%')
Se puede ver que inicialmente hemos obtenido la información de cuatro dígitos, pero necesitamos acotar aún más el posicionamiento.Puede
ver que la información de cuatro dígitos está debajo de la etiqueta td>a, y la leeremos más
for today1 in ctf_today:
today_td = today1.find_all('td')
for today2 in today_td:
today_a = today2.find('a')
if today_a:
print(today_a)
Se ha extraído la etiqueta más pequeña y luego filtramos el contenido redundante. Como todos son redundantes, podemos filtrar directamente por reemplazo
today_a_str = str(today_a)
today_url = re.sub('<a href="/event/|" style="color: #000000">|<img alt="Jeopardy" border="0" rel="tooltip" src="/static/images/ct/1.png" title="Jeopardy"/></a>|\n', '', today_a_str)
Próximos juegos
cuando seleccionamos
<table class="table table-striped upcoming-events">
, nuestra información de destino será seleccionada
url_event = "https://ctftime.org/event/"
# ctf = {} # 写入字典用
headers = {
'User-Agent': "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36"
}
r = requests.get(url, headers=headers)
bs_url = BeautifulSoup(r.text, 'html.parser')
ctf_come = bs_url.find_all('table', class_='table table-striped upcoming-events')
La información de cuatro dígitos está debajo de la etiqueta y la leemos más
for come1 in ctf_come:
come_tr = come1.find_all('a')
for come2 in come_tr:
print(come2)
Filtre el contenido redundante, porque aquí no es uniforme, solía leer los primeros 20 bits y luego filtraba la misma parte al principio
for come1 in ctf_come:
come_tr = come1.find_all('a')
for come2 in come_tr:
come3 = str(come2)
come4 = come3[0:20]
come_url = re.sub('<a href="/event/', '', come4)
Rastrear sitio web detallado
Primero empalme la url
url_event = "https://ctftime.org/event/"
new_url = url_event + today_url
Luego analice el sitio web detallado de la competencia
Nombre del juego
El nombre del juego no es difícil, es solo un filtro de lectura de respuesta corta
def get_name(url): # 获取比赛名称
try:
headers = {
'User-Agent': "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36"
}
r = requests.get(url, headers=headers)
bs_url = BeautifulSoup(r.text, 'html.parser')
name = bs_url.find_all('h2')
final_name = re.sub('<h2>|<i class="icon-play-circle" id="progress" rel="tooltip"></i></h2>|</h2>', '',str(name)) # 比赛名称
return final_name
except:
print("比赛名称获取失败")
Tiempo de juego
Una dificultad aquí es que la información obtenida no es uniforme y no se puede filtrar directamente, pero la diferencia es el número de cuatro dígitos, por lo que podemos importar números de cuatro dígitos a la función al mismo tiempo.
def get_time(url,num): # 获取比赛时间
try:
headers = {
'User-Agent': "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36"
}
r = requests.get(url, headers=headers)
bs_url = BeautifulSoup(r.text, 'html.parser')
times = bs_url.find('div', class_='span10')
time = times.find('p')
time_str = str(time)
final_time = re.sub('<p>|<a href="/event/|.ics|" id="calendar" rel="tooltip">|<img class="svg_icon" id="icon_calendar" src="/static/img/icon_cal.svg"/>|</a>|</p>|\xa0|\n', '', time_str)
final_time = re.sub(num, '', final_time) # 比赛时间
return final_time
except:
print("比赛时间获取失败")
Sitio del concurso
Un punto aquí es que después de filtrar habrá dos sitios idénticos
headers = {
'User-Agent': "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36"
}
r = requests.get(url, headers=headers)
bs_url = BeautifulSoup(r.text, 'html.parser')
url = bs_url.find('a', rel='nofollow')
final_url = re.sub('<a href="|" rel="nofollow">|</a>|\n', '', str(url))
Aquí podemos usar el método de tomar la mitad, y la longitud de tomar la mitad es la mitad de la longitud de los dos caracteres de enlace.
final_url = final_url[0:int(len(final_url) / 2)]
código completo
'''
author:C1yas0
time:2021-8-28
'''
import requests
import re
from bs4 import BeautifulSoup
def get_ctftime_running(url):
url_event = "https://ctftime.org/event/"
# ctf = {} # 写入字典用
try:
headers = {
'User-Agent': "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36"
}
r = requests.get(url, headers=headers)
bs_url = BeautifulSoup(r.text, 'html.parser')
ctf_today = bs_url.find_all('table', width='100%')
for today1 in ctf_today:
today_td = today1.find_all('td')
for today2 in today_td:
today_a = today2.find('a')
if today_a:
# list = [] # 写入字典用
today_a_str = str(today_a)
today_url = re.sub('<a href="/event/|" style="color: #000000">|<img alt="Jeopardy" border="0" rel="tooltip" src="/static/images/ct/1.png" title="Jeopardy"/></a>|\n', '', today_a_str)
new_url = url_event + today_url
# list.append([get_time(new_url, today_url), get_url(new_url)]) # 写入字典用
# ctf[get_name(new_url)] = list # 写入字典用
print(get_name(new_url)+" "+get_time(new_url, today_url)+" " + get_url(new_url))
# print(ctf) # 写入字典用
except:
print("请求失败")
def get_ctftime_upcoming(url):
try:
url_event = "https://ctftime.org/event/"
# ctf = {} # 写入字典用
headers = {
'User-Agent': "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36"
}
r = requests.get(url, headers=headers)
bs_url = BeautifulSoup(r.text, 'html.parser')
ctf_come = bs_url.find_all('table', class_='table table-striped upcoming-events')
for come1 in ctf_come:
come_tr = come1.find_all('a')
for come2 in come_tr:
# list = [] # 写入字典用
come3 = str(come2)
come4 = come3[0:20]
come_url = re.sub('<a href="/event/', '', come4)
new_url = url_event + come_url
# list.append([get_time(new_url, come_url), get_url(new_url)]) # 写入字典用
# ctf[get_name(new_url)] = list # 写入字典用
print(get_name(new_url)+" "+get_time(new_url, come_url)+" "+get_url(new_url))
# print(ctf) # 写入字典用
except:
print("请求失败")
def get_name(url): # 获取比赛名称
try:
headers = {
'User-Agent': "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36"
}
r = requests.get(url, headers=headers)
bs_url = BeautifulSoup(r.text, 'html.parser')
name = bs_url.find_all('h2')
final_name = re.sub('<h2>|<i class="icon-play-circle" id="progress" rel="tooltip"></i></h2>|</h2>', '',str(name)) # 比赛名称
return final_name
except:
print("比赛名称获取失败")
def get_time(url,num): # 获取比赛时间
try:
headers = {
'User-Agent': "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36"
}
r = requests.get(url, headers=headers)
bs_url = BeautifulSoup(r.text, 'html.parser')
times = bs_url.find('div', class_='span10')
time = times.find('p')
time_str = str(time)
final_time = re.sub('<p>|<a href="/event/|.ics|" id="calendar" rel="tooltip">|<img class="svg_icon" id="icon_calendar" src="/static/img/icon_cal.svg"/>|</a>|</p>|\xa0|\n', '', time_str)
final_time = re.sub(num, '', final_time) # 比赛时间
return final_time
except:
print("比赛时间获取失败")
def get_url(url): # 获取比赛网址
try:
headers = {
'User-Agent': "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36"
}
r = requests.get(url, headers=headers)
bs_url = BeautifulSoup(r.text, 'html.parser')
url = bs_url.find('a', rel='nofollow')
final_url = re.sub('<a href="|" rel="nofollow">|</a>|\n', '', str(url))
final_url = final_url[0:int(len(final_url) / 2)] # 比赛网址
return final_url
except:
print("比赛时间获取失败")
if __name__ == '__main__':
url = "https://ctftime.org"
# get_ctftime_running(url) # 正在举行的比赛
# get_ctftime_upcoming(url) # 即将举行的比赛