我正在尝试创建一个网站下载器使用python。我有代码:
-
查找页面中的所有url
-
下载一个给定的URL
我要做的是递归地下载一个页面,如果页面中有任何其他链接,我也需要下载它们。我试着把上面的两个函数结合起来,但是递归的东西不起作用。
代码如下:
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"*
请帮助我如何结合这两个代码"递归"下载正在下载的网页上的新链接。
您可能需要查看Scrapy库。
它将使这样的任务变得非常简单,并允许您同时下载多个页面。
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)
这是一个非常悲伤/糟糕的代码。例如,您需要检查url是否在您想要抓取的域内。但是,您要求递归。
注意递归深度
我的解决方案有很多问题。: P
你必须尝试一些爬行库,比如Scrapy之类的
一般来说,思路是这样的:
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)来开始操作