Python - ขูดชื่อภาพยนตร์ด้วย Splash & BS4

Nov 14 2020

ฉันพยายามสร้างสคริปต์แรกด้วย Python ฉันใช้ Splash และ BS4

ฉันทำตามบทช่วยสอนนี้จาก John Watson Rooney (แต่มีเป้าหมายของฉันเอง): ฉันจะขูดเว็บไซต์ JAVASCRIPT ด้วย Python ได้อย่างไร

เป้าหมายของฉันคือการรวบรวมแบบสำรวจเว็บไซต์นี้: ภาพยนตร์ที่ดีที่สุดของปี 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...

ภาพยนตร์เป็นไปตามลำดับโดยวิธีการ