Python-Splash & BS4로 영화 타이틀 긁기

Nov 14 2020

Python으로 첫 번째 스크립트를 작성하려고합니다. 저는 Splash와 BS4를 사용하고 있습니다.

나는 John Watson Rooney의이 튜토리얼을 따랐습니다 (그러나 내 자신의 목표와 함께) : Python으로 JAVASCRIPT 웹 사이트를 스크랩하는 방법

내 목표는이 웹 사이트 설문 조사를 긁어내는 것입니다 : 2020 년 최고의 영화

내 문제는 다음과 같습니다. 동일한 제목을 여러 번 렌더링하지만 논리적 순서없이 목록에 최대 6 개의 중복이 있습니다. 때로는 100 줄 미만, 때로는 더 많이 렌더링합니까?

내가 원하는 것 :

  • 순서대로 100 개의 타이틀을 받으세요
  • .csv 형식으로 내 보냅니다.

내 코드는 다음과 같습니다.

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)

질문 :

  • 100 개의 타이틀 만 스크랩하려면 어떻게해야합니까? 내가 무엇을 놓쳤습니까?
  • 내 코드가 맞습니까? 어떻게 최적화 할 수 있습니까?
  • Splash가 내 사용에 정말 좋은가요, 아니면 JS 웹 사이트를 스크랩하기 쉬운 또 다른 라이브러리가 있습니까?

.csv 부분에 대해서는 지금 혼자서 시도해 보겠습니다 만, 팁이 있으면 당연히 들었습니다!

도와 주셔서 감사합니다.

답변

1 baduker Nov 14 2020 at 19:07

페이지는 실제로 동적으로로드됩니다 (최소한 다음 50 개 영화). 따라서 다른 엔드 포인트에 요청해야합니다.

방법은 다음과 같습니다.

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)

산출:

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

그런데 영화는 순서대로되어 있습니다.