【问题标题】:Scrapy is following and scraping non-allowed linksScrapy 正在跟踪和抓取不允许的链接
【发布时间】:2012-01-22 04:30:12
【问题描述】:

我设置了一个 CrawlSpider 来跟踪某些链接并抓取新闻杂志,其中每个问题的链接都遵循以下 URL 方案:

http://example.com/YYYY/DDDD/index.htm 其中 YYYY 是年份,DDDD 是三位数或四位数的发行号。

我只想要 928 以后的问题,并且我的规则如下。我连接到网站、抓取链接或提取项目没有任何问题(所以我没有包含我的其余代码)。蜘蛛似乎决心遵循不允许的链接。它正在尝试抓取问题 377、398 等,并遵循“culture.htm”和“feature.htm”链接。这会引发很多错误并且不是非常重要,但它需要对数据进行大量清理。关于出了什么问题有什么建议吗?

class crawlerNameSpider(CrawlSpider):
name = 'crawler'
allowed_domains = ["example.com"]
start_urls = ["http://example.com/issues.htm"]

rules = (
        Rule(SgmlLinkExtractor(allow = ('\d\d\d\d/(92[8-9]|9[3-9][0-9]|\d\d\d\d)/index\.htm', )), follow = True),
        Rule(SgmlLinkExtractor(allow = ('fr[0-9].htm', )), callback = 'parse_item'),
        Rule(SgmlLinkExtractor(allow = ('eg[0-9]*.htm', )), callback = 'parse_item'),
        Rule(SgmlLinkExtractor(allow = ('ec[0-9]*.htm', )), callback = 'parse_item'),
        Rule(SgmlLinkExtractor(allow = ('op[0-9]*.htm', )), callback = 'parse_item'),
        Rule(SgmlLinkExtractor(allow = ('sc[0-9]*.htm', )), callback = 'parse_item'),
        Rule(SgmlLinkExtractor(allow = ('re[0-9]*.htm', )), callback = 'parse_item'),
        Rule(SgmlLinkExtractor(allow = ('in[0-9]*.htm', )), callback = 'parse_item'),
        Rule(SgmlLinkExtractor(deny = ('culture.htm', )), ),
        Rule(SgmlLinkExtractor(deny = ('feature.htm', )), ),
    )

编辑:我使用更简单的正则表达式 fot 2009、2010、2011 修复了这个问题,但我仍然很好奇为什么如果有人有任何建议上述方法不起作用。

【问题讨论】:

    标签: python screen-scraping scrapy web-crawler


    【解决方案1】:

    您需要将deny 参数传递给SgmlLinkExtractor,后者收集指向follow 的链接。如果他们调用一个函数parse_item,你不需要创建这么多Rule。我会把你的代码写成:

    rules = (
            Rule(SgmlLinkExtractor(
                        allow = ('\d\d\d\d/(92[8-9]|9[3-9][0-9]|\d\d\d\d)/index\.htm', ),
                        deny = ('culture\.htm', 'feature\.htm'),
                        ), 
                follow = True
            ),
            Rule(SgmlLinkExtractor(
                    allow = (
                        'fr[0-9].htm', 
                        'eg[0-9]*.htm',
                        'ec[0-9]*.htm',
                        'op[0-9]*.htm',
                        'sc[0-9]*.htm',
                        're[0-9]*.htm',
                        'in[0-9]*.htm',
                        )
                    ), 
                    callback = 'parse_item',
            ),
        )
    

    如果您使用的规则中的真实 url 模式是 parse_item,则可以简化为:

     Rule(SgmlLinkExtractor(
                    allow = ('(fr|eg|ec|op|sc|re|in)[0-9]*\.htm', ), 
                    callback = 'parse_item',
            ),
     )
    

    【讨论】:

    • 太棒了。感谢您的帮助!
    猜你喜欢
    • 2017-12-07
    • 1970-01-01
    • 2014-05-23
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 2015-12-18
    • 1970-01-01
    相关资源
    最近更新 更多