Obtenga el tiempo de juego ctf de ctftime a través del rastreador de python (detallado + código fuente)

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
inserte la descripción de la imagen aquí
.
inserte la descripción de la imagen aquí

Proceso de producción

ideas de rastreo

En primer lugar, visitamos el lugar rodeado por ctftime
inserte la descripción de la imagen aquí
, 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.
inserte la descripción de la imagen aquí
Visite un sitio web para
inserte la descripción de la imagen aquí
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
inserte la descripción de la imagen aquí
, 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

inserte la descripción de la imagen aquí
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%')

inserte la descripción de la imagen aquí
Se puede ver que inicialmente hemos obtenido la información de cuatro dígitos, pero necesitamos acotar aún más el posicionamiento.Puede
inserte la descripción de la imagen aquí
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)

inserte la descripción de la imagen aquí
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)

inserte la descripción de la imagen aquí

Próximos juegos

inserte la descripción de la imagen aquí
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')

inserte la descripción de la imagen aquí
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)

inserte la descripción de la imagen aquí
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)

inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí

Rastrear sitio web detallado

Primero empalme la url

url_event = "https://ctftime.org/event/"
new_url = url_event + today_url

inserte la descripción de la imagen aquí
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("比赛名称获取失败")

inserte la descripción de la imagen aquí
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.
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí

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("比赛时间获取失败")

inserte la descripción de la imagen aquí
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))

inserte la descripción de la imagen aquí
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)]

inserte la descripción de la imagen aquí

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) # 即将举行的比赛

Supongo que te gusta

Origin blog.csdn.net/weixin_46706771/article/details/119973505
Recomendado
Clasificación