Se olhar para o código-fonte da página anterior, verá que é possível encontrar os nomes dos filmes e a sua classificação. Felizmente para nós, o RottenTomatoes não carrega a lista de filmes dinamicamente, pelo que podemos avançar e extrair as informações necessárias.
Primeiro, inspecionamos a página e verificamos como o HTML está estruturado. Para isso, pode clicar com o botão direito do rato no título de um filme e selecionar a opção «Inspecionar Elemento». Deverá aparecer a seguinte janela:
Usei a linha vermelha para destacar as informações úteis desta imagem. Pode ver que a página apresenta os filmes mais populares numa tabela e que existem quatro células em cada linha da tabela (elemento <tr>).
A primeira célula contém a posição do filme, a segunda tem informações sobre as classificações (elemento com a classe tMeterScore), a terceira inclui o título do filme e a última célula dá-nos o número de críticas.
Conhecendo esta estrutura, podemos agora começar a extrair as informações de que precisamos.
import requests
from bs4 import BeautifulSoup
links_base = 'https://www.rottentomatoes.com'
scraped_url = 'https://www.rottentomatoes.com/top/bestofrt/'
page = requests.get(scraped_url)
soup = BeautifulSoup(page.content, 'html.parser')
table = soup.find("table", class_="table") # We extract just the table code from the entire page
rows = table.findAll("tr") # This will extract each table row, in an array
movies = []
for index, row in enumerate(rows):
if index > 0: # We skip the first row since this row only contains the column names
link = row.find("a") # We get the link from the table row
rating = row.find(class_="tMeterScore") # We get the element with the class tMeterScore from the table row
movies.append({
"link": links_base + link.get('href'), # The href attribute of the link
"title": link.string.strip(), # The strip function removes blank spaces at the beginning and the end of a string
"rating": rating.string.strip().replace(" ", ""), # We remove from the string and the blank spaces
})
print(movies)
Ao executar este código, deverá obter um resultado como este:
Neste exemplo, estamos a extrair o conteúdo da tabela e a percorrer as linhas da tabela. Uma vez que a primeira linha contém apenas os nomes das colunas, vamos ignorá-la.
Nas restantes linhas, continuamos o processo extraindo o elemento âncora (<a>) e o elemento span com a classe “tMeterScore”. Com eles, podemos agora recuperar a informação necessária.
O título do filme está dentro do elemento âncora, o link é o atributo “href” da âncora e a classificação está dentro do elemento span com a classe “tMeterScore”. Basta criar um novo dicionário para cada linha e anexá-lo à nossa lista de filmes.