2013-11-25 7 views
7

Ich möchte rekursiv alle Links von einer Website erhalten, dann folgen Sie diesen Links und erhalten Sie alle Links von diesen Websites. Die Tiefe sollte 5-10 sein, damit sie ein Array aller gefundenen Links zurückgibt. Vorzugsweise mit schöner Suppe/Python. Vielen Dank!So erhalten Sie alle Links von der Website mit Beautiful Soup (Python) rekursiv

Ich habe dies bisher versucht und es funktioniert nicht .... jede Hilfe wird geschätzt.

+1

Was haben Sie versucht? SE-Communities sind keine Skript-/Programm-Schreibdienste. Wir neigen dazu zu erwarten, dass jemand versucht hat, seine eigene Lösung zu implementieren, und dann fragt, wann sie auf Fehler stoßen. Bitte poste einen Teil des Codes, den du ausprobiert hast und welche Probleme du damit hast. – nerdwaller

+0

Ich habe meinen Versuch über – coderlyfe

+0

hinzugefügt @coerderfe 2 Fragen: 1-Was meinst du mit Tiefe 5-10? Möchten Sie Links abrufen, auf Websites gehen? Holen Sie sich Links von all denen, gehen Sie auf die Website ... 5 mal? 2 - Woher weißt du, dass die Webseiten, die du besuchen wirst, genauso geschrieben sind wie die erste? Du bringst eine Bedingung zu allen a (Klasse: Institution).Vielleicht gibt es keine Links in den anderen Websites mit dieser Klasse, die Ihren rekursiven Algorithmus unbrauchbar machen. – JGallo

Antwort

1

Rekursive Algorithmen werden verwendet, um große Probleme auf kleinere zu reduzieren, die dieselbe Struktur haben und dann die Ergebnisse kombinieren. Sie bestehen oft aus einem Basisfall, der nicht zur Rekursion führt, und einem anderen Fall, der zur Rekursion führt. Angenommen, Sie wurden 1986 geboren und möchten Ihr Alter berechnen. Sie könnten schreiben:

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

Ich, ich, sehe nicht wirklich den Sinn der Rekursion in Ihrem Problem. Mein Vorschlag ist zuerst, dass Sie eine Grenze in Ihrem Code setzen. Was du uns gegeben hast, wird einfach unendlich laufen, weil das Programm in unendlich verschachtelten For-Schleifen steckenbleibt; es endet nie und beginnt zurückzukehren. So können Sie eine Variable außerhalb der Funktion haben, die jedes Mal aktualisiert wird, wenn Sie eine Ebene tiefer gehen und zu einem bestimmten Zeitpunkt die Funktion stoppen, um eine neue for-Schleife zu starten, und beginnt, das Ergebnis zurückzuliefern.

Aber dann werden Sie in globale Variablen ändern, verwenden Sie Rekursion auf eine seltsame Art und Weise und der Code wird unordentlich.

Nun lesen Sie die Kommentare und seeg, was Sie wirklich wollen, was, ich muss sagen, ist nicht wirklich klar, können Sie Hilfe von einem rekursiven Algorithmus in Ihrem Code verwenden, aber nicht alles rekursiv schreiben.

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 

Jetzt gibt es noch ein Problem mit diesem: Links sind nicht immer auf Web-Seiten verknüpft, sondern auch Dateien und Bilder. Deshalb habe ich die if/else-Anweisung in den rekursiven Teil der Funktion 'url-opening' geschrieben. Das andere Problem ist, dass Ihre erste Website 2166 institutionelle Links hat, und die Erstellung von 2166 * 5 beautifulSoups ist nicht schnell. Der obige Code führt 2166 mal eine rekursive Funktion aus. Das sollte kein Problem sein, aber Sie haben es mit großen html (oder php whatever) Dateien zu tun, so dass eine Suppe von 2166 * 5 sehr viel Zeit in Anspruch nimmt.

4

die Zahl Seite der kriechenden exponentiell wachsen wird, gibt es viele Fragen beteiligt, die in dem ersten Blick vielleicht nicht kompliziert aussehen Besuche scrapy Überblick über die Architektur ein Gefühl dafür zu bekommen, wie es im wirklichen Leben getan werden sollte

enter image description here

unter anderem große Features scrapy nicht gleichen Seiten wiederholen kriechen (es sei denn, Sie zwingen werden) und kann für maximal DEPTH_LIMIT

sogar noch besser konfiguriert werden, scrapy eine in Verbindung Extraktionstools gebaut link-extractors

+0

Während ich Sie gewählt habe, finde ich Scrapy übermäßig eigensinnig und schwierig in der Praxis für bestimmte Projekte. Wenn man sich die Zeit nimmt, einen eigenen Scraper zu schreiben, kann er jeden Aspekt optimieren und von oben nach unten steuern. Außerdem steigt Ihr Wissensstand exponentiell. – jamescampbell

Verwandte Themen