Python - raspe títulos de filmes com Splash e BS4

Nov 14 2020

Tento criar meu primeiro script com Python. Estou usando Splash e BS4.

Eu segui este tutorial de John Watson Rooney (mas com meu próprio destino): Como faço a varredura de sites JAVASCRIPT com Python

Meu objetivo é raspar esta pesquisa do site: Melhores filmes de 2020

Aqui está o meu problema: ele renderiza várias vezes os mesmos títulos, mas com até 6 duplicatas na lista sem qualquer ordem lógica. Às vezes, ele renderiza menos de 100 linhas, às vezes mais?

O que eu quero :

  • Obtenha os 100 títulos, por pedido
  • Exporte-os em formato .csv.

Aqui está o meu código:

import requests
import csv
from bs4 import BeautifulSoup

url = 'https://www.senscritique.com/top/resultats/Les_meilleurs_films_de_2020/2582670'

r = requests.get('http://localhost:8050/render.html',
                 params={'url': url, 'wait': 2})

soup = BeautifulSoup(r.text, 'html.parser')

podium = soup.find_all('li', class_="elpo-item")
podium_list = []

for titres in podium:
    for titles in soup.find_all('h2'):
        podium_list.append(titles.text)

for liste in podium_list:
    print(liste)

Questões :

  • Como posso descartar apenas os 100 títulos? O que eu perdi?
  • Meu código está correto, como posso otimizá-lo?
  • O Splash é realmente bom para meu uso ou existe outra biblioteca mais fácil para descartar o site JS?

Para a parte .csv, vou tentar sozinho agora, mas se você tiver alguma dica, estou ouvindo é claro!

Obrigado pela ajuda.

Respostas

1 baduker Nov 14 2020 at 19:07

As páginas são realmente carregadas dinamicamente, pelo menos os próximos 50 filmes, então você precisa fazer uma solicitação para um endpoint diferente.

Veja como:

import requests
from bs4 import BeautifulSoup


headers = {
    "Referer": "https://www.senscritique.com/top/resultats/Les_meilleurs_films_de_2020/2582670",
    "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36",
    "X-Requested-With": "XMLHttpRequest",
}

titles = []
for page in range(1, 3):
    url = f"https://www.senscritique.com/sc2/top/resultats/2582670/page-{page}.ajax?limit=1000"
    soup = BeautifulSoup(requests.get(url, headers=headers).text, "html.parser").find_all("li", {"class": "elpo-item"})
    titles.extend(i.find("h2").getText(strip=True).replace("(2020)", "") for i in soup)

for title in titles:
    print(title)

Resultado:

1917
Jojo Rabbit
The Gentlemen
Uncut Gems
Tenet
Le Cas Richard Jewell
Dark Waters
En avant
Drunk
Les Filles du docteur March
Adieu les cons
Invisible Man
Play
Les Enfants du temps
L'Adieu
La Plateforme
Séjour dans les monts Fuchun
The King of Staten Island
Été 85
Birds of Prey (et la Fantabuleuse Histoire de Harley Quinn)
La Communion
and so on...

Os filmes estão em ordem, a propósito.