2016-06-05 5 views
1

Я создал паук, который должен сканировать несколько веб-сайтов, и мне нужно определить разные правила для каждого URL-адреса в списке start_url.Scrapy: динамически генерировать правила для каждого start_url

start_urls = [ 
    "http://URL1.com/foo" 
    "http://URL2.com/bar" 
] 

rules = [ 
    Rule (LinkExtractor(restrict_xpaths=("//" + xpathString+"/a")), callback="parse_object", follow=True) 
] 

Единственное, что необходимо изменить в правиле, это строка xpath для ограничения_трассы. Я уже придумал функцию, которая может получить xpath, который я хочу динамически с любого веб-сайта. Я подумал, что могу просто получить текущий URL-адрес, который спайдер будет очищать, и передать его через функцию, а затем передать полученный xpath правилу.

К сожалению, я искал, и кажется, что это невозможно, поскольку scrapy использует планировщик и с самого начала компилирует все start_urls и правила. Есть ли какое-либо решение для достижения того, что я пытаюсь сделать?

ответ

1

Я предполагаю, что вы используете CrawlSpider. По умолчанию CrawlSpiderrules применяются ко всем страницам (независимо от домена) вашего сканера.

Если вы просматриваете несколько доменов в стартовых URL-адресах и хотите использовать разные правила для каждого домена, вы не сможете рассказать о том, какое правило (-ы) применять в каком домене. (Я имею в виду, что он недоступен из коробки)

Вы можете запустить ваш паук с 1 стартовым URL за раз (и правилами для домена, динамически создаваемыми во время init). И запустите несколько пауков в паралели.

Другим вариантом является подклассы CrawlSpider и настроить его для ваших нужд:

  • сборки rules как Dict, используя домены в качестве ключей, и ценностей, являющихся список правил, чтобы применить для этого домена. См. Метод _compile_rules.
  • и применять различные правила в зависимости от области ответа. См. _requests_to_follow
0

Вы можете просто переопределить метод parse. Этот метод получит объект для рекурсивного ответа с полным содержимым html. Вы можете запустить xpath. Вы также можете получить URL-адрес из объекта ответа и в зависимости от URL-адреса, вы можете запустить пользовательский xpath.

Пожалуйста Извлекает документы здесь: http://doc.scrapy.org/en/latest/topics/request-response.html

+0

Спасибо, но я хочу, чтобы паук следил за ссылками. В частности, только те ссылки, которые имеют отношение к тем данным, которые мне нужны. Вот почему я явно определил параметр restrict_xpaths. –

Смежные вопросы