利用pyspider对一个网站进行镜像,如何设置爬取深度,或者,如何自动的判断叶子结点?

发布于 2022-09-05 19:45:50 字数 1585 浏览 6 评论 0

准备用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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

我不在是我 2022-09-12 19:45:50

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文