Python - Scrape-Filmtitel mit Splash & BS4
Ich versuche mein erstes Skript mit Python zu erstellen. Ich benutze Splash und BS4.
Ich folgte diesem Tutorial von John Watson Rooney (aber mit meinem eigenen Ziel): Wie ich JAVASCRIPT-Websites mit Python kratzt
Mein Ziel ist es, diese Website-Umfrage zu kratzen: Die besten Filme des Jahres 2020
Hier ist mein Problem: Es werden mehrfach dieselben Titel gerendert, jedoch mit bis zu 6 Duplikaten in der Liste ohne logische Reihenfolge. Manchmal werden weniger als 100 Zeilen gerendert, manchmal mehr?
Was ich will :
- Holen Sie sich die 100 Titel auf Bestellung
- Exportieren Sie sie in ein CSV-Format.
Hier ist mein 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)
Fragen :
- Wie kann ich nur die 100 Titel verschrotten? Was habe ich vermisst?
- Ist mein Code richtig, wie kann ich ihn optimieren?
- Ist Splash wirklich gut für mich oder gibt es eine andere einfachere Bibliothek, um JS-Websites zu verschrotten?
Für den CSV-Teil werde ich es jetzt selbst versuchen, aber wenn Sie irgendwelche Tipps haben, höre ich natürlich!
Danke für deine Hilfe.
Antworten
Die Seiten werden tatsächlich dynamisch geladen, mindestens die nächsten 50 Filme, sodass Sie eine Anfrage an einen anderen Endpunkt stellen müssen.
Hier ist wie:
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)
Ausgabe:
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...
Die Filme sind übrigens in Ordnung.