Python - Grattez les titres de films avec Splash et BS4

Nov 14 2020

J'essaye de créer mon premier script avec Python. J'utilise Splash et BS4.

J'ai suivi ce tutoriel de John Watson Rooney (mais avec ma propre cible): Comment je gratte les sites Web JAVASCRIPT avec Python

Mon objectif est de gratter cette enquête sur le site Web: Meilleurs films de 2020

Voici mon problème: il rend plusieurs fois les mêmes titres mais avec jusqu'à 6 doublons dans la liste sans aucun ordre logique. Parfois, il rend moins de 100 lignes, parfois plus?

Ce que je veux :

  • Obtenez les 100 titres, par commande
  • Exportez-les au format .csv.

Voici mon code:

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)

Des questions :

  • Comment puis-je supprimer uniquement les 100 titres? Qu'est-ce que j'ai manqué?
  • Mon code est-il correct, comment puis-je l'optimiser?
  • Splash est-il vraiment bon pour mon utilisation, ou existe-t-il une autre bibliothèque plus simple pour supprimer le site Web JS?

Pour la partie .csv, je vais essayer par moi-même tout de suite, mais si vous avez des conseils, j'entends bien sûr!

Merci de votre aide.

Réponses

1 baduker Nov 14 2020 at 19:07

Les pages sont en fait chargées dynamiquement, au moins les 50 films suivants, vous devez donc faire une demande à un autre point de terminaison.

Voici comment:

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)

Production:

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...

Les films sont en ordre, au fait.