2011-09-26 68 views
0

我正在嘗試使用python創建一個網站下載器。我對代碼:使用Python的網站下載器

  1. 找到的所有URL從頁面

  2. 下載指定網址

我需要做的就是遞歸下載頁面,如果該頁面中還有其他鏈接,我還需要下載它們。我試着結合上述兩個函數,但遞歸的東西不起作用。

的代碼給出如下:

1)

*from sgmllib import SGMLParser 
class URLLister(SGMLParser): 
    def reset(self): 
     SGMLParser.reset(self) 
     self.urls = [] 
    def start_a(self, attrs): 
     href = [v for k, v in attrs if k=='href'] 
     if href: 
      self.urls.extend(href) 
if __name__ == "__main__": 
    import urllib 
    wanted_url=raw_input("Enter the URL: ") 
    usock = urllib.urlopen(wanted_url) 
    parser = URLLister() 
    parser.feed(usock.read()) 
    parser.close() 
    usock.close() 
    for url in parser.urls: download(url)* 

2)這裏下載(網址)函數的定義如下:

*def download(url): 
    import urllib 
    webFile = urllib.urlopen(url) 
    localFile = open(url.split('/')[-1], 'w') 
    localFile.write(webFile.read()) 
    webFile.close() 
    localFile.close() 
    a=raw_input("Enter the URL") 
    download(a) 
    print "Done"* 

請幫助我如何結合這兩個代碼以「遞歸地」在網頁上下載新鏈接nloaded。

+1

您確定要編寫自己的,而不是簡單地使用'wget'嗎? – NPE

回答

1

通常的想法是這樣的:

def get_links_recursive(document, current_depth, max_depth): 
    links = document.get_links() 
    for link in links: 
     downloaded = link.download() 
     if current_depth < max_depth: 
      get_links_recursive(downloaded, depth-1, max_depth) 

呼叫get_links_recursive(文件,0,3)得到的東西開始。

+3

這正是如何觸發堆棧溢出,它會遞歸地觸發SO的問題,並最終結束宇宙。 – Tibo

+0

同意,他還需要限制爬網應該停止的時間,最好是限制爬網級別的數量。我會編輯答案。 –

2

您可能想要查看Scrapy庫。

它會讓這樣的任務變得非常簡單,並允許您同時下載多個頁面。

2
done_url = [] 
def download(url): 
    if url in done_url:return 
    ...download url code... 
    done_url.append(url) 
    urls = sone_function_to_fetch_urls_from_this_page() 
    for url in urls:download(url) 

這是一個非常難過/不好的代碼。例如,您需要檢查網址是否位於您要抓取的網域內。但是,您要求遞歸。

請注意遞歸深度。

我的解決方案有很多錯誤。 :P

你必須嘗試一些像Scrapy之類的抓取庫。