webscraping / app.py
MuratKomurcu's picture
Update app.py
aff42bd verified
# Gerekli kütüphaneleri içe aktarıyoruz.
# Bu kütüphaneleri kurmak için: pip install gradio requests beautifulsoup4
import gradio as gr
import requests
from bs4 import BeautifulSoup
# --- Çekirdek Mantık (Önceki Script'ten Uyarlanmış) ---
HEADERS = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
}
def scrape_wikipedia_article(url: str):
"""
Kullanıcının girdiği URL'den Wikipedia makalesini çeker ve işler.
Bu fonksiyon, Gradio arayüzünün "beyni" olarak çalışacaktır.
Args:
url (str): Kullanıcının Gradio arayüzünden girdiği Wikipedia URL'si.
Returns:
tuple: (Başlık, Paragraf Sayısı, Paragrafların Markdown Formatı)
veya hata durumunda (Hata Mesajı, 0, "")
"""
# URL'nin geçerli bir Wikipedia adresi olup olmadığını basitçe kontrol edelim.
if not url or "wikipedia.org" not in url:
return "Lütfen geçerli bir Wikipedia URL'si girin.", 0, ""
try:
# --- Veri Çekme (Scraping) ---
response = requests.get(url, headers=HEADERS, timeout=10)
response.raise_for_status()
soup = BeautifulSoup(response.content, "html.parser")
# --- Veri Ayrıştırma (Parsing) ---
# Sayfa başlığını <h1 id="firstHeading"> etiketinden alalım.
page_title_element = soup.find('h1', id='firstHeading')
page_title = page_title_element.text if page_title_element else "Başlık Bulunamadı"
content_div = soup.find('div', class_='mw-parser-output')
if not content_div:
return f"'{page_title}' sayfasında ana içerik alanı bulunamadı.", 0, ""
paragraphs_html = content_div.find_all('p')
# --- Veri Temizleme ve Formatlama ---
cleaned_paragraphs = [p.get_text(strip=True) for p in paragraphs_html if len(p.get_text(strip=True)) > 50]
paragraph_count = len(cleaned_paragraphs)
if paragraph_count == 0:
return f"'{page_title}' sayfasında yeterli uzunlukta paragraf bulunamadı.", 0, ""
# Çıktıyı daha okunaklı hale getirmek için Markdown formatını kullanalım.
# Her paragrafı bir liste elemanı olarak formatlayalım.
markdown_output = "\n".join([f"- {p}\n" for p in cleaned_paragraphs])
return page_title, paragraph_count, markdown_output
except requests.exceptions.RequestException as e:
error_message = f"Ağ hatası: URL'ye ulaşılamadı. Lütfen adresi kontrol edin.\nDetay: {e}"
return "Hata", 0, error_message
except Exception as e:
error_message = f"Beklenmedik bir hata oluştu: {e}"
return "Hata", 0, error_message
# --- Gradio Arayüzü Tanımlaması ---
# Uygulamanın nasıl görüneceğini ve davranacağını tanımlıyoruz.
# with gr.Blocks() as iface: daha gelişmiş arayüzler için kullanılır.
with gr.Blocks(theme=gr.themes.Soft()) as demo:
gr.Markdown(
"""
# Wikipedia Makale Çekme ve Analiz Aracı
Aşağıya bir Wikipedia makalesinin URL'sini yapıştırın ve "Analiz Et" butonuna tıklayarak
sayfadaki paragrafları çekin.
"""
)
# Girdi ve Çıktı Alanları
with gr.Row():
# Sol taraf: Girdiler
with gr.Column(scale=1):
url_input = gr.Textbox(
label="Wikipedia URL'si",
placeholder="https://tr.wikipedia.org/wiki/Yapay_zeka"
)
submit_btn = gr.Button("Analiz Et", variant="primary")
# Analiz sonuçları için küçük bilgi kutucukları
with gr.Row():
article_title_output = gr.Textbox(label="Makale Başlığı", interactive=False)
paragraph_count_output = gr.Number(label="Paragraf Sayısı", interactive=False)
# Sağ taraf: Çıktılar
with gr.Column(scale=2):
main_output = gr.Markdown(label="Çekilen Paragraflar")
# Butona tıklandığında ne olacağını belirliyoruz.
# fn: Hangi fonksiyon çalışacak? (scrape_wikipedia_article)
# inputs: Fonksiyona hangi girdi gidecek? (url_input)
# outputs: Fonksiyondan dönen sonuçlar hangi çıktı alanlarına gidecek?
submit_btn.click(
fn=scrape_wikipedia_article,
inputs=url_input,
outputs=[article_title_output, paragraph_count_output, main_output]
)
# Kullanıcıların denemesi için örnek URL'ler
gr.Examples(
["https://tr.wikipedia.org/wiki/Kuantum_bilgisayar%C4%B1", "https://tr.wikipedia.org/wiki/Makine_%C3%B6%C4%9Frenmesi"],
inputs=url_input
)
# --- Uygulamayı Başlatma ---
# Hugging Face Spaces, bu satırı gördüğünde uygulamayı başlatır ve sunar.
# Bu satır olmadan, script biter ve "application not initialized" hatası alırsınız.
demo.launch()