我正在制作一个网站抓取工具,可以在网站抓取时对其进行映射。此映射将写入文件,以便在抛出异常时爬网程序可以恢复其位置。
树开始像这样:
{
"root": [{}, "example.com"]
}
其他页面嵌套在空dict中,如下所示:
{
"root": [
{
"categoryName1": [{}, "example.com/sub1"],
"categoryName2": [{}, "example.com/sub2"]
}, "example.com"
]
}
我正在使用以下方法扫描树中的空字典,这样我就可以将下一个网址抓取到:
class Crawler(object):
def __init__(self):
self.tree = { "root": [{}, 'root.example.com'] }
def next_url(self, recursion=None):
tree = recursion if recursion else self.tree
for k, v in tree.iteritems():
_path, url = v[0], v[1]
if not len(_path): # is empty; latest
return url
else:
self.next_url(_path)
下面我正在创建一个新分支并使用提取的URL启动它。我不知道如何将此分支附加到原始self.tree
。
def add_branch(self, extractedData):
branch = {}
u, n = extractedData
for url, categoryName in zip(u, n):
branch[categoryName] = [{}, url]
我似乎在这上面撞墙了。任何帮助将不胜感激!
答案 0 :(得分:1)
您可以在Crawler.next_url
方法中返回字典和网址:
return url, _path
这样,您的抓取逻辑就可以访问这两个对象,并可以更新_path
字典。