Spaces:
Sleeping
Sleeping
| import gradio as gr | |
| import pandas as pd | |
| import logging | |
| import requests | |
| from urllib.parse import quote | |
| import yaml | |
| class Products: | |
| data = [] # Список, в котором будут словари | |
| def read_yaml_file(self, filename): | |
| """Read the data from a YAML file and return a list of dictionaries""" | |
| with open(filename, 'r') as file: | |
| self.data = yaml.load(file, Loader=yaml.FullLoader) | |
| def write_yaml_file(self, filename): | |
| """Write the data in YAML format to a file""" | |
| with open(filename, 'w') as file: | |
| yaml.dump(self.data, file) | |
| def sortProducts(self, criteria: str, order: bool = False): | |
| """Sort list of products by given criteria: | |
| \n price - price of a product | |
| \n rating - total rating of a seller | |
| \n sold - the amount of items sold | |
| \n\n order - asc=0, desc=1 | |
| """ | |
| self.data.sort(key=operator.itemgetter(criteria), reverse=order) | |
| def parseAPI(self, query): | |
| """Find all elements on page and store them into the dictionary using plati.ru API""" | |
| self.data = [] | |
| pagesize = 499 | |
| contents = requests.get(f"https://plati.io/api/search.ashx?query={quote(query)}&pagesize={pagesize}&visibleOnly=true&response=json").json() | |
| total_pages = int(contents['Totalpages']) | |
| for entry in contents['items']: | |
| self.data.append( | |
| {'name': entry['name'], 'link': entry['url'], 'price': int(entry['price_rur']), 'rating': float(entry['seller_rating']), 'sold': int(entry['numsold'])}) | |
| if total_pages > 1: | |
| for i in range(2, total_pages + 1): | |
| contents = requests.get(f"https://plati.io/api/search.ashx?query={quote(query)}&pagesize={pagesize}&pagenum={i}&visibleOnly=true&response=json").json() | |
| for entry in contents['items']: | |
| self.data.append( | |
| {'name': entry['name'], 'link': entry['url'], 'price': int(entry['price_rur']), 'rating': float(entry['seller_rating']), 'sold': int(entry['numsold'])}) | |
| # Функция поиска, которая будет вызываться из интерфейса Gradio | |
| def search(query): | |
| logging.info(f"Search started with query: {query}") | |
| products = Products() | |
| products.parseAPI(query) | |
| products.write_yaml_file("cache.yaml") | |
| products.read_yaml_file("cache.yaml") | |
| logging.info(f"Search results: {products.data}") | |
| # Создаем новый DataFrame из списка словарей products.data | |
| df = pd.DataFrame(products.data) | |
| return df # Возвращаем DataFrame | |
| # Добавляем функцию greet для демонстрации | |
| def greet(name): | |
| return "Hello " + name + "!!" | |
| # Создание Gradio интерфейса | |
| def create_interface(): | |
| with gr.Blocks() as demo: | |
| gr.Markdown("# Plati.market Parser and Greet Function") | |
| gr.Markdown("### Greeting Section") | |
| greet_input = gr.Textbox(label="Enter your name") | |
| greet_button = gr.Button("Greet") | |
| greet_output = gr.Textbox(label="Greeting") | |
| greet_button.click(fn=greet, inputs=greet_input, outputs=greet_output) | |
| gr.Markdown("### Plati.market Search Section") | |
| gr.Markdown("Input what you like to find in the field below. The results will be displayed in the table.") | |
| search_input = gr.Textbox(label="Search Query") | |
| search_button = gr.Button("Search") | |
| data_table = gr.Dataframe(headers=["name", "link", "price", "rating", "sold"], interactive=True, label="Search Results") | |
| search_button.click(fn=search, inputs=search_input, outputs=data_table) | |
| return demo | |
| if __name__ == "__main__": | |
| # Настройка логирования | |
| logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s') | |
| demo = create_interface() | |
| demo.launch() |