2011-09-26 67 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之类的抓取库。