只关注外部链接

2024-04-29 00:01:25 发布

您现在位置:Python中文网/ 问答频道 /正文

使用^{}可以控制如何在scray中跟踪外部链接。在

我希望蜘蛛忽略网站上的所有内部链接,只关注外部链接。在

将响应URL域添加到deny_domainsDynamic rules无效。在

你能覆盖OffsiteMiddleware中的get_host_regex来过滤掉所有的现场链接吗?还有别的办法吗?在

说明:我希望spider忽略在allowed_domains中定义的域以及每个已爬网域上的所有内部链接。因此,当爬行器位于该URL上时,必须忽略蜘蛛后跟的每个URL的域。换句话说:当爬虫到达一个像example.com网站,我希望它忽略example.com网站并且只关注不在的网站的外部链接example.com网站.


Tags: comhosturlget网站链接exampledynamic
2条回答

我的回答没有用“刮痧”这个词。如果你觉得这个回答太离题了,请随意标记。在

但我提供的是一个解决方案来帮助你解决更普遍的问题。在

我在分析google的结果时遇到了类似的问题。我不希望在结果页面上出现的任何样板URL都包含在我的最终URL列表中。我也不希望任何google相关查询字符串出现。使用beauthoulsoup、re模块和requests模块,我能够做到这一点。在

对于你的问题,我想说你只需要漂亮的外表。你需要一个过滤域的函数。函数应该有两个参数,reference和被测url。使用re模块,您可以检查测试url基字符串是否与引用字符串相同;如果是,则可以合理地断定它是内部url。在

您应该使用BeautifulSoup来解析包含href<a>标记的html。在

您可以通过简单地反转should_follow()方法创建反向异地中间件:

#mycrawler.middlewares.py

from scrapy.spidermiddlewares.offsite import OffsiteMiddleware
from scrapy.utils.httpobj import urlparse_cached

class ReverseOffsiteMiddleware(OffsiteMiddleware):

    seen = set()

    def should_follow(self, request, spider):
        allowed_domains = not super().should_follow(request, spider)
        # if failed to pass reverse allowed_domains don't follow
        if not allowed_domains:  
            return False

        # if visited domain before do not schedule request
        domain = urlparse_cached(request).hostname
        if domain in self.seen:
            return False
        # otherwise add to seen domain set and schedule request
        self.seen.add(domain)
        return True

然后在您的settings.py中激活它:

^{pr2}$

现在,spider.allowed_domains中的所有域都将被忽略:)

相关问题 更多 >