Парсер интернет магазина на python, на примере wildberries

Часы
16.11.2024
Часы
15.04.2025
Часы
4 минуты
Глазик
144
Сердечки
0
Соединённые точки
0
Соединённые точки
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
Глазик
337
Сердечки
0
Соединённые точки
0
Соединённые точки
0
Соединённые точки
0
В этой статье я покажу как написать простой парсер на python, на примере того, как собирать изображения с сайта. Данный парсер представляет из себя пример того, как парсить статические и …

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

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

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


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