我需要检索整个网站地图,格式如下:
- http://example.org/
- http://example.org/product/
- http://example.org/service/
- http://example.org/about/
- http://example.org/product/viewproduct/
我需要它基于链接(没有文件或目录暴力破解),例如:
解析主页->检索所有链接->探索它们->检索链接,...
我还需要能够检测页面是否为“模板”,以便不检索所有“子页面”。例如,如果发现以下链接:
- http://example.org/product/viewproduct?id=1
- http://example.org/product/viewproduct?id=2
- http://example.org/product/viewproduct?id=3
我只需要得到一次http://example.org/product/viewproduct
我研究过 HTTtracks、wget(带有 spider 选项),但目前还没有任何结论。
软件/工具应该可以下载,我更喜欢它在Linux上运行。它可以用任何语言编写。
谢谢
答案1
经过大量研究,没有一个工具让我满意,因此我使用http://scrapy.org/doc/
答案2
下面是用 Python 编写的一个例子:
(取自http://theanti9.wordpress.com/2009/02/14/python-web-crawler-in-less-than-50-lines/)
该网站上还有一个 GitHub 项目的链接http://github.com/theanti9/PyCrawler这是该人制作的更为强大的版本。
import sys
import re
import urllib2
import urlparse
tocrawl = set(["http://www.facebook.com/"])
crawled = set([])
keywordregex = re.compile('<meta\sname=["\']keywords["\']\scontent=["\'](.*?)["\']\s/>')
linkregex = re.compile('<a\s*href=[\'|"](.*?)[\'"].*?>')
while 1:
try:
crawling = tocrawl.pop()
print crawling
except KeyError:
raise StopIteration
url = urlparse.urlparse(crawling)
try:
response = urllib2.urlopen(crawling)
except:
continue
msg = response.read()
startPos = msg.find('<title>')
if startPos != -1:
endPos = msg.find('</title>', startPos+7)
if endPos != -1:
title = msg[startPos+7:endPos]
print title
keywordlist = keywordregex.findall(msg)
if len(keywordlist) > 0:
keywordlist = keywordlist[0]
keywordlist = keywordlist.split(", ")
print keywordlist
links = linkregex.findall(msg)
crawled.add(crawling)
for link in (links.pop(0) for _ in xrange(len(links))):
if link.startswith('/'):
link = 'http://' + url[1] + link
elif link.startswith('#'):
link = 'http://' + url[1] + url[2] + link
elif not link.startswith('http'):
link = 'http://' + url[1] + '/' + link
if link not in crawled:
tocrawl.add(link)
答案3
我个人使用Kapow 催化剂,但我猜它超出了你的预算。如果不是,它可能是创建蜘蛛最直观的软件,如果你需要的话,它还有更多功能。
答案4
(赢)HTTrack做得很好。
它允许您将万维网站点从互联网下载到本地目录,递归构建所有目录,并将 HTML、图像和其他文件从服务器获取到您的计算机。