Úkol zněl jasně: " Mám velikou spoustu čísel v EXCELu a potřebuji je zkontrolovat na bezbečnost".
Když pominu že to nejspíše bude proti licenčnímu ujednání stránek, tak jsem si říkal že pro studium se to nezblázní.
Tady jsem si krapítko pohrál s TKinterem
import pandas as pd
import requests
from bs4 import BeautifulSoup
import re
import time
import tkinter as tk
from tkinter import filedialog, messagebox, scrolledtext
class PhoneLookupApp:
def __init__(self, root):
self.root = root
self.root.title("Vyhledávač telefonních čísel")
self.open_button = tk.Button(root, text="Otevřít Excel soubor", command=self.open_file)
self.open_button.pack(pady=10)
self.text_area = scrolledtext.ScrolledText(root, width=80, height=20)
self.text_area.pack()
self.save_button = tk.Button(root, text="Uložit výstup", command=self.save_output, state=tk.DISABLED)
self.save_button.pack(pady=10)
self.results = []
def log(self, message):
self.text_area.insert(tk.END, message + "\n")
self.text_area.see(tk.END)
self.root.update()
def open_file(self):
file_path = filedialog.askopenfilename(filetypes=[("Excel Files", "*.xlsx")])
if not file_path:
return
try:
df = pd.read_excel(file_path)
except Exception as e:
messagebox.showerror("Chyba", f"Nelze načíst soubor: {e}")
return
if 'cislo' not in df.columns:
messagebox.showerror("Chyba", "Soubor musí obsahovat sloupec 'cislo'.")
return
self.results = []
self.log("Zpracovávám telefonní čísla...\n")
for cislo in df['cislo']:
url = f'https://www.nejakaStrankaNaKontroluCisel.cz/cislo/{cislo}'
self.log(f"➡ {cislo}")
try:
response = requests.get(url, headers={'User-Agent': 'Mozilla/5.0'})
soup = BeautifulSoup(response.text, 'html.parser')
text = soup.get_text(separator=' ', strip=True)
h1 = soup.find('h1')
nadpis = h1.text.strip() if h1 else ''
nazev = 'Neznámé číslo' if nadpis.startswith('Telefonní číslo:') else nadpis
miranez_match = re.search(r'Míra nebezpečnosti:\s*(\d+\s*%)', text)
miranez = miranez_match.group(1) if miranez_match else 'Nezjištěno'
hodnoceni_match = re.search(r'Užitečné\s*(\d+)\s+Neutrální\s*(\d+)\s+Obtěžující\s*(\d+)\s+Nebezpečné\s*(\d+)', text)
if hodnoceni_match:
uzit, neut, obtez, nebez = hodnoceni_match.groups()
hodnoceni_str = f'Užitečné: {uzit}, Neutrální: {neut}, Obtěžující: {obtez}, Nebezpečné: {nebez}'
else:
hodnoceni_str = 'Bez hodnocení'
self.results.append({
'cislo': cislo,
'nazev': nazev,
'míra_nebezpečnosti': miranez,
'hodnocení_podrobně': hodnoceni_str
})
except Exception as e:
self.results.append({
'cislo': cislo,
'nazev': 'Chyba',
'míra_nebezpečnosti': '',
'hodnocení_podrobně': str(e)
})
time.sleep(1)
self.log("\n Hotovo! Teď můžeš výsledek uložit.")
self.save_button.config(state=tk.NORMAL)
def save_output(self):
if not self.results:
messagebox.showwarning("Pozor", "Nejsou žádná data k uložení.")
return
file_path = filedialog.asksaveasfilename(defaultextension=".xlsx", filetypes=[("Excel soubory", "*.xlsx")])
if not file_path:
return
df = pd.DataFrame(self.results)
try:
df.to_excel(file_path, index=False)
self.log(f" Výstup uložen do: {file_path}")
messagebox.showinfo("Uloženo", "Soubor byl úspěšně uložen.")
except Exception as e:
messagebox.showerror("Chyba", f"Nastala chyba při ukládání: {e}")
if __name__ == "__main__":
root = tk.Tk()
app = PhoneLookupApp(root)
root.mainloop()
← Zpět na seznam