-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathmain.py
299 lines (253 loc) · 9.98 KB
/
main.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
import os
import customtkinter as ctk
from tkinter import messagebox
from datetime import datetime
from scrapy.crawler import CrawlerProcess
from scrapy.utils.project import get_project_settings
from mevzuat_scraper.spiders.mevzuat_metadata_scraper import MevzuatMetadataScraper
from mevzuat_scraper.spiders.mevzuat_spider import MevzuatSeleniumSpider
def get_output_filename(filename, is_metadata=False):
if not filename:
filename = 'mevzuat.json'
if not filename.endswith('.json'):
filename += '.json'
# Metadata çıktıları için dosya adına "_metadata" ekle
if is_metadata:
name, ext = os.path.splitext(filename)
filename = f"{name}_metadata{ext}"
return filename
# Scrapy örümceğini başlatan fonksiyon
def run_spider(start_year=None, end_year=None, filename=None, mevzuat_turu="Kanun"):
filename = get_output_filename(filename, is_metadata=False)
settings = get_project_settings()
settings.set('FEEDS', {
filename: {
'format': 'json',
'encoding': 'utf8',
'overwrite': True
}
})
process = CrawlerProcess(settings)
process.crawl(MevzuatSeleniumSpider,
start_year=start_year,
end_year=end_year,
mevzuat_turu=mevzuat_turu)
process.start()
# Başlangıç ve bitiş yılı girişlerini almak için Tkinter GUI
def start_gui():
def on_submit():
selected_type = mevzuat_turu_var.get()
if selected_type in ["Cumhurbaşkanı Kararları", "Cumhurbaşkanlığı Genelgeleri"]:
messagebox.showwarning(
"Desteklenmeyen Mevzuat Türü",
"Seçilen mevzuat türü için tam metin çekimi desteklenmemektedir. Metaverileri çekerek doküman linklerini alabilirsiniz. Lütfen farklı bir mevzuat türü seçiniz."
)
return
start_year, end_year = validate_years(entry_start_year.get(), entry_end_year.get())
if start_year is not None and end_year is not None:
filename = get_output_filename(entry_filename.get(), is_metadata=False)
root.destroy()
run_spider(start_year, end_year, filename, mevzuat_turu_var.get())
def fetch_all():
selected_type = mevzuat_turu_var.get()
if selected_type in ["Cumhurbaşkanı Kararları", "Cumhurbaşkanlığı Genelgeleri"]:
messagebox.showwarning(
"Desteklenmeyen Mevzuat Türü",
"Seçilen mevzuat türü için tam metin çekimi desteklenmemektedir. Metaverileri çekerek doküman linklerini alabilirsiniz. Lütfen farklı bir mevzuat türü seçiniz."
)
return
filename = get_output_filename(entry_filename.get(), is_metadata=False)
root.destroy()
run_spider(filename=filename, mevzuat_turu=mevzuat_turu_var.get())
def fetch_metadata():
start_year, end_year = validate_years(entry_start_year.get(), entry_end_year.get())
if start_year is not None and end_year is not None:
filename = get_output_filename(entry_filename.get(), is_metadata=True)
root.destroy()
scraper = MevzuatMetadataScraper()
data = scraper.fetch_data(
start_year=start_year,
end_year=end_year,
mevzuat_turu=mevzuat_turu_var.get()
)
scraper.save_to_json(data, filename)
def fetch_all_metadata():
filename = get_output_filename(entry_filename.get(), is_metadata=True)
root.destroy()
scraper = MevzuatMetadataScraper()
data = scraper.fetch_data(mevzuat_turu=mevzuat_turu_var.get())
scraper.save_to_json(data, filename)
# CustomTkinter ayarları
ctk.set_appearance_mode("System")
ctk.set_default_color_theme("blue")
root = ctk.CTk()
root.title("Mevzuat Veri Toplama Aracı")
root.geometry("1000x700") # Daha geniş pencere
# Ana frame
main_frame = ctk.CTkFrame(root, fg_color="transparent")
main_frame.pack(padx=40, pady=30, fill="both", expand=True)
# Başlık
title_label = ctk.CTkLabel(
main_frame,
text="Mevzuat Veri Toplama Aracı",
font=("Segoe UI", 32, "bold"),
text_color=["#1a1a1a", "#ffffff"]
)
title_label.pack(pady=(0, 30))
# Giriş alanları için frame
input_frame = ctk.CTkFrame(main_frame, fg_color="transparent")
input_frame.pack(fill="x", pady=20)
input_frame.grid_columnconfigure((0, 1), weight=1, pad=20)
# Sol panel - Yıl girişleri
year_frame = ctk.CTkFrame(input_frame)
year_frame.grid(row=0, column=0, sticky="nsew", padx=10)
year_label = ctk.CTkLabel(
year_frame,
text="Yıl Aralığı",
font=("Segoe UI", 18, "bold"),
pady=15
)
year_label.pack()
entry_start_year = ctk.CTkEntry(
year_frame,
placeholder_text="Başlangıç Yılı (min: 1900)",
height=40,
font=("Segoe UI", 14)
)
entry_start_year.pack(padx=20, pady=10, fill="x")
entry_end_year = ctk.CTkEntry(
year_frame,
placeholder_text=f"Bitiş Yılı (max: {datetime.now().year})",
height=40,
font=("Segoe UI", 14)
)
entry_end_year.pack(padx=20, pady=10, fill="x")
# Sağ panel - Ayarlar
settings_frame = ctk.CTkFrame(input_frame)
settings_frame.grid(row=0, column=1, sticky="nsew", padx=10)
settings_label = ctk.CTkLabel(
settings_frame,
text="Çıktı Ayarları",
font=("Segoe UI", 18, "bold"),
pady=15
)
settings_label.pack()
entry_filename = ctk.CTkEntry(
settings_frame,
placeholder_text="Çıktı Dosya Adı",
height=40,
font=("Segoe UI", 14)
)
entry_filename.pack(padx=20, pady=10, fill="x")
entry_filename.insert(0, "mevzuat.json")
mevzuat_turu_var = ctk.StringVar(value="Kanun")
mevzuat_turu = ctk.CTkComboBox(
settings_frame,
values=list(MevzuatMetadataScraper.MEVZUAT_TURLERI.keys()),
height=40,
font=("Segoe UI", 14),
dropdown_font=("Segoe UI", 14),
variable=mevzuat_turu_var
)
mevzuat_turu.pack(padx=20, pady=10, fill="x")
# İşlem butonları
button_frame = ctk.CTkFrame(main_frame, fg_color="transparent")
button_frame.pack(fill="x", pady=30)
button_frame.grid_columnconfigure((0, 1), weight=1, pad=20)
# Tam Metin İşlemleri
text_ops_frame = ctk.CTkFrame(button_frame)
text_ops_frame.grid(row=0, column=0, sticky="nsew", padx=10)
text_label = ctk.CTkLabel(
text_ops_frame,
text="Tam Metin İşlemleri",
font=("Segoe UI", 18, "bold"),
pady=15
)
text_label.pack()
submit_button = ctk.CTkButton(
text_ops_frame,
text="Yıl Aralığına Göre Tüm Metni Çek",
command=on_submit,
height=45,
font=("Segoe UI", 14),
fg_color=["#2d7cd6", "#2d7cd6"],
hover_color=["#2666b0", "#2666b0"]
)
submit_button.pack(padx=20, pady=10, fill="x")
all_button = ctk.CTkButton(
text_ops_frame,
text="Tüm Metinleri Çek",
command=fetch_all,
height=45,
font=("Segoe UI", 14),
fg_color=["#2d7cd6", "#2d7cd6"],
hover_color=["#2666b0", "#2666b0"]
)
all_button.pack(padx=20, pady=10, fill="x")
# Meta Veri İşlemleri
meta_ops_frame = ctk.CTkFrame(button_frame)
meta_ops_frame.grid(row=0, column=1, sticky="nsew", padx=10)
meta_label = ctk.CTkLabel(
meta_ops_frame,
text="Meta Veri İşlemleri",
font=("Segoe UI", 18, "bold"),
pady=15
)
meta_label.pack()
metadata_button = ctk.CTkButton(
meta_ops_frame,
text="Yıl Aralığına Göre Meta Veri Çek",
command=fetch_metadata,
height=45,
font=("Segoe UI", 14),
fg_color=["#2d7cd6", "#2d7cd6"],
hover_color=["#2666b0", "#2666b0"]
)
metadata_button.pack(padx=20, pady=10, fill="x")
all_metadata_button = ctk.CTkButton(
meta_ops_frame,
text="Tüm Meta Verileri Çek",
command=fetch_all_metadata,
height=45,
font=("Segoe UI", 14),
fg_color=["#2d7cd6", "#2d7cd6"],
hover_color=["#2666b0", "#2666b0"]
)
all_metadata_button.pack(padx=20, pady=10, fill="x")
# Bilgi metni
info_frame = ctk.CTkFrame(main_frame)
info_frame.pack(fill="x", pady=20)
info_text = """Tam Metin: Mevzuatın tam içeriğini çeker (Selenium kullanır)
Meta Veri: Sadece özet bilgileri çeker"""
info_label = ctk.CTkLabel(
info_frame,
text=info_text,
font=("Segoe UI", 12),
justify="left",
wraplength=900,
pady=15
)
info_label.pack(padx=20)
root.mainloop()
def validate_years(start_year, end_year):
current_year = datetime.now().year
if not start_year or not end_year:
messagebox.showerror("Hata", "Başlangıç ve Bitiş yılı boş bırakılamaz.")
return None, None
if not start_year.isdigit() or not end_year.isdigit():
messagebox.showerror("Hata", "Yıllar sayısal olmalı.")
return None, None
start_year = int(start_year)
end_year = int(end_year)
if start_year < 1900:
messagebox.showerror("Hata", "Başlangıç yılı en az 1900 olmalıdır.")
return None, None
if end_year > current_year:
messagebox.showerror("Hata", f"Bitiş yılı en fazla {current_year} olabilir.")
return None, None
if start_year > end_year:
messagebox.showerror("Hata", "Başlangıç yılı, bitiş yılından büyük olamaz.")
return None, None
return start_year, end_year
if __name__ == "__main__":
start_gui()