Драматург постоянно фиксирует код запроса 404, несмотря на успешную загрузку продукта на Target (веб-сайт розничного про ⇐ Python
-
Anonymous
Драматург постоянно фиксирует код запроса 404, несмотря на успешную загрузку продукта на Target (веб-сайт розничного про
Я стремлюсь собирать продукты из Target, используя Scrapy, который доказал свою эффективность для таких розничных продавцов, как Amazon и Walmart. Однако у меня возникла проблема с Target. Несмотря на успешную загрузку страницы продукта, целевой веб-сайт отвечает кодом состояния 404.
Расследование на вкладке «Проверка» -> «Сеть» браузера также выявило статус 404.
Я попытался использовать Scrapy Playwright, чтобы загрузить веб-сайт в браузере, а затем выполнить его очистку, но проблема не устранена.
Для более четкого понимания посмотрите это короткое видео: Ссылка на проблему
Вот код, который я использовал.
импортировать дату и время импортировать повторно из Scrapy.http импортировать HtmlResponse из .base_redis_spider импортировать BaseRedisSpider from ..enums.globals import РОЗНИЧНИКИ, Компонент класс TargetSearchProductSpider(BaseRedisSpider): custom_settings = {'ITEM_PIPELINES': {"scrapers.pipelines.timestamp_pipeline.TimeStampPipeline": 400, "scrapers.pipelines.redis_item_store_pipeline.RedisItemStoragePipeline": 501, }, # добавляем временную метку к элементу "DOWNLOAD_HANDLERS": {"http": "scrapy_playwright.handler.ScrapyPlaywrightDownloadHandler", "https": "scrapy_playwright.handler.ScrapyPlaywrightDownloadHandler", }, "PLAYWRIGHT_BROWSER_TYPE": "firefox", "HTTPERROR_ALLOWED_CODES": [404], "PLAYWRIGHT_LAUNCH_OPTIONS": {"безголовый": ложь} } имя = "цель" защита генерировать_ключ (сам): return f"{self.retailer.lower()}_{self.comComponent.lower()}_{self.environment.lower()}" def __init__(self, *args, **kwargs): super(TargetSearchProductSpider, self).__init__(*args, **kwargs) self.retailer = РОЗНИЧНИКИ.ЦЕЛЬ self.environment = kwargs.get('среда').upper() self.comComponent = kwargs.get('comComponent').upper() self.spider_key = self.generate_key() # 'target_retail_production' self.redis_key = f"{self.spider_key}:start_urls" self.redis_batch_size = 1 # Количество URL-адресов, которые нужно получить из Redis при каждой попытке self.max_idle_time = 60 # Максимальное время простоя (в секундах), прежде чем паук перестанет проверять Redis и выключится Защиту модифицировать_запрос (сам, запрос): return request.replace(meta={'playwright': True, 'playwright_include_page': True}, callback=self.parse, errback=self.errback) def parse(self, response, **kwargs): # Получите экземпляр браузера Playwright из словаря response.meta браузер = response.meta['playwright_browser'] # ...другая логика... ожидайте self.close_browser(браузер) урожай {} асинхронная защита errback(сам, сбой): self.logger.error(повторение(сбой)) # Получите экземпляр браузера Playwright из словаря response.meta браузер = error.request.meta['playwright_browser'] # Закрываем браузер ожидайте браузер.закрыть()
Я стремлюсь собирать продукты из Target, используя Scrapy, который доказал свою эффективность для таких розничных продавцов, как Amazon и Walmart. Однако у меня возникла проблема с Target. Несмотря на успешную загрузку страницы продукта, целевой веб-сайт отвечает кодом состояния 404.
Расследование на вкладке «Проверка» -> «Сеть» браузера также выявило статус 404.
Я попытался использовать Scrapy Playwright, чтобы загрузить веб-сайт в браузере, а затем выполнить его очистку, но проблема не устранена.
Для более четкого понимания посмотрите это короткое видео: Ссылка на проблему
Вот код, который я использовал.
импортировать дату и время импортировать повторно из Scrapy.http импортировать HtmlResponse из .base_redis_spider импортировать BaseRedisSpider from ..enums.globals import РОЗНИЧНИКИ, Компонент класс TargetSearchProductSpider(BaseRedisSpider): custom_settings = {'ITEM_PIPELINES': {"scrapers.pipelines.timestamp_pipeline.TimeStampPipeline": 400, "scrapers.pipelines.redis_item_store_pipeline.RedisItemStoragePipeline": 501, }, # добавляем временную метку к элементу "DOWNLOAD_HANDLERS": {"http": "scrapy_playwright.handler.ScrapyPlaywrightDownloadHandler", "https": "scrapy_playwright.handler.ScrapyPlaywrightDownloadHandler", }, "PLAYWRIGHT_BROWSER_TYPE": "firefox", "HTTPERROR_ALLOWED_CODES": [404], "PLAYWRIGHT_LAUNCH_OPTIONS": {"безголовый": ложь} } имя = "цель" защита генерировать_ключ (сам): return f"{self.retailer.lower()}_{self.comComponent.lower()}_{self.environment.lower()}" def __init__(self, *args, **kwargs): super(TargetSearchProductSpider, self).__init__(*args, **kwargs) self.retailer = РОЗНИЧНИКИ.ЦЕЛЬ self.environment = kwargs.get('среда').upper() self.comComponent = kwargs.get('comComponent').upper() self.spider_key = self.generate_key() # 'target_retail_production' self.redis_key = f"{self.spider_key}:start_urls" self.redis_batch_size = 1 # Количество URL-адресов, которые нужно получить из Redis при каждой попытке self.max_idle_time = 60 # Максимальное время простоя (в секундах), прежде чем паук перестанет проверять Redis и выключится Защиту модифицировать_запрос (сам, запрос): return request.replace(meta={'playwright': True, 'playwright_include_page': True}, callback=self.parse, errback=self.errback) def parse(self, response, **kwargs): # Получите экземпляр браузера Playwright из словаря response.meta браузер = response.meta['playwright_browser'] # ...другая логика... ожидайте self.close_browser(браузер) урожай {} асинхронная защита errback(сам, сбой): self.logger.error(повторение(сбой)) # Получите экземпляр браузера Playwright из словаря response.meta браузер = error.request.meta['playwright_browser'] # Закрываем браузер ожидайте браузер.закрыть()