Cómo obtener todos los enlaces del sitio web usando Beautiful Soup (python) recursivamente

Quiero poder obtener recursivamente todos los enlaces de un sitio web, seguirlos y obtener todos los enlaces de esos sitios. La profundidad debe ser 5-10 para que devuelva una matriz de todos los enlaces que encuentre. Preferiblemente usando sopa hermosa / python. ¡Gracias!

He intentado esto hasta ahora y no está funcionando … cualquier ayuda será apreciada.

from BeautifulSoup import BeautifulSoup import urllib2 def getLinks(url): if (len(url)==0): return [url] else: files = [ ] page=urllib2.urlopen(url) soup=BeautifulSoup(page.read()) universities=soup.findAll('a',{'class':'institution'}) for eachuniversity in universities: files+=getLinks(eachuniversity['href']) return files print getLinks("http://www.utexas.edu/world/univ/alpha/") 

Los algoritmos recursivos se utilizan para reducir los problemas grandes a los más pequeños que tienen la misma estructura y luego combinan los resultados. A menudo están compuestos por un caso base que no conduce a la recursión y otro caso que conduce a la recursión. Por ejemplo, digamos que naciste en 1986 y quieres calcular tu edad. Podrías escribir:

 def myAge(currentyear): if currentyear == 1986: #Base case, does not lead to recursion. return 0 else: #Leads to recursion return 1+myAge(currentyear-1) 

Yo mismo, realmente no veo el punto en usar recursión en tu problema. Mi sugerencia es primero que pongas un límite en tu código. Lo que nos dio solo se ejecutará infinitamente, porque el progtwig se atasca en infinitos nesteds para bucles; nunca llega a su fin y comienza a volver. Por lo tanto, puede tener una variable fuera de la función que se actualiza cada vez que baja un nivel y, en cierto punto, impide que la función inicie un nuevo bucle for y comience a devolver lo que ha encontrado.

Pero luego estás cambiando las variables globales, estás usando la recursión de una manera extraña y el código se vuelve desordenado.

Ahora, leer los comentarios y ver lo que realmente desea, lo que, debo decir, no está muy claro, puede usar la ayuda de un algoritmo recursivo en su código, pero no escribir todo de forma recursiva.

 def recursiveUrl(url,depth): if depth == 5: return url else: page=urllib2.urlopen(url) soup = BeautifulSoup(page.read()) newlink = soup.find('a') #find just the first one if len(newlink) == 0: return url else: return url, recursiveUrl(newlink,depth+1) def getLinks(url): page=urllib2.urlopen(url) soup = BeautifulSoup(page.read()) links = soup.find_all('a', {'class':'institution'}) for link in links: links.append(recursiveUrl(link,0)) return links 

Ahora todavía hay un problema con esto: los enlaces no siempre están vinculados a páginas web, sino también a archivos e imágenes. Es por eso que escribí la statement if / else en la parte recursiva de la función de ‘apertura de URL’. El otro problema es que su primer sitio web tiene 2166 enlaces a instituciones, y crear 2166 * 5 beautifulSoups no es rápido. El código anterior ejecuta una función recursiva 2166 veces. Eso no debería ser un problema, pero estás tratando con grandes archivos html (o php lo que sea), por lo que hacer una sopa de 2166 * 5 lleva una gran cantidad de tiempo.

el número de páginas de rastreo boostá de manera exponencial, hay muchos problemas involucrados que pueden no parecer complicados a primera vista; consulte la descripción general de la architecture de recortes para tener una idea de cómo se debe hacer en la vida real

introduzca la descripción de la imagen aquí

entre otras funciones excelentes, scrapy no repetirá el rastreo de las mismas páginas (a menos que lo fuerce) y se puede configurar para obtener el máximo DEPTH_LIMIT

aún mejor, scrapy tiene herramientas de extracción de enlaces integradas.