scrapy 如何从动态网站中获取所有类别/子类别?

f87krz0w  于 2023-06-23  发布在  其他
关注(0)|答案(1)|浏览(116)

我需要从一个网站(https://www.hiperlibertad.com.ar/),有多个分支/商店提取所有的产品。
我现在的主要问题是,我需要找到一种方法来调整代码,以便能够提取网站上的所有类别>子类别。
这些可以从主页的主菜单中看到:
Main menu with the categories > subcategories
我知道该网站使用JavaScript动态生成内容。我试图使用剧作家与Scrapy得到这个上市,但我不能。

在此任务中,我被指示不要使用Selenium。

任何帮助如何处理这个问题是赞赏!
我已经在Scrapy中有代码可以从特定URL(类别/子类别)中提取产品。代码工作正常。我给予它的网址,它提取所有的产品从所有的网页,我有。:

import scrapy
import json

class HiperSpider(scrapy.Spider):
    name = "hiper"
    base_url = 'https://www.hiperlibertad.com.ar/api/catalog_system/pub/products/search/hogar/muebles-de-interior'
    sc_value = '1'  # Default value is 1

    def __init__(self, sc_value='1', *args, **kwargs):
        super(HiperSpider, self).__init__(*args, **kwargs)
        self.sc_value = sc_value

    def start_requests(self):
        url = f'{self.base_url}?O=OrderByTopSaleDESC&_from=0&_to=23&sc={self.sc_value}'
        yield scrapy.Request(url, self.parse)

    def parse(self, response):
        data = json.loads(response.text)
        products = data
        for product in products:
            name = product['productName']
            regular_price = product['items'][0]['sellers'][0]['commertialOffer']['Price']
            promotional_price = product['items'][0]['sellers'][0]['commertialOffer']['ListPrice']
            category = product['categories'][0]
            sku = product['productId']

            yield {
                'name': name,
                'regular_price': regular_price,
                'promotional_price': promotional_price,
                'category': category,
                'sku': sku
            }

        # Check if there are more products on the current page
        has_more_products = len(data) > 0

        # Extract current page range from the URL
        current_page_from = int(response.url.split('_from=')[1].split('&')[0])
        current_page_to = int(response.url.split('_to=')[1].split('&')[0])

        # Calculate the next page range
        next_page_from = current_page_from + 24
        next_page_to = current_page_to + 24

        if has_more_products:
            # Construct URL for the next page
            next_page = f"{self.base_url}?O=OrderByTopSaleDESC&_from={next_page_from}&_to={next_page_to}&sc={self.sc_value}"
            yield scrapy.Request(next_page, callback=self.parse)
44u64gxh

44u64gxh1#

你可以改变这里获取所有产品的方法,只使用scrapy,通过使用站点Map而不是通过类别和子类别。
网站Map:https://www.hiperlibertad.com.ar/sitemap.xml
从那里,您可以从产品页面本身获取数据,或者从页面获取SKU并使用获取的SKU ID调用API。
API页面:https://www.hiperlibertad.com.ar/api/catalog_system/pub/products/search/?fq=productId:(请替换为有效SKU)
使用PlayWright的开销与selenium类似,而且相对来说非常慢。

相关问题