爬网规则是否适用于重定向

时间:2018-11-30 10:56:24

标签: python regex scrapy

我已经实例化了以下爬网蜘蛛:

from .other_rules import default_rules

class MyProjectSpider(CrawlSpider):
    name = 'my_spider'

    def __init__(self, *args, **kwargs):
        self.allowed_domains = [kwargs.get('domain')]
        self.start_urls = [kwargs.get('start_link')]
        aditional_rules = kwargs.get('rules')

        if aditional_rules!=None:
            aditional_rules = aditional_rules.split(', ')
            rules = tuple(default_rules + aditional_rules)
        else:
            rules = tuple(default_rules)

        self.rules = (
            Rule(LinkExtractor(deny=rules), callback='parse_item', follow=True),
        )
        super(MyProjectSpider, self).__init__(*args, **kwargs)

我的目标是删除所有包含某些符号('?','&'...)的链接,以及与非英语语言页面的链接。我在另一个文件中列出了清单,并将其导入。因此,前几条规则如下所示:

default_rules = [
        r'[\S]{0,}/[0-9]{1,5}/[\S]{0,}',
        r'[\S]{0,}[?]{1,}[\S]{0,}',
        r'[\S]{0,}[&]{1,}[\S]{0,}',
        r'[\S]{0,}[=]{1,}[\S]{0,}',
        r'[\S]{0,}/abkhazian/[\S]{0,}',
        r'[\S]{0,}/ab/[\S]{0,}',
        r'[\S]{0,}/afar/[\S]{0,}',
        r'[\S]{0,}/aa/[\S]{0,}',
        ...

]

我测试了此脚本,它适用于各种语言。但是,我经常发现有关符号的规则尚未完全实施。例如,当我尝试使用Yahoo新闻时,脚本不会捕获如下网址: https://sports.yahoo.com/college-womens-basketball/?_guc_consent_skip=1543573861/

我已经在Python shell中测试了这些regex表达式,它们工作正常。如果发生重定向,是否有可能未实施规则?到目前为止,这是我最好的猜测,但我无法确认。还是有其他问题在讨论中?

1 个答案:

答案 0 :(得分:1)

规则的链接提取器仅用于从解析的页面中提取链接。
除此之外,它没有其他功能,因此不会影响重定向。

如果要控制遵循的重定向,则可能需要自定义重定向中间件。
修改内置RedirectMiddleware以适合您的需求应该不会太复杂。


作为附带说明,规则适用于部分匹配。
这意味着[\S]{0,}(写得更好的\S*)的每个实例都可以忽略。
这也意味着您的default_rules列表可以简化为:

default_rules = [
    r'/\d{1,5}/',
    r'\?',
    r'&',
    r'=',
    r'/abkhazian/',
    r'/ab/',
    r'/afar/',
    r'/aa/',
    ...

]