Python - Raschia i titoli dei film con Splash e BS4

Nov 14 2020

Provo a creare il mio primo script con Python. Sto usando Splash e BS4.

Ho seguito questo tutorial di John Watson Rooney (ma con il mio obiettivo): How I Scrape JAVASCRIPT website with Python

Il mio obiettivo è raccogliere questo sondaggio sul sito Web: i migliori film del 2020

Ecco il mio problema: rende più volte gli stessi titoli ma con un massimo di 6 duplicati nell'elenco senza alcun ordine logico. A volte rende meno di 100 righe, a volte più?

Quello che voglio :

  • Ottieni i 100 titoli, in ordine
  • Esportali in un formato .csv.

Ecco il mio codice:

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)

Domande :

  • Come posso rottamare solo i 100 titoli? Cosa mi sono perso?
  • Il mio codice è corretto, come posso ottimizzarlo?
  • Splash è davvero buono per il mio uso o esiste un'altra libreria più semplice per eliminare il sito Web JS?

Per la parte .csv, proverò da solo adesso, ma se hai qualche consiglio, sto sentendo ovviamente!

Grazie per l'aiuto.

Risposte

1 baduker Nov 14 2020 at 19:07

Le pagine vengono effettivamente caricate dinamicamente, almeno i prossimi 50 film, quindi devi fare una richiesta a un endpoint diverso.

Ecco come:

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)

Produzione:

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

I film sono in ordine, comunque.