通过单击带有硒的按钮来抓取文本

问题描述 投票:0回答:1

我想用硒抓取一些文本数据,我自己抓取页面没有问题,但我需要单击一个按钮来提取完整的文章,我只有主页上的标题,然后我应该去到主网址的下一页并继续抓取

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time

import time
import pandas as pd

# Crea un'istanza del driver del browser
driver = webdriver.Chrome()

# URL del sito web da cui desideri effettuare il click
url = "https://www.beniculturali.it/comunicati/notizie-del-giorno"

# Apri il sito web nel browser
driver.get(url)

# Imposta un intervallo di attesa esplicito per 5 secondi per garantire che la pagina sia completamente caricata
driver.implicitly_wait(5)
try:
    cookie_banner = driver.find_element_by_class_name("cookiesjsr-banner")
    cookie_banner.click()  # Proviamo a fare clic sul banner dei cookie
except:
    pass  # Se il banner dei cookie non è presente o non può essere cliccato, passiamo avanti

# Trova tutti gli elementi "Continua a leggere"
elements = driver.find_elements(By.XPATH, "/html/body/section/section/div[1]/div[1]/div/div/div[3]/div[4]/a/svg/use")
print(elements)
# Lista per memorizzare i dati estratti
data = []

# Clicca su ciascun elemento
for element in elements:
    try:
        # Puoi provare ad eseguire uno scroll fino all'elemento prima di fare clic su di esso
        driver.execute_script("arguments[0].scrollIntoView();", element)
        time.sleep(1)  # Attendi un secondo dopo lo scroll
        # Ottieni URL e titolo dell'articolo
        article_url = element.get_attribute("href")
        article_title = element.find_element(By.XPATH, "/html/body/section/section/div[1]/div[1]/div/div/div[3]/h3/a").text
        # Clicca sull'elemento
        element.click()
        # Attendi un po' per il caricamento della pagina
        time.sleep(2)
        # Ottieni il contenuto della landing page di "Continua a leggere"
        article_content = driver.find_element(By.XPATH, "/html/body/div[2]/div[2]/div/div/article/div/div[2]/div[2]/section/div").text
        # Ottieni la data dell'articolo
        article_date = driver.find_element(By.XPATH, "/html/body/div[2]/div[1]/div[2]/div/div[2]/div/div/div[1]/div/time").text
        # Aggiungi i dati alla lista
        data.append({'Titolo': article_title, 'Data': article_date, 'URL': article_url, 'Contenuto': article_content})
        # Torna alla pagina precedente
        driver.back()
        # Imposta un intervallo di attesa esplicito per 5 secondi per garantire che la pagina sia completamente caricata
        driver.implicitly_wait(5)
    except Exception as e:
        print("Errore durante il clic sull'elemento:", str(e))

# Chiudi il browser
driver.quit()

# Costruisci un DataFrame Pandas con i dati estratti
df = pd.DataFrame(data)

# Visualizza il DataFrame
print(df)

这是我的代码,我可以获得帮助吗?

我想输出一个数据集,现在我没有任何错误,但数据集只是空的。

pandas dataframe selenium-webdriver web-scraping
1个回答
0
投票

请参阅下面的工作重构代码:

from selenium import webdriver
from selenium.webdriver.common.by import By
import pandas as pd

# Crea un'istanza del driver del browser
driver = webdriver.Chrome()

# URL del sito web da cui desideri effettuare il click
url = "https://www.beniculturali.it/comunicati/notizie-del-giorno"

# Apri il sito web nel browser
driver.get(url)
driver.maximize_window()

# Imposta un intervallo di attesa esplicito per 5 secondi per garantire che la pagina sia completamente caricata
driver.implicitly_wait(10)
try:
    cookie_banner = driver.find_element(By.XPATH, "//button[text()='Consenti tutti']")
    cookie_banner.click()  # Proviamo a fare clic sul banner dei cookie
except:
    pass  # Se il banner dei cookie non è presente o non può essere cliccato, passiamo avanti

