پروژه هشتم پایتون : استخراج لینک از وب

خب وسایلی که نیاز دارید :

  • پایتون

  • کتابخانه requests

  • کتابخانه beautifulsoup4

  • کتابخانه pyperclip

  • کتابخانه tkinter

خب پس از نصب کتابخانه های لازم کد زیر را داخل پایتون وارد میکنیم .

import tkinter as tk
from tkinter import ttk
from tkinter import messagebox
import requests
from bs4 import BeautifulSoup
import pyperclip # کتابخانه برای دسترسی به کلیپبورد

# تابع استخراج لینکها
def fetch_and_extract_links(url):
    links = set() # استفاده از set برای جلوگیری از تکرار لینکها
    try:
        response = requests.get(url, timeout=10)
        response.raise_for_status() # بررسی خطاهای HTTP
        soup = BeautifulSoup(response.text, 'html.parser')
        
        for link_tag in soup.find_all('a', href=True):
            href = link_tag['href']
            # پاکسازی لینکها و تبدیل لینکهای نسبی به مطلق
            if href.startswith('#') or href.startswith(''):
                continue
            
            # تبدیل لینک نسبی به مطلق
            if not href.startswith('http://') and not href.startswith('https://'):
                from urllib.parse import urljoin
                href = urljoin(url, href)
                
            links.add(href)
            
    except requests.exceptions.RequestException as e:
        messagebox.showerror("خطای درخواست", f"خطا در دریافت آدرس: {e}")
        return None
    except Exception as e:
        messagebox.showerror("خطای تجزیه", f"خطا در پردازش صفحه: {e}")
        return None
        
    return sorted(list(links)) # مرتبسازی لینکها قبل از بازگرداندن

# تابع برای پیست کردن آدرس از کلیپبورد
def paste_from_clipboard():
    try:
        clipboard_content = pyperclip.paste()
        url_entry.delete(0, tk.END) # پاک کردن محتوای فعلی فیلد
        url_entry.insert(0, clipboard_content) # درج محتوای کلیپبورد
    except Exception as e:
        messagebox.showerror("خطای کلیپبورد", f"امکان پیست کردن وجود ندارد: {e}")

# تابع برای کپی کردن نتایج استخراج شده
def copy_results_to_clipboard():
    try:
        results_content = results_text.get("1.0", tk.END) # دریافت کل متن از ناحیه نتایج
        if results_content.strip(): # فقط اگر محتوایی وجود دارد کپی کن
            pyperclip.copy(results_content)
            status_label.config(text="نتایج در کلیپبورد کپی شد!")
        else:
            messagebox.showwarning("محتوای خالی", "هیچ لینکی برای کپی کردن وجود ندارد.")
    except Exception as e:
        messagebox.showerror("خطای کپی", f"امکان کپی کردن نتایج وجود ندارد: {e}")

# تابع برای نمایش لینکها در رابط کاربری
def display_links():
    url = url_entry.get().strip()
    if not url:
        messagebox.showwarning("ورودی نامعتبر", "لطفاً یک آدرس URL معتبر وارد کنید.")
        return
        
    # افزودن http:// اگر کاربر وارد نکرده باشد
    if not url.startswith('http://') and not url.startswith('https://'):
        url = 'http://' + url
        url_entry.delete(0, tk.END)
        url_entry.insert(0, url)

    status_label.config(text="در حال استخراج لینکها...")
    results_text.config(state=tk.NORMAL)
    results_text.delete('1.0', tk.END) # پاک کردن نتایج قبلی
    results_text.config(state=tk.DISABLED)
    
    app.update_idletasks() # بهروزرسانی رابط کاربری قبل از عملیات طولانی

    extracted_links = fetch_and_extract_links(url)
    
    results_text.config(state=tk.NORMAL)
    if extracted_links is not None:
        if extracted_links:
            for link in extracted_links:
                results_text.insert(tk.END, link + '\n')
            status_label.config(text=f"تعداد {len(extracted_links)} لینک پیدا شد.")
            copy_button.config(state=tk.NORMAL) # فعال کردن دکمه کپی
        else:
            status_label.config(text="هیچ لینکی در صفحه یافت نشد.")
            copy_button.config(state=tk.DISABLED) # غیرفعال کردن دکمه کپی
    else:
        status_label.config(text="عملیات با خطا مواجه شد.")
        copy_button.config(state=tk.DISABLED) # غیرفعال کردن دکمه کپی
        
    results_text.config(state=tk.DISABLED)


# --- ساخت رابط کاربری ---
app = tk.Tk()
app.title("استخراج لینک از وب")
app.geometry("700x600") # تنظیم اندازه پنجره

# فریم اصلی
main_frame = ttk.Frame(app, padding="10")
main_frame.pack(fill=tk.BOTH, expand=True)

# فریم ورودی URL و دکمهها
input_frame = ttk.Frame(main_frame)
input_frame.pack(fill=tk.X, pady=5)

# برچسب URL
url_label = ttk.Label(input_frame, text="آدرس URL:")
url_label.pack(side=tk.LEFT, padx=5)

# فیلد ورودی URL
url_entry = ttk.Entry(input_frame, width=50)
url_entry.pack(side=tk.LEFT, fill=tk.X, expand=True, padx=5)

# دکمه پیست (جدید)
paste_button = ttk.Button(input_frame, text="پیست", command=paste_from_clipboard)
paste_button.pack(side=tk.LEFT, padx=5)

# دکمه استخراج
extract_button = ttk.Button(input_frame, text="استخراج لینکها", command=display_links)
extract_button.pack(side=tk.LEFT, padx=5)

# دکمه کپی نتایج (جدید)
copy_button = ttk.Button(input_frame, text="کپی نتایج", command=copy_results_to_clipboard, state=tk.DISABLED) # در ابتدا غیرفعال
copy_button.pack(side=tk.LEFT, padx=5)

# ناحیه نمایش نتایج
results_text = tk.Text(main_frame, wrap=tk.WORD, state=tk.DISABLED, font=("Arial", 10))
results_text.pack(fill=tk.BOTH, expand=True, pady=10)

# نوار اسکرول برای ناحیه نتایج
scrollbar = ttk.Scrollbar(results_text, orient=tk.VERTICAL, command=results_text.yview)
scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
results_text.config(yscrollcommand=scrollbar.set)

# برچسب وضعیت
status_label = ttk.Label(main_frame, text="آماده")
status_label.pack(fill=tk.X, pady=5)

# --- اجرای برنامه ---
# اطمینان از نصب بودن pyperclip
try:
    import pyperclip
except ImportError:
    messagebox.showerror("خطای وابستگی", "لطفاً کتابخانه 'pyperclip' را نصب کنید: pip install pyperclip")
    app.destroy() # بستن برنامه اگر کتابخانه نصب نباشد

app.mainloop()
فایل نهایی
فایل نهایی

الان وقتی کد را بزنیم ، صفحه بالا را میبینیم .

حالا اگر لینک را کپی کنیم و روی پیست کلیک کنیم و استخراج را بزنیم صفحه زیر را میبینید .

برای دانلود همین پایتون یا فایل تبدیل شده به برنامه روی نوشته لینک بزنید و 15ثانیه صبر کنید و فایل را دریافت کنید .

اینم از این پروژه اگر ایده یا سوالی دارید در نظرات بنویسید .