我已经实例化了以下爬网蜘蛛:
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表达式,它们工作正常。如果发生重定向,是否有可能未实施规则?到目前为止,这是我最好的猜测,但我无法确认。还是有其他问题在讨论中?
答案 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/',
...
]