如何使用网络编程缓存网页?

时间:2011-05-18 05:30:13

标签: php asp.net python language-agnostic

  1. 我想编写一个Web应用程序,它可以像现在一样获取网页的快照。 快照我不是指照片/图片/图片。相反,我想保存网页以及javascripts,CSS&网页中使用的图片。如果有帧,我也需要检测它们并对帧源URL做同样的事情。

    换句话说,我想完全按照archive.org的做法行事。

  2. 我无法决定执行此操作的语言。你能帮我这个吗?

  3. 编辑:此外,任何人都可以解决这些网页快照的存储问题,因为它们的数量会随着时间的推移而增加吗?我的想法是为快照创建一个唯一ID(可能是时间戳),创建一个名为唯一ID(时间戳)的目录,并将所有快照文件直接存储在该目录中,然后在数据库中存储有关快照的参考和元信息。我的方法有什么问题吗?有没有更好的方法?

4 个答案:

答案 0 :(得分:4)

您可以使用任何具有下降HTML解析器的语言执行此操作。 Hoewever,你的migth也想看看wget,它有一个很好的“镜像”功能,并为你链接重写。

答案 1 :(得分:3)

Python有一个很棒的库来抓取名为scrapy的网站。它有很多功能和优秀的文档。或者,您可以使用urllib2httplib2html5liblxml等编写自己的刮刀...可用的工具很多。我学习Python时所做的第一件事就是编写一个刮刀,我认为你不会觉得它很难。

答案 2 :(得分:1)

此链接显示了如何使用VB.NET从页面中抓取所有链接。

http://www.consultsarath.com/contents/articles/KB000017-web-scraping--extract-all-links-from-a-web-page-using-vbnet.aspx

您将使用类似的方法获取所有图像,脚本等的链接。

然后,您需要一些逻辑来确定要下载哪些引用文件。

你想要大多数图像,但也许不是所有的脚本。 (你真的想要每个网页都有一个jquery副本吗?最好在中心位置散列这些副本。)

我为此远离PHP。 Python或VB.NET是合乎逻辑的选择。

答案 3 :(得分:1)

这是一个快速,过度简化的Python递归下载器,可让您了解如何将urllib2lxml一起用于存档页面和链接的资源。目前处理图像和脚本:

import cookielib, os, lxml.html, re, urlparse, urllib2

re_unsafe = re.compile('[^\w\.]')
jar = cookielib.CookieJar()
opener = urllib2.build_opener(*[urllib2.HTTPCookieProcessor(jar)])

def fetch(url):
    return opener.open(urllib2.Request(url)).read()

def save(url, data, prefix='assets'):
    path = os.path.join(prefix, re_unsafe.sub('_', url))
    if not os.path.exists(prefix):
        os.makedirs(prefix)
    open(path, 'wb').write(data)
    return path

def archive(url):
    tree = lxml.html.fromstring(fetch(url))
    for tag, attr in [('img','src'),('script','src')]:
        for node in tree.xpath('//%s' % tag):
            orig = node.attrib.get(attr)
            if orig:
                orig = urlparse.urljoin(url, orig)
                node.attrib[attr] = save(orig, fetch(orig))
    print 'saved', save(url, lxml.html.tostring(tree), '.')

archive('http://www.yahoo.com')