Executando verificação de segurança...
1

Web Scrapping de filmes cult em porto alegre

Porto alegre tem várias casas de cinema "de rua": são salas de cinema que passam coleções curadas de filmes novos e antigos, nacionais e internacionais, considerados clássicos ou diferenciados.

Essas casas possuem sites pra divulgação, mas em sua maioria divulgam as sessões pelo Instagram ou Facebook.

E se houvesse um lugar pra você conferir, diariamente, quais filmes estão em cartaz?

Criei o site CINEMA EM POA pra divulgar um agregado dos filmes em cartaz em quatro salas daqui de POA:

Tem muita variedade em cartaz, todo dia da semana!


Encontrando padrões

Eu comecei analisando o site de cada sala de cinema, buscando padrões que eu pudesse utilizar na raspagem dos dados.

Os mais tranquilos forma a Cinemateca Capitólio e a Paulo Amorim, pois os sites são ótimos e muito bem estruturados.

Os mais complicados foram o CineBancários e a Sala Redenção, pois as postagens não seguem uma estrutura HTML fixa, e costumam usar texto livre dentro de tags <p> enormes.

Padrões fáceis

Por exemplo, o site Capitólio tem uma página /programacao que aceita parâmetros pra filtrar em função do dia:

Imagem mostrando o parâmetro starting_date na URL do site do capitólio

Fica fácil descobrirmos, no HTML da página, quais elementos tem quais informações.

curl "http://www.capitolio.org.br/programacao/?starting_date=2023-08-30&date=2023-08-30#selector" > capitolio.html

E aí, analisando com calma, encontramos o seguinte:

  267         <div class="movie">^M
  268           <img class="movie-poster" src="http://www.capitolio.org.br/wp-content/uploads/2023/08/cava.jpeg" title="cava" alt="">           <div class="movie-info">^M
  269           <div class="movie-detail-blocks">^M
  270             <div class="movie-detail-block">^M
--271               <img src="http://www.capitolio.org.br/wp-content/themes/capitolio\/images\/icon-time.png">^M <!-- W: <img> converting backslash in URI to slash <!-- W: <img> lacks "alt" attribute
  272               <span>Horários: 19:00h</span>^M
  273             </div>^M
  274             <div class="movie-detail-block">^M
--275               <img src="http://www.capitolio.org.br/wp-content/themes/capitolio\/images\/icon-sala_de_cinema-room.png">^M <!-- W: <img> converting backslash in URI to slash <!-- W: <img> lacks "alt" attribute
  276               <span>Sala de Cinema</span>^M
  277             </div>^M
  278           </div>^M
  279             <h1 class="movie-title">Cava</h1>^M
  280             <div class="movie-subtitle">Entrada franca</div>^M
  281             <div class="movie-director">^M
  282               Brasil, 2023, 21 minutos, DCP<br />^M
  283 <br />^M
  284 Direção: Hopi Chapman e Karine Emerich<br />^M
  285             </div>^M
  286             <p class="movie-text">Com direção de Hopi Chapman (Flow Films) e Karine Emerich (ph7 Filmes), o curta-metragem apresenta registros biográficos de seis décadas de atuação de Wilson Cavalcanti (Pelotas, RS, 1950), a      bordando sua ampla produção em gravura, pintura e desenho. O filme reúne depoimentos do próprio artista e de outros artistas e especialistas na área, como Anico Herskovits, [&hellip;]</p>^M
  287             <a class="read-more" href="/eventos/6579">leia +</a>^M
  288           </div>^M
  289         </div>^M

Então fica fácil escrever um algoritmo que pega a tag img com a classe .movie-poster, e acessa o seu src. Pega o <p> com a classe .movie-text e acessa o seu conteúdo, que vira a sinopse. Pega a <div> com a classe .movie-director e acessa seu innerText, que é o diretor.

Conclusão:

Foto de um avião com uma faixa dizendo 'deus abençoe o html bem scrito

Padrões dificeis

E quando o HTML não ajuda? Um exemplo é o site da Sala Redenção, que parece ser gerado por algum editor WYSIWYG, pois ele é meio "texto livre", e as tags não possuem ids ou classes.

Imagem de bloco de texto no site da Sala Redenção seguido do HTML equivalente

Repare que não existem classes nem distinção entre blocos contendo o nome do diretor, país do filme, horários de apresentação...

Nesse caso, a solução encontrada foi acessar todas as tags <p> e testar seu conteúdo com um regex ligeiramente, digamos assim, complicado:

pattern = r"([\w\s]+)\(dir\. ([\w\s]+) \| ([\w\s]+) \| (\d{4}) \| (\d+ min)\)(.*?)((?:\d{1,2} de [a-z]+ \| [\w\-]+ \| \d{1,2}[hH]\s*)+)"

Você pode brincar com esse regex usando o regex101, por esse link: https://regex101.com/r/gJTkJl/1.

Conclusão: A raspagem depende da padronização dos dados, e situações como essas, onde o formato pode variar entre as postagens, é uma grande dor de cabeça.

Gerando o projeto

Convido-os a analisar o código, que é aberto e está no GitHub, nesse repositório: https://github.com/guites/cinemaempoa

Obrigado pela atenção!