Почему выходит ошибка после конвертации в exe?
Кто-то знает как исправить эту ошибку? Использую auto-py-to-exe Код:
import requests
from bs4 import BeautifulSoup
from openpyxl import Workbook
import time
from multiprocessing import Pool
import multiprocessing
from art import tprint
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, filterUrl): # Получение пагинации
json = 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).json()
return json['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}', filter])
return sites
def get_data(url,headers,cookies,data): # Получение данных
soup = BeautifulSoup(get_page(cookies, headers, data,url[0]).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,url[1]])
return data_page
def main():
start_time = time.time()
tprint('Parser Aquamarine.kz started', font='slant')
print('Подождите пожалуйста, идёт парсинг. Он может занимать много времени, смотря от количества фильтров и страниц.')
wb = Workbook()
wb.remove(wb.active)
ws = wb.create_sheet('Фильтры')
ws.append(['Артикул','Название фильтра'])
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(f'Парсинг занял {round((time.time()-start_time)/60, 1)} минут')
if __name__ == '__main__':
main()
Заметил ещё одну странность что если я добавляю фильтр через блокнот, то получается вот что

Ответы (1 шт):
Автор решения: RuCat
→ Ссылка
Нужно изменить функцию на
def read_filters(): # Читает файл с фильтрами которые нужно спарсить и возращает список с фильтрами.
with open('filter.txt', 'r',encoding='ANSI') as f:
lines = f.readlines()
return lines
Поменять кодировку на ANSI, потому что блокнот использует её
