【问题标题】:scrapy: restricting link extraction to the request domainscrapy:限制链接提取到请求域
【发布时间】:2019-11-20 19:14:39
【问题描述】:

我有一个 scrapy 项目,它使用来自不同域的 URL 列表作为种子,但是对于任何给定的页面,我只想关注与该页面的 URL 相同域中的链接(所以通常的 LinkExtractor(accept='example.com') 方法不会'行不通。我很惊讶我在网上找不到解决方案,因为我希望这是一项常见的任务。我能想到的最好的就是在蜘蛛文件中并在规则:

class CustomLinkExtractor(LinkExtractor):

    def get_domain(self, url):
        # https://stackoverflow.com/questions/9626535/get-protocol-host-name-from-url
        return '.'.join(tldextract.extract(url)[1:])


    def extract_links(self, response):
        domain = self.get_domain(response.url)
        # https://stackoverflow.com/questions/40701227/using-scrapy-linkextractor-to-locate-specific-domain-extensions
        return list(
            filter(
                lambda link: self.get_domain(link.url) == domain,
                super(CustomLinkExtractor, self).extract_links(response)
            )
        )

但这不起作用(蜘蛛离开域)。

现在我正在尝试使用规则中的 process_request 选项:

    rules = (
        Rule(LinkExtractor(deny_domains='twitter.com'),
             callback='parse_response',
             process_request='check_r_r_domains',
             follow=True,
             ),
    )

    def check_r_r_domains(request, response):
        domain0 = '.'.join(tldextract.extract(request.url)[1:])
        domain1 = '.'.join(tldextract.extract(response.url)[1:])
        log('TEST:', domain0, domain1)
        if (domain0 == domain1) and (domain0 != 'twitter.com'):
            return request
        log(domain0, ' != ', domain1)
        return None

但我得到了一个异常,因为它将self 传递给方法(蜘蛛没有url 属性);当我将self 添加到方法签名时,我得到一个异常,即缺少response 位置参数!如果我将回调更改为process_request=self.check_r_r_domains,我会收到一个错误,因为在我设置rules 的位置没有定义self

【问题讨论】:

    标签: python-3.x web-scraping scrapy web-crawler domain-name


    【解决方案1】:

    如果您使用Scrapy 1.7.0 或更高版本,您可以传递Rule 一个可调用的process_request 来检查请求和响应的URL,如果域不匹配。

    【讨论】:

      【解决方案2】:

      糟糕,我使用的服务器上的 conda 安装了 1.6 版本的 scrapy。我已经强制它从 conda-forge 安装 1.8.0,我认为它现在可以工作了。

      【讨论】:

        猜你喜欢
        • 2015-01-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-12
        • 2016-01-23
        相关资源
        最近更新 更多