首页 > 解决方案 > 在 HomePage + 其他提取的链接上制作 CrawlSpider Process 数据

问题描述

我正在做一个广泛的爬行。我需要为每个网站处理几个页面,以便为大约 20 个分类规则之一设置值。例如,一个分类规则是“有电话号码”(运行正则表达式以查看页面源中是否有电话号码并返回布尔值)。这些规则在一个名为 parse_page() 的函数中实现。

我需要 CrawlSpider 在每个爬取网站的主页上运行 parse_page() 以及其他常见页面,例如关于页面、联系页面、隐私政策页面等。

当我运行蜘蛛时,它从 some-site.com 开始,并根据下面代码中的规则定义抓取页面。

我的问题在于我需要 parse_page() 在 some-site.com 的主页上运行(parse_page() 目前只在 some-site.com/contact-us、some-site.com/about-us 等上运行.)。那么我的问题是:如何指定 Rule() 以包含网站的主页,以便主页以及已包含的其他页面调用 parse_page() ?

class SomeBotSpider(scrapy.spiders.CrawlSpider):
     name = 'some_bot'
     allowed_domains = ['some-site.com']
     start_urls = ['https://some-site.com/']


      rules = (
         Rule(LinkExtractor(allow='/contact'), callback='parse_page', follow=True),
         Rule(LinkExtractor(allow='disclaimer'), callback='parse_page', follow=True),
         Rule(LinkExtractor(allow='disclosure'), callback='parse_page', follow=True),
         Rule(LinkExtractor(allow='/about'), callback='parse_page', follow=True),
         Rule(LinkExtractor(allow='privacy'), callback='parse_page', follow=True),
     )

标签: scrapy

解决方案


您需要覆盖parse_start_url蜘蛛的方法。对网站(主页 url)的第一个请求由parse_start_url方法处理。您可以在方法parse_page内部调用parse_start_url 。像这样的东西:

class SomeBotSpider(scrapy.spiders.CrawlSpider):
    name = 'some_bot'
    allowed_domains = ['some-site.com']
    start_urls = ['https://some-site.com/']


    rules = (
         Rule(LinkExtractor(allow='/contact'), callback='parse_page', follow=True),
         Rule(LinkExtractor(allow='disclaimer'), callback='parse_page', follow=True),
         Rule(LinkExtractor(allow='disclosure'), callback='parse_page', follow=True),
         Rule(LinkExtractor(allow='/about'), callback='parse_page', follow=True),
         Rule(LinkExtractor(allow='privacy'), callback='parse_page', follow=True),
     )

    def parse_start_url(self, response):
        return self.parse_page(response)

希望能帮助到你。


推荐阅读