Я устанавливаю правила паука динамически на основе аргумента сценария, и я хочу установить правила, которые предотвращают сканирование более чем одной страницы или переходят по всем ссылкам, и все сканирование зависит от аргумента.
Вот мой код
from scrapy.exceptions import CloseSpider
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
class LinksExtractor3Spider(CrawlSpider):
name = 'links_extractor3'
allowed_domains = ['books.toscrape.com']
start_urls = ['http://books.toscrape.com/']
def __init__(self, *args, **kwargs):
self.flow = kwargs.get('flow')
if self.flow == 'multi':
print('multi')
self.rules = (
Rule(LinkExtractor(), callback='parse_item', follow=True),
)
else:
print('single')
print(self.start_urls[0])
self.rules = (
Rule(LinkExtractor(), callback='parse_item', follow=False),
)
super(LinksExtractor3Spider, self).__init__(*args, **kwargs)
def parse_item(self, response):
item = {}
item['title'] = response.xpath('//head/title/text()').extract()
item['url'] = response.url
yield item
Я пытался использовать правило (LinkExtractor (), callback = 'parse_item', follow = False), но похоже, что я не понимаю Rule =)) Follow = False не мешает следовать.
Также я попытался установить LinkExtractor (allow = ('start_urls [0]')) или добавить еще одну функцию parse_one_item и другой обратный вызов для функции правила следующим образом:
else:
print('single')
print(self.start_urls[0])
self.rules = (
Rule(LinkExtractor(), callback='parse_one_item', follow=False),
)
super(LinksExtractor3Spider, self).__init__(*args, **kwargs)
def parse_one_item(self, response):
print('I COUNTER {}'.format(self.i))
if self.i != 0:
raise CloseSpider('finished')
else:
item = {}
item['title'] = response.xpath('//head/title/text()').extract()
item['url'] = response.url
self.i += 1
yield item
Но все это не работает должным образом.