【问题标题】:Python - Scrape movies titles with Splash & BS4Python - 使用 Splash 和 BS4 刮取电影标题
【发布时间】:2021-02-21 05:34:11
【问题描述】:

我尝试使用 Python 创建我的第一个脚本。我正在使用 Splash 和 BS4。

我按照约翰·沃森·鲁尼 (John Watson Rooney) 的教程学习(但有自己的目标):How I Scrape JAVASCRIPT websites with Python

我的目标是抓取这个网站调查:Best movies of 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 部分,我现在将自己尝试,但如果您有任何提示,我当然会听到!

感谢您的帮助。

【问题讨论】:

  • 这是“废品”,而不是“废品”。 “报废”是您对不再可修理的旧车所做的处理。
  • 对不起,我不是英语本地人。谢谢指正。

标签: python web-scraping beautifulsoup


【解决方案1】:

页面实际上是动态加载的,至少是接下来的 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...

顺便说一句,电影是按顺序排列的。

【讨论】:

  • 你好,巴杜克。您的代码工作正常,我只是放 range(1, 2) 因为您说 1 页 = 50 部电影。但是我有一些问题要了解您是如何完成并编写它的: 1. 我知道它是动态的,但我不知道这个端点。您是如何找到它的(我的意思是,您如何继续找到它,并且知道它来自 ajax)? 2. 为什么要在 url 前面加上 -f ? 3. 为什么 range(1,3) 和 {page} ? {page} 是否被循环中的范围修改:page-1、page-2、page-3,对吗?谢谢
  • 你不是在你的问题中说你想要 100 个标题吗?如果是这样,您需要遍历 两个 页面,因此需要 range(1, 3)。为什么3?因为 Python 的 range 停止值包含在内。例如,这个range(1,2) 将只产生1。测试它print(list(range(1, 2)))。我从浏览器开发者工具 -> 网络 - XHR 获得了 API 端点。字符串前面的f 是Python 的字符串插值。最后,如果您发现我的回答有用,请考虑投票和/或接受它。 stackoverflow.com/help/someone-answers
猜你喜欢
  • 2016-11-29
  • 1970-01-01
  • 2021-11-11
  • 2021-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多