Спарсить масло с сайта по подбору зап. частей

Рейтинг: -3Ответов: 2Опубликовано: 12.05.2023

Нужно чтобы при вводе марки и модели авто выдавалось масло которое подходит под конкретный автомобиль.

Сайт с которого нужно спарсить поиск: https://www.kroon-oil.com/ru/

import requests
from bs4 import BeautifulSoup as BS
query = input('Введите марку и модель авто: ')
api_url = 'https://www.kroon-oil.com/api/carlist.json'
car_models = requests.post(api_url, json={"query":query}).json()

try:
    car = car_models['response'][0]
except:
    car = car_models['response'][1]
base_url = 'https://www.kroon-oil.com/ru/product-recommendation/cars/{}/{}/{}/{}'
url = base_url.format(car['make_url_name'],
                      car['model_url_name'],
                      car['type_url_name'],
                      car['type_id'])
soup = BS(requests.get(url).content, 'lxml')
sections = soup.find_all('h2')
for section in sections:
    print(section.text.strip('\n'))
    section_url = url+'/'+section.parent['data-componentid']
    soup = BS(requests.get(section_url).content, 'lxml')
    try:
        products = soup.find('ul', class_='recommended-products').find_all('h3')
    except:
        break
    for product in products:
        print('\t{}'.format(product.text))

Ответы

▲ 1

Весь представленный вами код можно сократить до нескольких строчек, если использовать XHR. Как анализировать сайты в браузере в вкладке Network можно посмотреть в других моих ответах, например здесь.

import requests
query = 'Touareg'
api_url = 'https://www.kroon-oil.com/api/carlist.json'
car_models = requests.post(api_url, json={"query":query}).json()

Всё, теперь у нас в car_models список всех автомобилей найденных по запросу.
Но дальше необходимо выбрать автомобиль и получить масло, верно?
Возьмём какую-нибудь отдельно взятую модель, например мою любимую, дизельную. Посмотрим что есть в выданном .
car_models['response'][1]:

{'label_minimal': 'Volkswagen (VW) (EU) Touareg 2.5 TDI DPF (2006-2010)',
 'label': 'Volkswagen (VW) (EU) Touareg 7L Touareg 2.5 TDI DPF (2006-2010)',
 'type_id': 31013,
 'type_url_name': 'touareg-25-tdi-dpf',
 'model_url_name': 'touareg-7l',
 'model_name': 'Touareg 7L',
 'make_url_name': 'volkswagen-vw-eu',
 'make_name': 'Volkswagen (VW) (EU)',
 'category_url_name': 'cars',
 'category_name': 'Cars'}

Ссылка на результирующую страницу собирается из этих данных, и по ней уже, к сожалению, api нет, придётся парсить масло со страницы.
Причём сами рекомендации масла по секциям загружаются в отдельных страницах, так что запросов будет много. Если, конечно, необходимо раскрыть все секции.

from bs4 import BeautifulSoup as BS

car = car_models['response'][1]
base_url = 'https://www.kroon-oil.com/ru/product-recommendation/cars/{}/{}/{}/{}'
url = base_url.format(car['make_url_name'],
                      car['model_url_name'],
                      car['type_url_name'],
                      car['type_id'])
soup = BS(requests.get(url).content, 'lxml')
sections = soup.find_all('h2')
for section in sections:
    print(section.text.strip('\n'))
    section_url = url+'/'+section.parent['data-componentid']
    soup = BS(requests.get(section_url).content, 'lxml')
    products = soup.find('ul', class_='recommended-products').find_all('h3')
    for product in products:
        print('\t{}'.format(product.text))

Вывод:

Двигатель BPD, BPE
    Helar SP LL-03 5W-30
Дифференциал задний 
    SP Gear 1011
    Syngear TDL 75W-90
Дифференциал задний самоблокирующийся (4x4)
    SP Gear 1071
Дифференциал передний 
    SP Gear 1011
    Syngear TDL 75W-90
Коробка передач в блоке с главной передачей автом 09D 6/1
    SP Matic 4026
Коробка передач в блоке с главной передачей механ 08D 6/1
    SP Gear 5015
Раздаточная коробка 0AD
    SP Gear 1081
Гидравлические тормоза/система сцепления 
    Drauliquid-LV Super DOT 4
Усилитель рулевого управления 
    SP Fluid 3013
Система охлаждения 
    Coolant SP 13
    Coolant SP 12

По вашему коду. Лучше использовать lxml, если он отрабатывает, он быстрее. html.parser стоит использовать только когда что-то парсится неправильно и / или отсуствует.

Всё что ниже, в супе, как указал выше в ответе, найдётся в лучшем случае только одна секция.

А ещё всем новичкам крайне полезно пройти тур.

▲ 0

введите сюда описание изображенияМожно это реализовать вот так:

import requests
from bs4 import BeautifulSoup
import re
query = "тут поидее должен быть input"
query = query.replace(' ', '+')
URL = f"https://www.kroon-oil.com/ru/product-recommendation/cars/nissan-eu/100-nx/100-nx-16-b13/24048/1577/#!/component:1577/"
USER_AGENT = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:65.0) Gecko/20100101 Firefox/65.0"
headers = {"user-agent": USER_AGENT}
resp = requests.get(URL, headers=headers)
dict_fuel = []
if resp.status_code == 200:
    soup = BeautifulSoup(resp.content, "lxml")
    for i in range(len(soup.find_all('h3'))):

        val = soup.find_all('h3')[i].text
        print(re.sub('[ЁёА-я]', '', val).rstrip())