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)