روبیکا من : https://rubika.ir/artinkarimian3 سایت من : https://sites.google.com/view/artin-karimian
پروژه هشتم پایتون : استخراج لینک از وب

خب وسایلی که نیاز دارید :
پایتون
کتابخانه 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ثانیه صبر کنید و فایل را دریافت کنید .
اینم از این پروژه اگر ایده یا سوالی دارید در نظرات بنویسید .
مطلبی دیگر از این انتشارات
ساخت یک موتور جست و جو با پایتون
مطلبی دیگر از این انتشارات
سرور چیست؟ – آنچه باید بدانید به زبان ساده
مطلبی دیگر از این انتشارات
پروژه چهارم : همستر کامبت (ساده)