Вы можете получить ссылку на продукт, извлекая атрибут href
из <a class="a-link-normal a-text-normal" href="...">
:
Link = response.css('.a-text-normal').css('a::attr(href)').extract()
Из ссылки вы можете использовать регулярное выражение для извлечения номера ASIN из ссылки:
(?<=dp/)[A-Z0-9]{10}
Приведенное выше регулярное выражение будет соответствовать 10 символам (заглавным буквам или цифрам), перед которыми стоит dp/
.См. Демонстрацию здесь: https://regex101.com/r/mLMv3k/1
Вот рабочая реализация метода parse()
:
def parse(self, response):
Link = response.css('.a-text-normal').css('a::attr(href)').extract()
Title = response.css('span.a-text-normal').css('::text').extract()
# for each product, create an AmazonItem, populate the fields and yield the item
for result in zip(Link,Title):
item = AmazonItem()
item['title_Product'] = result[1]
item['link_Product'] = result[0]
# extract ASIN from link
ASIN = re.findall(r"(?<=dp/)[A-Z0-9]{10}",result[0])[0]
item['ASIN_Product'] = ASIN
yield item
Это требует расширения AmazonItem
новыми полями:
class AmazonItem(scrapy.Item):
# define the fields for your item here like:
title_Product = scrapy.Field()
link_Product = scrapy.Field()
ASIN_Product = scrapy.Field()
Пример вывода:
{'ASIN_Product': 'B01MSHQ5IQ',
'link_Product': '/Philips-Norelco-Groomer-MG3750-50/dp/B01MSHQ5IQ',
'title_Product': 'Philips Norelco Multigroom Series 3000, 13 attachments, '
'FFP, MG3750'}
{'ASIN_Product': 'B01MSHQ5IQ',
'link_Product': '/Philips-Norelco-Groomer-MG3750-50/dp/B01MSHQ5IQ',
'title_Product': 'Philips Norelco Multi Groomer MG7750/49-23 piece, beard, '
'body, face, nose, and ear hair trimmer, shaver, and clipper'}
Демонстрация: https://repl.it/@glhr/55534679-AmazonSpider
Чтобы записать вывод в файл JSON, просто укажите параметры экспорта канала в пауке:
class AmazonProductSpider(scrapy.Spider):
name = "AmazonDeals"
allowed_domains = ["amazon.com"]
start_urls = ["https://www.amazon.com/s?k=trimmer&ref=nb_sb_noss_2"]
custom_settings = {
'FEED_URI' : 'Asin_Titles.json',
'FEED_FORMAT' : 'json'
}