У меня есть 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', )), ),
)
РЕДАКТИРОВАТЬ: я исправил это с помощью гораздо более простого регулярного выражения 2009, 2010, 2011, но мне все еще любопытно, почему выше не работает, если у кого-то естьлюбые предложения.