簡體   English   中英

如何從網站上使用Beautiful Soup(python)遞歸獲取所有鏈接

[英]How to get all links from website using Beautiful Soup (python) Recursively

我希望能夠以遞歸方式從網站獲取所有鏈接,然后按照這些鏈接獲取這些網站的所有鏈接。 深度應為5-10,以便返回它找到的所有鏈接的數組。 最好使用美麗的湯/蟒蛇。 謝謝!

到目前為止,我已經嘗試了這個並且它不起作用....任何幫助將不勝感激。

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/")

抓取頁面的數量將成倍增長,涉及的許多問題在初看起來可能看起來並不復雜,請查看scrapy架構概述,以了解在現實生活中應該如何完成

在此輸入圖像描述

除了其他強大的功能之外,scrapy不會重復抓取相同的頁面(除非你強制它)並且可以配置為最大DEPTH_LIMIT

更好的是,scrapy有一個內置的鏈接提取工具鏈接提取器

遞歸算法用於將大問題減少到具有相同結構的較小問題,然后將結果組合。 它們通常由不會導致遞歸的基本情況和導致遞歸的另一種情況組成。 例如,假設您出生於1986年,並且您想要計算您的年齡。 你可以寫:

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

我,我自己,並沒有真正看到在你的問題中使用遞歸的重點。 我的建議是你首先在代碼中設置一個限制。 你給我們的東西只會無限地運行,因為程序會陷入無限嵌套的for循環中; 它永遠不會達到目的並開始回歸。 因此,您可以在函數外部使用一個變量,每次進入某個級別時都會更新,並且在某個時刻停止該函數啟動新的for循環並開始返回它找到的內容。

但是你開始改變全局變量,你以一種奇怪的方式使用遞歸,代碼變得混亂。

現在閱讀注釋並選擇你真正想要的東西,我必須說,這不是很清楚,你可以在代碼中使用遞歸算法的幫助,但不能遞歸地寫出所有這些。

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

現在仍然存在這樣的問題:鏈接並不總是鏈接到網頁,而是鏈接到文件和圖像。 這就是我在'url-opening'函數的遞歸部分編寫if / else語句的原因。 另一個問題是你的第一個網站有2166個機構鏈接,創建2166 * 5個漂亮的東西並不快。 上面的代碼運行2166次遞歸函數。 這不應該是一個問題,但你正在處理大的HTML(或任何PHP)文件,所以制作2166 * 5的湯需要花費大量的時間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM