3 votes

Téléchargez des fichiers bs4 même avec des clics jQuery

Je suis en train d'essayer d'automatiser le téléchargement de sous-titres à partir d'un site web public. Les sous-titres sont accessibles une fois que vous cliquez sur le lien de téléchargement (Descargar en espagnol). En inspectant le code du site web, je peux voir que les liens sont des événements jQuery:

entrez la description de l'image ici

Il y a une fonction à l'intérieur de cet événement qui, je suppose, gère le téléchargement (je ne suis pas du tout familier avec JS):

function(a) {
  if (ajaxflagon()) return !1;
  var r = $(this).attr("rel");
  if (r = r.split(","), 3 == r.length) var e = "/updated/" + r[0] + "/" + r[1] + "/" + r[2];
  else var e = "/original/" + r[0] + "/" + r[1];
  ga("send", "pageview", "/" + e, {
    title: "Descargando " + $(this).attr("title")
  }), $(this).attr("href", e), ajaxflagoff()
}

Jusqu'à présent, j'ai du code qui trouve les liens appropriés:

import urllib.request as urlRequest
from bs4 import BeautifulSoup

# Sous-titres pour une série télévisée spécifique
urlpage = 'https://www.tusubtitulo.com/season/4674/1'
# prétendre être un navigateur chrome 47 sur un ordinateur windows 10
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)"
}
req = urlRequest.Request(urlpage, headers=headers)
# ouvrir l'URL
url = urlRequest.urlopen(req)
# obtenir le code source
source_code = url.read()

# analyser le HTML en utilisant beautiful soup et stocker dans la variable 'soup'
soup = BeautifulSoup(source_code, 'html.parser')

results = []
for lang in soup.findAll("td", class_="language"):
    # seulement intéressé par la langue espagnole
    if "Español (España)" in str(lang):
        for element in lang.parent.findAll("a", class_="bt_descarga"):
            results.append(element)

Il manque la partie téléchargement :( Comment puis-je le faire?

Merci d'avance.

3voto

baduker Points 1223

Vous pouvez implémenter cette fonction d'événement JS en Python et créer les URLs de téléchargement.

Enfin, en utilisant les URLs, vous pouvez télécharger les sous-titres.

Voici comment obtenir uniquement les sous-titres en espagnol :

from shutil import copyfileobj

import requests
from bs4 import BeautifulSoup

base_url = "https://www.tusubtitulo.com"
season = "/season/4674/1"

headers = {
    "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:95.0) Gecko/20100101 Firefox/95.0",
    "Referer": f"{base_url}{season}",
}

def get_rel_attributes(page: str):
    return [
        a["rel"][0] for a in
        BeautifulSoup(page, "lxml").select(".bt_descarga")[1::3]  # cela ne récupère que les sous-titres en espagnol
    ]

# Ceci est la fonction JS traduite en Python qui est responsable de
# construire les URLs de téléchargement des sous-titres.
def get_download_urls(rel_attributes: list):
    src_urls = []
    for item in rel_attributes:
        elements = item.split(",")
        one, two, three = elements
        if len(elements) == 3:
            src_urls.append(f"{base_url}/updated/{one}/{two}/{three}")
        else:
            src_urls.append(f"{base_url}/original/{one}/{two}")
    return src_urls

def downloader(target_url: str, conn: requests.Session):
    response = conn.get(target_url, headers=headers, stream=True)
    file_name = (
        response.headers["Content-Disposition"]
        .split("=", -1)[-1]
        .replace('"', "")
        .encode('latin-1')
        .decode('utf-8')
    )
    print(f"Téléchargement de {file_name}...")
    with open(file_name, "wb") as output:
        copyfileobj(response.raw, output)

if __name__ == "__main__":
    with requests.Session() as connection:
        source_page = connection.get(f"{base_url}{season}", headers=headers).text

    for url in get_download_urls(get_rel_attributes(source_page)):
        downloader(url, connection)

Vous devriez obtenir cette sortie et 10 fichiers dans le dossier où vous exécutez le script :

Téléchargement de Invasion (2021) 1x01 - Last Day (Español (España)).srt...
Téléchargement de Invasion (2021) 1x02 - Crash (Español (España)).srt...
Téléchargement de Invasion (2021) 1x03 - Orion (Español (España)).srt...
Téléchargement de Invasion (2021) 1x04 - The King is Dead (Español (Latinoamérica)).srt...
Téléchargement de Invasion (2021) 1x05 - Going Home (Español (España)).srt...
Téléchargement de Invasion (2021) 1x06 - Home Invasion (Español (España)).srt...
Téléchargement de Invasion (2021) 1x07 - Hope (Español (España)).srt...
Téléchargement de Invasion (2021) 1x08 - Contact (Español (España)).srt...
Téléchargement de Invasion (2021) 1x09 - Full of Stars (Español (España)).srt...
Téléchargement de Invasion (2021) 1x10 - First Day (Español (España)).srt...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X