# Trova tutti gli elementi "Continua a leggere"
elements = driver.find_elements(By.XPATH, "//div[@class='card-body d-flex flex-column p-4']")
# Lista per memorizzare i dati estratti
data = []

# Clicca su ciascun elemento
for index, element in enumerate(elements):
    try:
        # Puoi provare ad eseguire uno scroll fino all'elemento prima di fare clic su di esso
        driver.execute_script("arguments[0].scrollIntoView();", element)
        # time.sleep(1)  # Attendi un secondo dopo lo scroll
        # Ottieni URL e titolo dell'articolo
        article_url = driver.find_element(By.XPATH, "(//a[@class='text-white text-decoration-none'])["+str(index+1)+"]").get_attribute("href")
        article_title = element.find_element(By.XPATH, "(//a[@class='text-white text-decoration-none'])["+str(index+1)+"]").text
        # Attendi un po' per il caricamento della pagina
        # time.sleep(2)
        # Clicca sull'elemento
        driver.find_element(By.XPATH, "(//div[@class='card-body d-flex flex-column p-4']//span[text()='Continua a leggere'])["+str(index+1)+"]").click()
        # Ottieni il contenuto della landing page di "Continua a leggere"
        article_content = driver.find_element(By.XPATH, "/html/body/div[2]/div[2]/div/div/article/div/div[2]/div[2]/section/div").text
        # Ottieni la data dell'articolo
        article_date = driver.find_element(By.XPATH, "/html/body/div[2]/div[1]/div[2]/div/div[2]/div/div/div[1]/div/time").text
        # Aggiungi i dati alla lista
        data.append({'Titolo': article_title, 'Data': article_date, 'URL': article_url, 'Contenuto': article_content})
        # Torna alla pagina precedente
        driver.back()
    except Exception as e:
        print("Errore durante il clic sull'elemento:", str(e))

# Chiudi il browser
driver.quit()

# Costruisci un DataFrame Pandas con i dati estratti
df = pd.DataFrame(data)

# Visualizza il DataFrame
print(df)

结果:

                                              Titolo  ...                                          Contenuto
0   Su RAI Storia la quarta puntata di “Officina p...  ...  In onda, giovedì 28 marzo alle 23.10 in prima ...
1   Guglielmo Marconi, il genio che ha inventato i...  ...  Il 22 marzo alla Galleria Nazionale d’Arte Mod...
2   Avviso Pubblico di manifestazione d’interesse ...  ...  Il Parco archeologico del Colosseo ha pubblica...
3   San Vito al Torre, recuperato un monumento fun...  ...  Nel Comune di San Vito al Torre, nel greto del...
4   Capodimonte, il cordoglio del Museo per la sco...  ...  Il Direttore Eike Schmidt con tutto lo staff d...
5   Mostre, il 7 febbraio a Villa Farnesina inaugu...  ...  Organizzata anche con la collaborazione della ...
6   5x1000 A.F. 2024 - AVVISO APERTURA PORTALE ISC...  ...  Si avvisa che per le nuove iscrizioni relative...
7   Mostre, apre a Melfi “Capolavori in rilievo. I...  ...  Verrà inaugurato il 29 dicembre alle ore 18.00...
8   Con la presentazione del dipinto “La Circoncis...  ...  È con la presentazione del dipinto su tavola “...
9             Bando ecosistemi culturali: i vincitori  ...  I progetti valorizzeranno il patrimonio artist...
10  Casa di Dante, al via i lavori di restauro e v...  ...  Al via il primo intervento di restauro sul Pal...
11  Su RAI Storia la terza puntata di “Officina pa...  ...  Prosegue il viaggio di “Officina patrimonio”, ...
12  Annunciati i 28 progetti vincitori della 5. ed...  ...  I vincitori accedono al finanziamento di proge...
13  Direttore Generale per il supporto all'attuazi...  ...  Avviso pubblico per l’acquisizione di manifest...
14  Su RAI Storia la seconda puntata di “Officina ...  ...  Scoprire il patrimonio culturale significa sco...

[15 rows x 4 columns]

Process finished with exit code 0
© www.soinside.com 2019 - 2024. All rights reserved.