3 горизонтальные линии, бургер
3 горизонтальные линии, бургер
3 горизонтальные линии, бургер
3 горизонтальные линии, бургер

3 горизонтальные линии, бургер
Удалить все
ЗАГРУЗКА ...

Содержание



    Как создать парсер wildberries на python

    Часы
    16.11.2024
    /
    Часы
    02.10.2025
    /
    Часы
    4 минуты
    Глазик
    1178
    Сердечки
    0
    Соединённые точки
    2
    Соединённые точки
    0
    Соединённые точки
    0

    Введение и обзор парсера

    В наши дни парсить интернет-магазины не просто. Все они довольно продвинуты в плане защиты от парсеров и ботов. Они могут использовать такие типы защит как, использовать динамический контент, брандмаузеры. Одной из самых знаменитых компаний обеспечивающих такую защиту является cloudflare.
    В этом туториале я покажу различные методы обходов блокировок на примере онлайн-магазина wildberries. Если быть более конкретным, то я покажу как сделать парсер на основе библиотеки Selenium и как настроить для него ротацию прокси. Прокси мы будем использовать бесплатные.
    Ещё прошу заметить, моей целью не являлось спарсить конкретные данные с интернет-магазина. Я всего лишь хотел продемонстрировать методику и устройство парсеров таких сайтов. И конечно же, он будет однопоточным чтобы было наглядней для тебя, как он работает.
    А в качестве бонуса предоставлю один парсер и один чекер прокси. Они помогут тебе в создании своих пулов прокси под различные сайты.

    Пишем базовый парсер

    Для начала, напишем и сделаем обзор на написанный мною парсер. Тебе потребуется создать и активировать виртуальное окружение.
    python -m venv .venv
    Если windows то:
    .\.venv\Scripts\activate
    Если *unix системы то:
    source ./.venv/bin/activate
    После чего установим необходимые пакеты:
    pip install selenium requests lxml beautifulsoup4
    Импортируем заголовки. В твоей рабочей директории, должна быть папка proxy_rotator Данный пакет регулирует выдачу прокси по запросу. Выдаёт она прокси случайно в зависимости от веса прокси. Чем больше вес, тем больше вероятность того, что будет выбрано именно эта прокси.
    import json from bs4 import BeautifulSoup # For creating webdriver from selenium import webdriver # For navigation purpose from selenium.webdriver.common.by import By # For easy to send parameters to driver when set from selenium.webdriver.firefox.options import Options # For events handling from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.common.exceptions import TimeoutException # For proxy rotation from proxy_rotator import Proxy, Rotator from config import URL
    Добавим ещё пару утилитарных функций, таких как:
    1. сохранение в json
    2. сохранение в html
    3. загрузку прокси
    4. и парсинг необходимых данных
    def load_proxies(file_path): result = [] with open(file_path, 'r', encoding='utf-8') as file: result = json.loads(file.read()) return result def save_to_html(path, text): with open(path, 'w', encoding='utf-8') as file: file.write(text) file.close() def save_to_json(path, list): with open(path, 'w', encoding='utf-8') as file: json.dump(list, file, indent=2, ensure_ascii=False) file.close() def parse_data(path): data = [] with open(path, 'r', encoding='utf-8') as file: soup = BeautifulSoup(file.read(), 'lxml') soup_blocks = soup.find_all('div', class_='product-card__wrapper') for block in soup_blocks: title = block.find('h2', class_='product-card__brand-wrap').text price = block.find('ins', class_='price__lower-price').text data.append({ 'title': title, 'price': price }) save_to_json('result.json', data)
    В моём случае я решил парсить главную страницу. Собрать все цены и заголовки товаров. Функция parse_data определяет что парсить и куда сохранять.
    Добавим в самом низу данные строчки кода. Они говорят вызови функцию run() только если данный скрипт запускается при помощи python-интерпретатора.
    if __name__ == "__main__": run()
    Теперь то, как выглядит главная функция run():
    def run(): proxies: list[Proxy] = [] # Load proxies to memory proxies_json = load_proxies("proxies.json") for proxy_item in proxies_json: proxies.append(Proxy( proxy_item['path'], proxy_item['type'], proxy_item['protocol'], proxy_item['status'], proxy_item['weight']) ) # Making a rotator for a proxies rotator = Rotator(proxies) isFinished = False index = 0 max = 10 res = "" while not isFinished: try: proxy = rotator.get() print(f"Using proxy: {proxy}") # Create a webdriver firefox_opt = Options() firefox_opt.add_argument('--headless') firefox_opt.add_argument("--no-sandbox") firefox_opt.add_argument("--disable-dev-shm-usage") firefox_opt.add_argument(f"--proxy-server={proxy}") driver = webdriver.Firefox(options=firefox_opt) driver.get(URL) # Retrieve all reqeusts element on pages, while waiting they are loaded for i in range(index, max): items_container = WebDriverWait(driver, 10).until( EC.presence_of_all_elements_located((By.CLASS_NAME, 'product-card__wrapper')) ) index = i last_item = items_container[len(items_container ) - 1] driver.execute_script("arguments[0].scrollIntoView(true);", last_item) for item in items_container: res += item.get_attribute('outerHTML') print(f"Get {i} page") if index == max - 1: isFinished = True except TimeoutException as ex: print(f"Proxy failed -> {ex.msg}") print('Save the result') save_to_html('index.html', res) print('Parse the result') parse_data('index.html')
    Сначала создаём ротатор прокси, загружая в него уже подготовленный список ( о том как собрать свой собственный смотри в следующей главе). После чего в цикле создаём selenium драйвер и присваиваем ему прокси, если прокси плохой, то всплывёт исключение TimeoutException, что триггернёт сообщение в консоли и замену прокси.
    Под плохим прокси я имел в виду недоступный или уже заблокированный. Данное исключение всплывёт после 10 секунд ожидания появления элемента с классом product-card__wrapper.
    Это был базовый парсер. Полностью готовый парсер сайта wildberries. В данном архиве ты найдёшь и proxy_rotator пакет и список готовых прокси, хотя я и не гарантирую что они будут работать на момент твоего прочтения данной статьи.

    Сбор бесплатных прокси

    Так как wildberries это интернет-магазин работающий на территории России и СНГ то и прокси должны быть оттуда, для большей правдоподобности наших парсеров на обычных пользователей.
    Итак, как и откуда можно взять бесплатные прокси? Представляю тебе моего скраппера бесплатных прокси, с возможностью выбора и фильтрации прокси по странам, используемым протоколам и типу самих прокси.
    Чтобы собрать только русские прокси с используемыми протоколоми http и https введи следующую команду:
    python .\main.py -p http, https -c RU
    Если хочешь узнать какие коды, каким странам соответствуют введи:
    python .\main.py -HC
    В результате ты получишь JSON файлы со списками прокси. Все такие файлы находятся в директории data. Всё происходит в параллельном режиме и ты можешь в любой момент остановить скрипт если посчитаешь, что тебе хватит.

    Проверка бесплатных прокси

    Итак, мы собрали сотни прокси и могу тебе гарантировать большинство из них это откровенный мусор. Нам нужно будет его отфильтровать, при чём, отфильтровать используя в качестве фильтра целевой сайт, то есть wildberries.
    Видишь ли, большинство сайтов, которые предоставляют прокси, проверяют живы ли они просто пингуя их. Но это не значит что эти прокси будут работать с тем или иным сайтом.
    Для проверки работоспособности прокси на том или ином сайте, я создал специальный CLI инструмент. Который ты можешь скачать по ссылке в предыдущем предложении (⊙_(⊙_⊙)_⊙). Вот как проверить список таких прокси, команда:
    python .\main.py -i 0_64.json -o .\res.json -U https://wildberries.ru
    Где -i это те прокси которые ты получил используя мой скрапер прокси
    Где -o это имя файла-результата где каждому прокси будет присвоен вес.
    Где -U это список сайтов проверки
    Больше опций и вариантов можно посмотреть используя -h флаг. Но в данном случае нас больше заинтересует log.txt файл. Ведь там хранятся результаты проверок каждого прокси и то сколько раз он успешно подключался к целевому сайту. Выбери самые успешные прокси и объедини их в один JSON файл, который потом будешь использовать для парсинга сайтов.

    Не забудь поделиться, лайкнуть и оставить комментарий)

    Комментарии

    (0)

    captcha
    Отправить
    ЗАГРУЗКА ...
    Сейчас тут пусто. Буть первым (o゚v゚)ノ

    Другое

    Похожие статьи


    Как написать простой парсер на python + уже готовый парсер

    Часы
    10.12.2024
    /
    Часы
    02.10.2025
    Глазик
    4665
    Сердечки
    0
    Соединённые точки
    0
    Соединённые точки
    0
    Соединённые точки
    0
    Как написать простой парсер на python, на примере собора изображений с сайта. Данный парсер представляет из себя пример того, как парсить статические и динамические сайты. С исходным кодом и архивом …

    Пишем парсер поисковой выдачи google

    Часы
    15.02.2025
    /
    Часы
    02.10.2025
    Глазик
    1579
    Сердечки
    0
    Соединённые точки
    0
    Соединённые точки
    0
    Соединённые точки
    0
    В этой статье будет описан процесс написания парсера поисковой выдачи google используя их официальный API. Покажу как получить API-ключ и ID поисковой машины. А так же предоставлю примеры и открытый …

    Использованные термины


    Релевантные вопросы