Scrapy как парсить внутренюю ссылку?
Недавно начал изучать scrapy. На главной странице изображены товары и информация о них, цена товара загружается позже. При переходе на страницу товара цена загружается сразу. Необходимо со страницы списка товаров перейти на страницу товара и запарсить цену. Как это можно сделать?
class DnsUltrabookSpider(scrapy.Spider):
name = 'dns_ultrabook'
allowed_domains = ['dns-shop.ru']
start_urls = ['https://www.dns-shop.ru/catalog/17a892f816404e77/?f[65c]=264d&p=1']
def parse(self, response):
# Give data of css
product_name = response.css('.product-info__title-link > a::text').extract()
product_info = response.css('.product-info__title-description::text').extract()
product_url = response.css('.product-info__title-link > a::attr(href)').extract()
full_product_url = []
for url in product_url:
full_product_url.append("https://www.dns-shop.ru" + url)
row_data = zip(product_name, full_product_url, product_info)
for item in row_data:
# Create dictionary
scraped_info = {
'page': response.url,
'product_name': item[0],
'product_url': item[1],
'info': item[2],
}
# Generate Information for scraping
yield scraped_info
Видел возможность такого делать через scrapy.Response(url=url), но данная функция возвращает только запрос, а не ответ.
Вот пример того как можно получить информацию о цене со страницы товара: response.css(".current-price-value::attr(data-price-value)").extract_first()
Ответы (1 шт):
Автор решения: DD_N0p
→ Ссылка
class DnsUltrabookSpider(scrapy.Spider):
name = 'dns_ultrabook'
allowed_domains = ['dns-shop.ru']
start_urls = ['https://www.dns-shop.ru/catalog/17a892f816404e77/?f[65c]=264d&p=1']
def parse(self, response):
# Give data of css
product_name = response.css('.product-info__title-link > a::text').extract()
product_info = response.css('.product-info__title-description::text').extract()
product_url = response.css('.product-info__title-link > a::attr(href)').extract()
full_product_url = []
for url in product_url:
full_product_url.append("https://www.dns-shop.ru" + url)
for i in range(len(full_product_url)):
yield scrapy.Request(full_product_url[i], callback=self.price_parse,
meta={'product_name': product_name[i],
'product_info': product_info[i],
'product_url': full_product_url[i]})
def price_parse(self, response):
price = response.xpath('//span[@class="current-price-value"]//text()').extract_first()
scrap_info = {
'product_name': response.meta['product_name'],
'product_info': response.meta['product_info'],
'product_url': response.meta['product_url'],
'price': price
}
return scrap_info