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.

La búsqueda recursiva con BeautifulSoup es muy lenta.

Estoy construyendo un rastreador que descarga todos los archivos .pdf de un sitio web dado y sus subpáginas. Para ello, he utilizado funcionalidades incorporadas alrededor de la siguiente función recursiva simplificada que recupera todos los enlaces de una URL dada.

Sin embargo, esto se vuelve bastante lento a medida que recorre un sitio web dado (puede llevar 2 minutos o más por URL).
No puedo entender exactamente qué está causando esto y realmente apreciaría sugerencias sobre qué se debe cambiar para aumentar la velocidad.

import re
import requests
from bs4 import BeautifulSoup

pages = set()

def get_links(page_url):
  global pages
  pattern = re.compile("^(/)")
  html = requests.get(f"https://www.srs-stahl.de/{page_url}").text
  soup = BeautifulSoup(html, "html.parser")
  for link in soup.find_all("a", href=pattern):
    if "href" in link.attrs:
      if link.attrs["href"] not in pages:
        new_page = link.attrs["href"]
        print(new_page)
        pages.add(new_page)
        get_links(new_page)

get_links("")
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Hay varias posibles razones por las que el rastreador puede ser lento. Aquí hay algunas sugerencias:

    1. Mejorar la expresión regular utilizada para filtrar enlaces: la expresión regular actual ^(/) solo coincide con enlaces que comienzan con “/”, lo que puede omitir algunos enlaces relevantes para descargar archivos PDF. Podrías considerar usar una expresión regular más genérica como (pdf) que coincida con todos los enlaces que contengan la palabra clave “pdf”. Esto permitiría una búsqueda más amplia y podría aumentar el número de enlaces relevantes encontrados.

    2. Optimizar las solicitudes realizadas al sitio web: el código actualmente realiza una nueva solicitud para cada enlace encontrado, lo que puede ser costoso y aumentar el tiempo de rastreo. Podrías considerar crear un grupo de solicitudes o una cola para manejar múltiples solicitudes a la vez, o utilizar una API para obtener información sobre varios enlaces a la vez.

    3. Reducir el alcance de la búsqueda: la implementación actual busca todas las subpáginas del sitio web, lo que puede ser demasiado amplio para algunos casos de uso. Podrías considerar limitar el alcance del rastreo a un directorio específico o a una cierta profundidad en la jerarquía del sitio web.

    4. Modificar el comportamiento del rastreador: como el código es recursivo, podría quedar atrapado en un bucle infinito o visitar URL redundantes varias veces. Podrías considerar agregar comprobaciones adicionales para evitar visitar URL redundantes o agregar un límite de tiempo para limitar el tiempo dedicado a una URL en particular.

Comments are closed.