Ú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í.
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