Несколько дней назад я попытался добавить некоторые функции в парсер моего паука.Моя цель - очистить некоторые страницы Amazon, проблема в том, что мне нужно заставить анализатор работать по-разному для каждого продукта, который я хочу найти.Например, если я хочу искать ноутбуки, мой парсер работает таким же образом, но если я ищу обувь, он работает по-другому.Я сделал это следующим образом:
def start_requests(self):
keyword_callback = {
'Laptop' : self.parse_item
}
txtfile = open('productosABuscar.txt', 'r')
keywords = txtfile.readlines()
txtfile.close()
for keyword in keywords:
yield Request(self.search_url.format(keyword), callback = keyword_callback[keyword])
Проблема, с которой я здесь сталкиваюсь, заключается в том, что, когда я делаю запрос на доходность, мой паук не «ищет» ключевое слово и не вводит ссылку, поэтому парсер получает только 1ссылка и никаких данных.
Если вам нужна дополнительная информация, обязательно спросите!
Редактировать: Добавление дополнительной информации
class PrototipoAmazonV1Spider(CrawlSpider):
name = 'spiderProtAmazon'
#Dominio permitido
allowed_domain = ['www.amazon.com']
search_url = 'https://www.amazon.com/s?field-keywords={}'
rules = {
#Todos los elementos en la pagina
Rule(LinkExtractor(allow =(), restrict_xpaths = ('//*[contains(@class, "s-access-detail-page")]') ),
callback = 'parse_item', follow = False)
}
#Previous start request goes here
def parse_item(self, response):
amz_item = Prototipoamazonv1Item()
#info de producto
amz_item['nombreProducto'] = response.xpath('normalize-space(//span[contains(@id, "productTitle")]/text())').extract()
amz_item['urlProducto'] = response.request.url
yield amz_item
В настоящее время я использую 1 парсер, покаЯ попробую, если это работает.Моя идея состоит в том, чтобы иметь разные парсеры для каждого ключевого слова.
При запуске этой программы я получаю только данные из 'urlProducto'
'urlProducto' = 'https://www.amazon.com/s?field-keywords=Laptop'
Проблема в том, что мой паук не получает "внутри" каждого продукта для получения данных.Если я использую предыдущий URL (urlProducto) в качестве начального, он работает просто отлично.