Как сделать чтобы все артикулы распределялись по фильтрам?

Код:

import requests
from bs4 import BeautifulSoup
from openpyxl import Workbook
import time
from multiprocessing import Pool
import multiprocessing
import json
start_time = time.time()
wb = Workbook()
wb.remove(wb.active)
ws = wb.create_sheet('Фильтры')
ws.append(['Артикул'])

cookies = {
'ASP.NET_SessionId': 'i1gip0fre5uzl4iqlkubv1cp',
'SLG_G_WPT_TO': 'ru',
'SLG_GWPT_Show_Hide_tmp': '1',
'SLG_wptGlobTipTmp': '1',
'ICusrcartgd': 'be6d8ad2-c52e-49b8-83b2-f384a9feaa60',
'IWusrsesckgd': 'jojhbQMjYWEdV9ohRKijJKalgxKEvPEPzVqoH/F2376n50ziaNRcMA==',
}

headers = {
'authority': 'catalog.aquamarine.kz',
'sec-ch-ua': '" Not A;Brand";v="99", "Chromium";v="99", "Opera GX";v="85"',
'accept': 'application/json, text/javascript, */*; q=0.01',
'content-type': 'application/x-www-form-urlencoded; charset=UTF-8',
'x-requested-with': 'XMLHttpRequest',
'sec-ch-ua-mobile': '?0',
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.84 Safari/537.36 OPR/85.0.4341.79',
'sec-ch-ua-platform': '"Windows"',
'origin': 'https://catalog.aquamarine.kz',
'sec-fetch-site': 'same-origin',
'sec-fetch-mode': 'cors',
'sec-fetch-dest': 'empty',
'referer': 'https://catalog.aquamarine.kz/catalog/index.aspx',
'accept-language': 'ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7',
# Requests sorts cookies= alphabetically
# 'cookie': 'ASP.NET_SessionId=i1gip0fre5uzl4iqlkubv1cp; SLG_G_WPT_TO=ru; SLG_GWPT_Show_Hide_tmp=1; SLG_wptGlobTipTmp=1; ICusrcartgd=be6d8ad2-c52e-49b8-83b2-f384a9feaa60; IWusrsesckgd=jojhbQMjYWEdV9ohRKijJKalgxKEvPEPzVqoH/F2376n50ziaNRcMA==',
}


data = {
'msearch': '',
}
def paginations(cookies, headers, data): # Получение пагинации
    r = requests.post(f'https://catalog.aquamarine.kz/catalog/products.ashx?rnd=806161821&q=&spec=&mip=317&map=7777%20777&mippg=161&mappg=5466%20222&miw=0.14&maw=137.74&miq=1&maq=241&miprcs=999999.999&maprcs=0&page=1&sort=art-down&view=2&spc=1,&brid=7,&{filterUrl}', headers=headers, cookies = cookies, data=data).text
    jsn =json.loads(r)
    return jsn['totalPages']


def get_filters(cookies, headers): # получение всех имеющих фильтров к примеру {'Родирование': 'cid-3'} значение ключа нужно для получения данных по пост запросу
    list = {}
    r = requests.get('https://catalog.aquamarine.kz/catalog/index.aspx', headers=headers, cookies=cookies)
    soup = BeautifulSoup(r.text, 'lxml')
    filter = soup.find('table', class_='selector')
    filters = filter.find_all('label')
    for i in filters:
        list[i.text] = i['for']
    return list

def read_filters(): # Читает файл с фильтрами которые нужно спарсить и возращает список с фильтрами.
    with open('filter.txt', 'r', encoding='utf-8') as f:
        lines = f.readlines()
    return lines

def get_page(cookies, headers, data,page): # Запросы к страницам
    return requests.post(page, headers=headers, cookies=cookies, data=data)

def getUrls(): # Получение списка страниц
    sites = [] # Список для хранения ссылок
    filters = read_filters() # Список фильтров в файле
    filtersPage = get_filters(cookies, headers) # Словарь со всеми фильтрами из страницы
    for filter in filters:
        filter = filter.replace('\n', '').strip() # Убираем переносы строк и пробелы.
        filterUrl = filtersPage[filter].replace('-', '=') # Дастаём ключ из словаря со всеми фильтрами и заменяем на знак = (для пост запроса)
        pagination = int(paginations(cookies, headers, data, filterUrl)) # Находим пагинацию для каждого фильтра
        for page in range(1, pagination+1): # Создаём список со ссылками на страницы
            sites.append(f'https://catalog.aquamarine.kz/catalog/products.ashx?q=&spec=&mip=317&map=7777%20777&mippg=161&mappg=5466%20222&miw=0.14&maw=137.74&miq=1&maq=241&miprcs=999999.999&maprcs=0&page={page}&sort=art-down&view=2&spc=1,&brid=7,&{filterUrl}')
    return sites
    


def get_data(url,headers,cookies,data, filterName): # Получение данных
    soup = BeautifulSoup(get_page(cookies, headers, data,url).text.replace('\\', ' '), 'lxml')
    contain = soup.find('div', class_='products')
    products = contain.find_all('div', class_='item wide') # Получение карточек
    data_page = []
    for product in products:
        link = 'https://catalog.aquamarine.kz'+(product.find('a').get('href')) # Ссылка на карточку
        req = requests.get(link, headers=headers, cookies=cookies) 
        soup = BeautifulSoup(req.text, 'lxml')
        articul = soup.find('td', text = 'Артикул').find_next_sibling('td').text # Артикул  
        data_page.append([articul])
    return data_page

def main():
    urls = getUrls()
    records = [(url, headers, cookies,data) for url in urls]
    with Pool(multiprocessing.cpu_count()) as p:
        name = p.starmap(get_data, records)
        p.close()
        p.join()
    for x in name:
        for y in x:
            ws.append(y) # Добавляет все артикулы
        # Сохранение файла
    wb.save('Data.xlsx')
    print(time.time()-start_time)
    
   
if __name__ == '__main__':
    main()

Мой парсер отдаёт мне xlsx файл где просто все артикулы, которые подходят под фильтр. Мне надо чтобы сверху таблицы был написан фильтр и только потом артикулы. Я долго думал и так и не понял как это сделать, учитывая то что у меня мультипроцессорность. Может быть мне нужно в переменную records передавать название фильтра и потом выводит в return main() и уже после в xlsx файл. Но в общем я так и не понял как это сделать. Буду очень благодарен если кто-то поймёт как это делается. Код я про комментировал как мог если что-то не понятно можете написать.


Ответы (0 шт):