es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Python: Cómo realizar solicitudes paralelas para minimizar los tiempos?

Soy traductor de español que traduce documentos de TI. Traduzco lo siguiente al español. No traduzca el código y la salida en markdown

Soy muy nuevo en la programación y en las reglas de Stack Overflow en particular.

Por favor, avísenme si me falta alguna información importante que deba indicar en mi pregunta.

Estoy buscando una solución sencilla para paralelizar mis solicitudes GET utilizando el módulo selenium en Python.

Tengo una lista de 10,000 enlaces web de restaurantes en tripadvisor.com. Quiero que mi script obtenga datos HTML de cada enlace y encuentre un texto bajo cierto nombre de clase HTML. Al final, mi script debe tomar cada texto obtenido y colocarlo en un diccionario junto con el enlace de la lista.

Enviar solicitudes GET secuencialmente enlace por enlace llevará demasiado tiempo.

¿Cómo puedo paralelizar estas solicitudes para minimizar el tiempo?

Ahora mi código se ve así:

from selenium import webdriver

# PATH = 'ruta al controlador'

driver = webdriver.Chrome(executable_path=PATH)

nans_dict = {}

for i in nans_list:
    a = []
    driver.get('https://www.tripadvisor.com' + i)
    for element in driver.find_elements_by_class_name('drUyy'):
        a.append(element.text + ' ')
        nans_dict[i] = a

Gracias por las respuestas detalladas de antemano.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Hola,

    ¡Bienvenido a Stackoverflow! Para optimizar el rendimiento de tu script mediante la paralelización de tus solicitudes GET utilizando Selenium, puedes aprovechar el módulo de multiprocesamiento incorporado de Python.

    Aquí tienes una posible solución:

    1. Comienza importando los módulos necesarios:
    from multiprocessing import Pool
    from selenium import webdriver
    
    1. Define una función para manejar las solicitudes GET de cada enlace:
    def get_text(link):
        driver = webdriver.Chrome(executable_path=PATH)
        driver.get('https://www.tripadvisor.com/' + link)
        text = ''
        for element in driver.find_elements_by_class_name('drUyy'):
            text += element.text + ' '
        return text
    

    Esta función recibe un solo enlace de la lista e inicializa una nueva instancia del controlador Chrome webdriver. Luego navega hasta el enlace, obtiene el texto deseado y lo devuelve.

    1. Paraleliza las solicitudes utilizando el objeto Pool:
    if __name__ == '__main__':
        nans_dict = {}
        with Pool(processes=4) as pool:  # ajusta el número de procesos según tu máquina
            results = pool.map(get_text, nans_list)
        for i, text in zip(nans_list, results):
            nans_dict[i] = text
    

    El objeto Pool genera un número especificado de procesos de trabajo, cada uno de los cuales manejará un enlace de la lista. La función map() distribuye la lista de enlaces entre los procesos de trabajo, aplica la función get_text() a cada enlace y devuelve una lista con todos los textos resultantes. Luego, se utiliza esta lista resultante para poblar el nans_dict.

    Espero que esto te sea de ayuda. No dudes en hacer preguntas de seguimiento si algo no queda claro.

Comments are closed.