使用Python的网站下载器

0 投票
3 回答
3377 浏览
提问于 2025-04-17 03:05

我正在用Python创建一个网站下载器。我已经有了以下功能的代码:

  1. 从页面中找到所有的链接

  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) 其中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 个回答

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) 来开始这个过程。

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之类的。

撰写回答