Scraping Links di Pagine Javascript con Selenium

24 Febbraio 2025 di Daniele Frulla


Proprio in questo momento il linguaggio di programmazione piu’ utilizzato è javascript.

Con javascript riesci a fare praticamente tutto, e svincoli il tuo server da operazioni tediose.

Lo svantaggio che si ha è che consultazione della pagina tramite uno script automatico, come può essere un test è faticosa da fare. Ad esempio, uno script che cerca i links su pagine web javascript come scraping links paralax sarebbe insuffiente se la pagina restituisse links tramite codice javascript.

Per la consultazione di queste pagine in maniera automatica occorre simulare un browser che esegua a runtime i comandi javascript.

Scraping Url With Code Javascript

Diversi sono i tools che simulano comandi di un browser, in particolare mi sono soffermato su Selenium.

Pagina Web Javascript

Creiamo anzitutto una pagina web chiamata example_js_links.html:

<!DOCTYPE html>
<html lang="it">
<head>
    <meta charset="UTF-8">
    <title>Pagina con Link Generati da JavaScript</title>
</head>
<body>
    <h1>Link Generati da JavaScript</h1>
    <div id="linkContainer"></div>
    <a href="https://example.com">Link non javascript</a>

    <script>
        // Array di oggetti link
        const links = [
            { text: "Google", url: "https://www.google.com" },
            { text: "YouTube", url: "https://www.youtube.com" },
            { text: "Wikipedia", url: "https://www.wikipedia.org" }
        ];

        // Riferimento al contenitore dei link
        const linkContainer = document.getElementById("linkContainer");

        // Funzione per creare e aggiungere i link
        links.forEach(link => {
            const anchor = document.createElement("a");
            anchor.href = link.url;
            anchor.textContent = link.text;
            anchor.target = "_blank"; // Apre il link in una nuova scheda
            linkContainer.appendChild(anchor);
            linkContainer.appendChild(document.createElement("br")); 
        });
    </script>
</body>
</html>

Come si può notare la pagina ha un link reale e 3 links creati tramite script javascript.

Ricerca Senza Javascript

Uno script senza ricerca in javascript runtime potrebbe essere il file seguente in Python get_links.py:

import requests
from bs4 import BeautifulSoup

# URL della pagina
url = "http://web/example_js_link.html"

# Effettua la richiesta HTTP alla pagina
response = requests.get(url)

# Verifica se la richiesta ha avuto successo
if response.status_code == 200:
    # Analizza il contenuto HTML della pagina
    soup = BeautifulSoup(response.text, 'html.parser')

    # Trova tutti gli elementi <a> (link)
    links = soup.find_all('a')

    # Stampa il testo e l'URL di ogni link
    for link in links:
        print(f"Testo: {link.text}, URL: {link.get('href')}")
else:
    print(f"Errore: Impossibile accedere alla pagina (status code: {response.status_code})")

L’avevamo già fatto lo scraping di links in parallelo, questo è solo un esempio che restituirà solamente il link che non è stato creato con javascript.

Ricerca Con Javascript Runtime Selenium

Ora facciamo di piu’, dobbiamo laciare un driver web per simulare un browser, consultare la pagina e restituire così tutti i links, anche quelli creati tramite javascript.

Come al solito creiamo il file get_links_js.py:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from webdriver_manager.chrome import ChromeDriverManager

# Configura opzioni per ChromeDriver
chrome_options = Options()
chrome_options.add_argument("--headless")  # Esegue il browser in modalità headless
chrome_options.add_argument("--no-sandbox")
chrome_options.add_argument("--disable-dev-shm-usage")
chrome_options.add_argument("--disable-gpu")
chrome_options.add_argument("--remote-debugging-port=9222")

# Inizializza il driver di Chrome
chrome = webdriver.Chrome( options=chrome_options)

try:
    # Carica la pagina
    chrome.get("http://web/example_js_link.html")

    # Trova tutti i link sulla pagina
    links = chrome.find_elements(By.TAG_NAME, "a")

    # Stampa il testo e l'URL di ogni link
    for link in links:
        print(f"Testo: {link.text}, URL: {link.get_attribute('href')}")
finally:
    # Chiude il browser
    chrome.quit()

Come noterai il risulta è diverso. Anche se più lentamente, come un browser, Selenium ha cercato tutti i links compresi quelli che si sono stati generati in runtime con il codice javascript.

Conclusioni

Per fare un buon lavoro di scraping non si può più semplicemente ottenere la pagina html e ricercare codice all’interno, ma occorre ricercare la pagina con un browser eseguendo codice javascript all’interno della stessa.

L’esecuzione sarà più lenta, ma non ci perderemo eventuale creazioni di codice html tramite javascript, ormai di consueto uso.

Tutto il codice per lo scraping tutorial javascript.

Related Posts


Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *


Copyright di Caterina Mezzapelle Part. I.V.A. 02413940814 - R.E.A. 191812