利用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)

这种方法目前没有好的判断叶子结点的思路,只能人工设定哪些符合特定模式的链接是叶子结点,这样就需要预先准备一个比较完备的模式列表。

大家有没有其他实践上更有效的方法,欢迎指教!

阅读 3k
1 个回答

self.crawl(url, save={"depth": depth+1})

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题