У меня проблема с http-кэшированием scrapy - это вычисление попадания в кеш, даже когда я передаю разные аргументы. Вот пример паука:
def exampleSpider(scrapy.Spider):
name = "example"
def start_requests(self):
# http://foo and http://bar both contain the same link: http://baz
start_urls = ['http://foo', 'http://bar']
for url in start_urls:
example_item = ExampleScraperItem()
example_item['url'] = url
yield scrapy.Request(url=url,
callback=self.parse,
cb_kwargs=('example_item': example_item))
def parse(self, response, example_item):
links = response.xpath("//@href") # == ['http://baz'] for both
for link in links:
example_item2 = ExampleScraperItem(example_item) # avoid concurrency issues
yield scrapy.Request(url=link,
callback=self.parse_nested,
cb_kwargs=('example_item': example_item2))
def parse_nested(self, response, example_item):
# 'foo_key' = 'foo_value'
example_item['foo_key'] = response.xpath('//text()').extract_first()
yield example_item
Проблема в scrapy.Request (...) в функции разбора (...). Поскольку http://baz кэшируется при сканировании http://foo, когда сканируется http://bar, scrapy возвращает кэшированный объект ExampleScraperItem при scrapy.Request (. ..) называется.
Однако я действительно хочу, чтобы сканирование http://foo дало {'url': 'http://foo', 'foo_key ':' foo_value '} и сканирование http://bar для получения {' url ':' http://bar ',' foo_key ':' foo_value '}. Как мне это сделать?