Задать вопрос
@m1rvi

Почему api золотого яблока блокирует все запросы?

Есть задача: парсить наличие товара в Золотом Яблоке

Пример товара - https://goldapple.ru/88800900003-pinup-liquid-eyeliner

Изначально попробовал через Selenium парсить кнопку добавления в корзину(в случае того, если нет в наличии, то пишет "уведомить о поступлении"), но сервер блокирует все запросы, что уже не перебробовал.
Потом нашел на сайте скрытое API

Вот пример запроса к товару, который упомянул выше


Но запросы к нему севрер тоже блокирует, уже попробовал с прокси, но ничего не выходит. Все равно блочит..
Исходник кода

import requests
from bs4 import BeautifulSoup
import openpyxl as op
import os
import json
from fake_useragent import UserAgent
import random
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time


#Подключаем эксель файл с артикулами

filename = 'excel/1.xlsx'
wb = op.load_workbook(filename, data_only=True)
sheet = wb.active
max_rows = sheet.max_row
    

#Подключаем прокси 
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7",
    "Accept-Language": "ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7",
    "Connection": "keep-alive",
    "Upgrade-Insecure-Requests": "1",
    "Cache-Control": "no-cache",
    "Pragma": "no-cache",
    "DNT": "1", # Do Not Track
    "Referer": "https://goldapple.ru/",
    "Origin": "https://goldapple.ru",
}

proxies = []
proxies_file = 'proxies.txt'

if os.path.exists(proxies_file):
    with open(proxies_file, 'r') as f:
        for line in f:
            line = line.strip()
            if line:
                proxies.append(line)
else:
    print(f"Файл {proxies_file} не найден. Парсинг будет без прокси.")

def check_proxy(proxy):
    try:
        response = requests.get('http://httpbin.org/ip', proxies={'http': proxy, 'https': proxy}, timeout=10)
        if response.status_code == 200:
            return True
    except:
        return False
    return False

print("Проверка прокси:")
working_proxies = []
for proxy in proxies:
    if check_proxy(proxy):
        working_proxies.append(proxy)
        print(f"Работающий прокси: {proxy}")
    else:
        print(f"Не работает прокси: {proxy}")

print(f"Количество работающих прокси: {len(working_proxies)}")

# Запрос подтверждения
if len(working_proxies) > 0:
    user_input = input("Начать парсинг? (да/нет): ")
    if user_input.lower() != 'да':
        print("Парсинг отменен.")
        exit()
else:
    print("Нет работающих прокси. Парсинг отменен.")
    exit()

def setup_driver(proxy):
    chrome_options = Options()
    chrome_options.add_argument('--headless')  # Запуск в фоновом режиме
    chrome_options.add_argument('--no-sandbox')
    chrome_options.add_argument('--disable-dev-shm-usage')
    chrome_options.add_argument('--disable-gpu')
    chrome_options.add_argument('--window-size=1920,1080')
    chrome_options.add_argument(f'--proxy-server={proxy}')
    chrome_options.add_argument('--ignore-certificate-errors')
    
    # Добавляем случайный User-Agent
    user_agents = [
        "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
        "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36",
        "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:120.0) Gecko/20100101 Firefox/120.0",
        "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Edg/120.0.0.0"
    ]
    chrome_options.add_argument(f'user-agent={random.choice(user_agents)}')
    
    return webdriver.Chrome(options=chrome_options)

def parse_data(url):
    for proxy in working_proxies:
        driver = None
        try:
            print(f"Используем прокси: {proxy}")
            driver = setup_driver(proxy)
            
            # Переходим непосредственно по API URL
            print(f"Переходим по API URL: {url}")
            driver.get(url)
            time.sleep(7) # Ждем загрузку данных
            
            # Получаем содержимое страницы
            page_source = driver.page_source
            
            # Извлекаем JSON из page_source
            # Удаляем <pre> теги, если они есть
            json_str = page_source
            if page_source.startswith("<pre>") and page_source.endswith("</pre>"):
                json_str = page_source[len("<pre>"): -len("</pre>")]
            
            site_json = None
            in_stock = None

            try:
                site_json = json.loads(json_str)
                in_stock = site_json.get('data', [{}])[0].get('inStock')
                
                if in_stock is not None:
                    print(f"Товар в наличии: {in_stock}")
                    driver.quit()
                    return in_stock
                else:
                    print("Не удалось найти 'inStock' в JSON ответе.")
                    
            except json.JSONDecodeError:
                 print(f"Ошибка декодирования JSON ответа от {url} с прокси {proxy}")
            
            # Выводим отладочную информацию, если inStock не найден или произошла ошибка декодирования
            print("--- Отладочная информация ---")
            print("URL запроса:", url)
            print("Используемый прокси:", proxy)
            print("Содержимое page_source (обрезано до 1000 символов):", page_source[:1000])
            if site_json is not None:
                 print("Распарсенный JSON:", json.dumps(site_json, indent=2)[:1000])
            else:
                 print("JSON не был распарсен.")
            print("---------------------------")

        except Exception as e:
            print(f"Произошла непредвиденная ошибка при выполнении запроса с прокси {proxy}: {e}")
        finally:
            if driver:
                try:
                    driver.quit()
                except:
                    pass
    return None

url = "https://goldapple.ru/front/api/catalog/product-card/base/v2?locale=ru&itemId=88800900003&customerGroupId=0&cityId=c2deb16a-0330-4f05-921f-1d09c93331e6"
parse_data(url)



Что посоветуете делать в таком случае и как можно обойти блокировки?
  • Вопрос задан
  • 484 просмотра
Подписаться 1 Простой 3 комментария
Пригласить эксперта
Ответы на вопрос 2
sergey-gornostaev
@sergey-gornostaev Куратор тега Python
Седой и строгий
Потому что Золотое Яблоко не хочет, чтобы их парсили.
Ответ написан
Комментировать
Vindicar
@Vindicar
RTFM!
Вполне может быть, что банят за запросы не из диапазонов домашних и мобильных провайдеров.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы