使用Python的网站下载器

时间:2011-09-26 12:12:30

标签: python web-crawler

我正在尝试使用python创建 网站下载器 。我有以下代码:

  1. 查找页面中的所有网址

  2. 下载指定网址

  3. 我要做的是递归下载页面,如果该页面中有任何其他链接,我也需要下载它们。我尝试结合上面两个函数,但递归的东西不起作用。

    代码如下:

    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)其中download(url)函数的定义如下:

    *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"*
    

    请帮助我如何将这两个代码合并到“ 递归 ”下载正在下载的网页上的新链接。

3 个答案:

答案 0 :(得分:2)

您可能需要查看Scrapy库。

这将使这样的任务非常简单,并允许您同时下载多个页面。

答案 1 :(得分: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这样的爬行库。

答案 2 :(得分: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(document,0,3)以开始工作。