我想编写一个Web应用程序,它可以像现在一样获取网页的快照。 快照我不是指照片/图片/图片。相反,我想保存网页以及javascripts,CSS&网页中使用的图片。如果有帧,我也需要检测它们并对帧源URL做同样的事情。
换句话说,我想完全按照archive.org的做法行事。
我无法决定执行此操作的语言。你能帮我这个吗?
编辑:此外,任何人都可以解决这些网页快照的存储问题,因为它们的数量会随着时间的推移而增加吗?我的想法是为快照创建一个唯一ID(可能是时间戳),创建一个名为唯一ID(时间戳)的目录,并将所有快照文件直接存储在该目录中,然后在数据库中存储有关快照的参考和元信息。我的方法有什么问题吗?有没有更好的方法?
答案 0 :(得分:4)
您可以使用任何具有下降HTML解析器的语言执行此操作。 Hoewever,你的migth也想看看wget,它有一个很好的“镜像”功能,并为你链接重写。
答案 1 :(得分:3)
Python有一个很棒的库来抓取名为scrapy的网站。它有很多功能和优秀的文档。或者,您可以使用urllib2或httplib2,html5lib或lxml等编写自己的刮刀...可用的工具很多。我学习Python时所做的第一件事就是编写一个刮刀,我认为你不会觉得它很难。
答案 2 :(得分:1)
此链接显示了如何使用VB.NET从页面中抓取所有链接。
您将使用类似的方法获取所有图像,脚本等的链接。
然后,您需要一些逻辑来确定要下载哪些引用文件。
你想要大多数图像,但也许不是所有的脚本。 (你真的想要每个网页都有一个jquery副本吗?最好在中心位置散列这些副本。)
我为此远离PHP。 Python或VB.NET是合乎逻辑的选择。
答案 3 :(得分:1)
这是一个快速,过度简化的Python递归下载器,可让您了解如何将urllib2
和lxml
一起用于存档页面和链接的资源。目前处理图像和脚本:
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')