Skip to content

Classe: BetanoBrowser

Essa é a classe principal do projeto, onde realizamos a extração das informações do site, realiza tratamento dos dados para no fim chegar a lista de JSON principal que será armazenada no banco de dados.

Métodos da Classe

Source code in betCrawler\Browser\betanoCr.py
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
class BetanoBrowser:
    def __init__(self):
        self.driver = Driver(uc=True)


    def open_url(self, url):
        """
        Abre uma URL no navegador.
        """
        self.driver.open(url)

    def get_html_from_url(self, query="*"):
        """
        Obtém o HTML da página e retorna as informações relevantes em um DataFrame.
        """
        df = pd.DataFrame()
        while df.empty:
            df = get_df(
                self.driver,
                By,
                WebDriverWait,
                expected_conditions,
                queryselector=query,
                with_methods=True,
            )
        return df

    def search_text(self, text, df):
        """
        Procura por um texto específico na coluna 'aa_innerText' do DataFrame e retorna as linhas correspondentes.
        """
        df_result = df[df['aa_innerText'].str.contains(text, regex=False, na=False) & (df['aa_tagName'] != 'DIV')]
        df_result = df_result[['aa_tagName', 'aa_innerText', 'aa_className']]
        return df_result

    def select_by_text(self, df, text):
        """
        Seleciona linhas do DataFrame com base no texto fornecido na coluna 'aa_className'.
        """
        text = df.loc[df.aa_className.str.contains(text, regex=False, na=False)].aa_innerText.iloc[0]
        df_filter = pd.DataFrame(text.splitlines())
        return df_filter

    def extract_games(self, df, start, end, regex_pattern):
        """
        Extrai os jogos do DataFrame com base nos padrões de início e fim fornecidos.
        """
        index_inicial = None
        index_final = None

        # Verifica se start e end não são None e atualiza os índices iniciais e finais
        if start:
            index_inicial = df.loc[df[0].str.contains(start, na=False, regex=False)].index[-1] + 1
        if end:
            index_final = df.loc[df[0].str.contains(end, na=False, regex=False)].index[-1]

        # Extrai os jogos com base nos índices iniciais e finais atualizados
        if index_inicial is not None and index_final is not None:
            df = df.iloc[index_inicial:index_final].reset_index(drop=True)
        elif index_inicial is not None:
            df = df.iloc[index_inicial:].reset_index(drop=True)
        elif index_final is not None:
            df = df.iloc[:index_final].reset_index(drop=True)



        df[0] = df[0].str.strip()

        indexes_data = df.loc[df[0].str.contains(regex_pattern, regex=True, na=False)].index
        allbets = [df.iloc[indexes_data[i]:indexes_data[i+1]] for i in range(len(indexes_data)-1)]
        df_append = df.iloc[indexes_data[-1]:].reset_index(drop=True)
        allbets.append(df_append)
        return allbets

    def dataframe_to_json(self, dfs):
        """
        Converte os DataFrames de jogos em uma lista de dicionários JSON.
        """
        colunas = {
            0: 'data',
            1: 'hora',
            2: 'mandante',
            3: 'visitante',
            5: 'odd_home',
            7: 'odd_draw',
            9: 'odd_away'
        }

        json_list = []

        for jogo in range(len(dfs)):
            json_data = {}

            for i, k in colunas.items():
                valor = dfs[jogo].iloc[i].values[0]
                json_data[k] = valor

            json_list.append(json_data)

        return json_list

dataframe_to_json(dfs)

Converte os DataFrames de jogos em uma lista de dicionários JSON.

Source code in betCrawler\Browser\betanoCr.py
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
def dataframe_to_json(self, dfs):
    """
    Converte os DataFrames de jogos em uma lista de dicionários JSON.
    """
    colunas = {
        0: 'data',
        1: 'hora',
        2: 'mandante',
        3: 'visitante',
        5: 'odd_home',
        7: 'odd_draw',
        9: 'odd_away'
    }

    json_list = []

    for jogo in range(len(dfs)):
        json_data = {}

        for i, k in colunas.items():
            valor = dfs[jogo].iloc[i].values[0]
            json_data[k] = valor

        json_list.append(json_data)

    return json_list

extract_games(df, start, end, regex_pattern)

Extrai os jogos do DataFrame com base nos padrões de início e fim fornecidos.

Source code in betCrawler\Browser\betanoCr.py
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
def extract_games(self, df, start, end, regex_pattern):
    """
    Extrai os jogos do DataFrame com base nos padrões de início e fim fornecidos.
    """
    index_inicial = None
    index_final = None

    # Verifica se start e end não são None e atualiza os índices iniciais e finais
    if start:
        index_inicial = df.loc[df[0].str.contains(start, na=False, regex=False)].index[-1] + 1
    if end:
        index_final = df.loc[df[0].str.contains(end, na=False, regex=False)].index[-1]

    # Extrai os jogos com base nos índices iniciais e finais atualizados
    if index_inicial is not None and index_final is not None:
        df = df.iloc[index_inicial:index_final].reset_index(drop=True)
    elif index_inicial is not None:
        df = df.iloc[index_inicial:].reset_index(drop=True)
    elif index_final is not None:
        df = df.iloc[:index_final].reset_index(drop=True)



    df[0] = df[0].str.strip()

    indexes_data = df.loc[df[0].str.contains(regex_pattern, regex=True, na=False)].index
    allbets = [df.iloc[indexes_data[i]:indexes_data[i+1]] for i in range(len(indexes_data)-1)]
    df_append = df.iloc[indexes_data[-1]:].reset_index(drop=True)
    allbets.append(df_append)
    return allbets

get_html_from_url(query='*')

Obtém o HTML da página e retorna as informações relevantes em um DataFrame.

Source code in betCrawler\Browser\betanoCr.py
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
def get_html_from_url(self, query="*"):
    """
    Obtém o HTML da página e retorna as informações relevantes em um DataFrame.
    """
    df = pd.DataFrame()
    while df.empty:
        df = get_df(
            self.driver,
            By,
            WebDriverWait,
            expected_conditions,
            queryselector=query,
            with_methods=True,
        )
    return df

open_url(url)

Abre uma URL no navegador.

Source code in betCrawler\Browser\betanoCr.py
26
27
28
29
30
def open_url(self, url):
    """
    Abre uma URL no navegador.
    """
    self.driver.open(url)

search_text(text, df)

Procura por um texto específico na coluna 'aa_innerText' do DataFrame e retorna as linhas correspondentes.

Source code in betCrawler\Browser\betanoCr.py
48
49
50
51
52
53
54
def search_text(self, text, df):
    """
    Procura por um texto específico na coluna 'aa_innerText' do DataFrame e retorna as linhas correspondentes.
    """
    df_result = df[df['aa_innerText'].str.contains(text, regex=False, na=False) & (df['aa_tagName'] != 'DIV')]
    df_result = df_result[['aa_tagName', 'aa_innerText', 'aa_className']]
    return df_result

select_by_text(df, text)

Seleciona linhas do DataFrame com base no texto fornecido na coluna 'aa_className'.

Source code in betCrawler\Browser\betanoCr.py
56
57
58
59
60
61
62
def select_by_text(self, df, text):
    """
    Seleciona linhas do DataFrame com base no texto fornecido na coluna 'aa_className'.
    """
    text = df.loc[df.aa_className.str.contains(text, regex=False, na=False)].aa_innerText.iloc[0]
    df_filter = pd.DataFrame(text.splitlines())
    return df_filter