Python - Scrape títulos de películas con Splash y BS4
Intento crear mi primer script con Python. Estoy usando Splash y BS4.
Seguí este tutorial de John Watson Rooney (pero con mi propio objetivo): Cómo raspar sitios web JAVASCRIPT con Python
Mi objetivo es raspar esta encuesta del sitio web: Las mejores películas de 2020
Aquí está mi problema: renderiza varias veces los mismos títulos pero con hasta 6 duplicados en la lista sin ningún orden lógico. ¿A veces representa menos de 100 líneas, a veces más?
Lo que quiero :
- Consigue los 100 títulos, por pedido
- Exportarlos en formato .csv.
Aquí está mi 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)
Preguntas:
- ¿Cómo puedo eliminar solo los 100 títulos? ¿Qué me perdí?
- ¿Mi código es correcto, cómo puedo optimizarlo?
- ¿Splash es realmente bueno para mi uso, o hay otra biblioteca más fácil para eliminar el sitio web de JS?
Para la parte .csv, voy a intentarlo por mí mismo ahora mismo, pero si tienes algún consejo, ¡lo estoy escuchando, por supuesto!
Gracias por tu ayuda.
Respuestas
En realidad, las páginas se cargan dinámicamente, al menos las siguientes 50 películas, por lo que debe realizar una solicitud a un punto final diferente.
Así es cómo:
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)
Salida:
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...
Las películas están en orden, por cierto.