Python - Đánh dấu tiêu đề phim với Splash & BS4
Tôi cố gắng tạo tập lệnh đầu tiên của mình bằng Python. Tôi đang sử dụng Splash và BS4.
Tôi đã làm theo hướng dẫn này từ John Watson Rooney (nhưng với mục tiêu của riêng tôi): Cách tôi cạo các trang web JAVASCRIPT bằng Python
Mục tiêu của tôi là hoàn thành cuộc khảo sát trên trang web này: Phim hay nhất năm 2020
Đây là vấn đề của tôi: Nó hiển thị nhiều lần các tiêu đề giống nhau nhưng có tới 6 bản sao trong danh sách mà không có bất kỳ thứ tự hợp lý nào. Đôi khi nó hiển thị ít hơn 100 dòng, đôi khi nhiều hơn?
Những gì tôi muốn :
- Nhận 100 đầu sách, theo đơn đặt hàng
- Xuất chúng ở định dạng .csv.
Đây là mã của tôi:
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)
Câu hỏi:
- Làm cách nào tôi có thể loại bỏ chỉ 100 đầu sách? Tôi đã bỏ lỡ điều gì?
- Mã của tôi có đúng không, làm cách nào để tôi có thể tối ưu hóa nó?
- Splash có thực sự tốt cho việc sử dụng của tôi hay có một thư viện khác dễ dàng hơn để loại bỏ trang web JS?
Đối với phần .csv, tôi sẽ thử một mình ngay bây giờ, nhưng nếu bạn có bất kỳ mẹo nào, tất nhiên tôi sẽ nghe thấy!
Cảm ơn sự giúp đỡ của bạn.
Trả lời
Các trang thực sự được tải động, ít nhất là 50 phim tiếp theo, vì vậy bạn phải thực hiện yêu cầu đến một điểm cuối khác.
Đây là cách thực hiện:
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)
Đầu ra:
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...
Nhân tiện, các bộ phim được sắp xếp theo thứ tự.