利用pyspider对一个网站进行镜像,如何设置爬取深度,或者,如何自动的判断叶子结点?
准备用pyspider把一个网站做个镜像,因为不需要持续更新,所以age设置为-1,所有链接默认只爬取一次。为了覆盖网站大部分链接,目前的做法是在detail_page里递归调用detail_page,但是这样的数据量太大,因此需要考虑设置爬取的深度,或者让系统自动的判断叶子结点。
目前没找到可以设置爬取深度的参数,想到的办法是,如果要爬3层,就写3个内容完全一样的detal_pageX方法,然后手动嵌套调用3次:
@config(priority=2)
def detail_page1(self, response):
for each in response.doc('a[href^="http"]').items():
self.crawl(each.attr.href, callback=self.detail_page2)
@config(priority=3)
def detail_page2(self, response):
for each in response.doc('a[href^="http"]').items():
self.crawl(each.attr.href, callback=self.detail_page3)
# ...中间根据需要不停嵌套
@config(priority=4)
def detail_page3(self, response):
return {
"url": response.url,
"title": response.doc('title').text(),
}
但是这方法有个弊端,就是太不灵活了,不方便调整爬取深度,而且不同链接到达内容页(叶子节点)的深度也不一样。
另一种想到的办法是手动判断叶子节点,也就是爬取到特定的页面后就返回:
@config(priority=2)
def detail_page1(self, response):
for each in response.doc('a[href^="http"]').items():
if <each.arrt.href是一个叶子节点>:
return {
"url": response.url,
"title": response.doc('title').text(),
}
else:
self.crawl(each.attr.href, callback=self.detail_page)
这种方法目前没有好的判断叶子结点的思路,只能人工设定哪些符合特定模式的链接是叶子结点,这样就需要预先准备一个比较完备的模式列表。
大家有没有其他实践上更有效的方法,欢迎指教!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
self.crawl(url, save={"depth": depth+1})