Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Como posso melhorar o scrapping em HTML com a linguagem M?

Olá! Tudo bem?!

Estou tentanto realizar um web scrapping com a linguagem M e gostaria de verificar uma melhor opção para a solução que encontrei.

Vocês poderiam me auxiliar?

Estou realizando o scrapping da página: https://trends24.in/brazil/sao-paulo/

Ela não fornece uma tabela de html pronta para só conectar com o Power BI. :(

Quero puxar uma tabela para cada item das listas fornecidas e seus respectivos valores (quando houver):

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Primeiro cheguei nessa solução:

let
    Consulta1 = Html.Table(Web.BrowserContents("https://trends24.in/brazil/sao-paulo/"),
{
{"tempo",".trend-card__time"},
{"conteudo",".trend-card__list"},
{"termo_valor",".trend-card__list li"},
{"valor",".trend-card__list li .tweet-count"}
},
[RowSelector=".trend-card__list"])
in
    Consulta1

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Mas ela me fornece apenas os primeiros itens de cada item da tag "li'" : Insira aqui a descrição dessa imagem para ajudar na acessibilidade *Como posso fazer um "looping" for para puxar todos os itens? *

Uma outra abordagem para solucionar (mas seria uma "gambiarra" bem mais feia) seria já fazer o "Row selector" pela tag "li":


let
#"Tabela" = Html.Table(Web.BrowserContents("https://trends24.in/brazil/sao-paulo/"),
{
{"termo",".trend-card__list li a"},
{"volume",".trend-card__list li .tweet-count"}
},
[RowSelector=".trend-card__list li"])
in
    #"Tipo Alterado"

Com isso eu já teria todos os termos e seus respectivos valores: Insira aqui a descrição dessa imagem para ajudar na acessibilidadeMas não dividido pelo "tempo" do título. Porém como sempre são listas de 50, poderia ir filtrando e tendo as tabelas.

Não gostaria de manter esse "solução".

*Alguém poderia auxiliar, indicando uma solução "mais correta"? *

Desde já agradeço.

Abraços!! :D

2 respostas
solução!

Oi, Francisco!! Tudo certo contigo?

Desculpe pela demora em te responder.

Um outro caminho que você pode seguir para chegar no seu objetivo, é utilizar as funções List.Accumulate e Table.FromColumns! Para entender melhor o que cada uma faz, observe o exemplo abaixo:

let
    Consulta1 = Html.Table(Web.BrowserContents("https://trends24.in/brazil/sao-paulo/"),
    {
        {"tempo",".trend-card__time"},
        {"conteudo",".trend-card__list"},
        {"termo_valor",".trend-card__list li"},
        {"valor",".trend-card__list li .tweet-count"}
    },
    [RowSelector=".trend-card__list"]),
    
    termos = List.Accumulate(Consulta1[termo_valor], {}, (state, current) => state & {current}),
    valores = List.Accumulate(Consulta1[valor], {}, (state, current) => state & {current}),
    
    Resultado = Table.FromColumns({Consulta1[tempo], termos, valores}, {"Tempo", "Termos", "Valores"})
in
    Resultado

Após coletar as informações por web scraping, criamos uma lista chamada termos, a qual armazena justamente os itens presentes na lista do site (identificados através da tag <li>). Todo esse processo ocorre por meio da função List.Accumulate.

Esse procedimento acontece igualmente com os valores referentes a esses termos (presentes na lista valores)!

Para finalizar, criamos uma tabela chamada Resultado, a qual apresenta o tempo, e as duas listas criadas anteriormente: termos e valores.

Francisco, espero ter ajudado com essa sugestão! Contudo, vale ressaltar que como é um assunto externo ao curso e que não tenho acesso ao cenário completo do projeto, outros testes terão de ser feitos a fim de obter o resultado esperado, mas espero que esta resposta seja um bom ponto de partida para a resolução do seu problema!

Para se aprofundar no assunto e nas funções utilizadas, deixo como dica de leitura os materiais abaixo:

Um forte abraço!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!

Oi Andrielli!

Tudo ótimo e com você?!

Agradeço pela resposta e atenção.

Esta ótima!

Um forte abraço!