İki farklı siteden veri çeken bir selenium uygulamam var. 1. Siteden (afad) ve 2. siteden (ogm) veri çekme fonksiyonlarının kodları tamamen aynı. Aynı işi yapan iki fonksiyon yerine tek fonksiyona parametreler vererek halledebilirim diye düşündüm, fikir buradan çıktı. Normalde bütün değişkenleri string olarak yollamayı planlıyordum ama indexlenmesi gereken değerleri olan stringler işi karıştırdı. Onları bir obje olarak atmaya çalıştım, indisleri veremedim.
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.firefox.options import Options
import time
import re
import pandas as pd
import json
import math
#konfigürasyon
options = webdriver.FirefoxOptions()
options.headless = True
driver = webdriver.Firefox(options=options)
i=0
j=0
k=0
class Parametreler:
def __init__(self, isim,icerik,degisken1,degisken2):
self.isim = isim
self.icerik = icerik
self.degisken1 = degisken1
self.degisken2 = degisken2
site_afad = “SON DEPREMLER”
site_ogm = “OGM Orman Yangınları”
sayfa_sayisi_afad = “#resultTable_paginate .pagination li”
sayfa_sayisi_ogm = "#ForestFiresTable_paginate ul li a "
baslik_sayisi_afad = “.dataTables_scroll .dataTables_scrollHead .dataTables_scrollHeadInner .dataTable thead th”
baslik_sayisi_ogm = “#ForestFiresTable thead tr th”
baslik_afad = r""“str(driver.find_element(By.XPATH, r”//*[@id=‘resultTable_wrapper’]/div[2]/div/div/div[1]/div/table/thead/tr/th[%d]"%(i+1)).text)"""
baslik_ogm = r""“str(driver.find_element(By.XPATH, “//*[@id=‘ForestFiresTable’]/thead/tr/th[%d]”%(i+1)).text)”""
tablo_satirlari_afad = eval(“driver.find_elements(By.CSS_SELECTOR,’#tbody tr’)”)
tablo_satirlari_ogm = eval(“driver.find_elements(By.CSS_SELECTOR,’#ForestFiresTable tbody tr’)”)
hucre_afad = r""“driver.find_element(By.XPATH,’//*[@id=‘tbody’]/tr[%d]/td[%d]’%((j+1),(k+1)))”""
hucre_ogm = r""“driver.find_element(By.XPATH,’//*[@id=‘ForestFiresTable’]/tbody/tr[%d]/td[%d]’%((j+1),(k+1)))”""
json_afad = “afad-depremler.json”
json_ogm = “ogm-yanginlar.json”
sonraki_afad = r""“driver.find_element(By.XPATH,’//*[@id=‘resultTable_next’]/a’)”""
sonraki_ogm = r""“driver.find_element(By.XPATH, ‘//*[@id=‘ForestFiresTable_next’]/a’)”""
def getir(_site, _sayfa_sayisi, _baslik_sayisi, _baslik, _tablo_satirlari, _hucre, _sonraki, _json):
driver.get(_site)
time.sleep(2)
sayfa_sayisi = driver.find_elements(By.CSS_SELECTOR,_sayfa_sayisi)
sayfa_sayisi = len(sayfa_sayisi)
baslik = ""
basliklar = []
satir = []
hucrelist = []
totalsatir = 0
baslik_sayisi = driver.find_elements(By.CSS_SELECTOR, _baslik_sayisi)
baslik_sayisi = len(baslik_sayisi)
for i in range(baslik_sayisi):
baslik = _baslik
basliklar.append(baslik)
######################################
for i in range(sayfa_sayisi):
print("sayfa " + str(i+1))
tablo_satirlari = _tablo_satirlari
satir_sayisi = len(tablo_satirlari)
totalsatir += satir_sayisi
for j in range(satir_sayisi):
hucre_sayisi = baslik_sayisi
for k in range(baslik_sayisi): #14 idi burası
hucre = _hucre
hucre = hucre.text
hucrelist.append(hucre)
time.sleep(0.5)
sonraki = _sonraki
try:
sonraki.click()
except:
pass
for i in range(math.ceil(len(hucrelist)/hucre_sayisi)): #hucre boyutu/kaçlı kaçlı böleceksin bunu ceil et
satir.append(list(hucrelist[(i*hucre_sayisi):(i*hucre_sayisi)+hucre_sayisi]))
for i in range(totalsatir):#bunu yapmazsak index out of range hatası veriyor #APPEND KULLANILABİLİR Mİ
satirci = [None]*totalsatir
for i in range(totalsatir):
satirci[i] = "satir" + str(i+1)
soz = {}
#satır sayısına erişmem lazım ki total satır sayısına göre mapleme yapabileyim
degerlerlist = []
for i in satir: #kaç satır varsa o kadar tekrar etmek zorunda
degerler = dict(zip(basliklar,i))
# print(degerler)
degerlerlist.append(degerler)
print("\n")
i = 0
for key in satirci:
soz[key]=degerlerlist[i]
i += 1
print("AOAOAOAOAAOAOAOAOAOAAO")
# for i in soz:
# print(i)
# print(soz[i])
print(soz)
print("AODFKSŞKDFJSLKFLDSKFJSDF")
# for i in satir: #bu satıralarımızı gösteriyor
# print(i)
# json_object = json.dumps(soz,indent=4)
# json_object = json.dumps(soz,indent=4,ensure_ascii=False).encode("utf-8")
print("jsonumuz budur : \n\n")
# print(json.loads(json_object)) #dümdüz print dersen utf-8 gözükmüyor
with open(_json,"w",encoding="utf-8") as write_file:
json.dump(soz,write_file,indent=4,ensure_ascii=False)
print("json bitti")
getir(site_afad, sayfa_sayisi_afad, baslik_sayisi_afad, baslik_afad, tablo_satirlari_afad, hucre_afad, sonraki_afad, json_afad)
getir(site_ogm, sayfa_sayisi_ogm, baslik_sayisi_ogm, baslik_ogm, tablo_satirlari_ogm, hucre_ogm, sonraki_ogm, json_ogm)
getir()
Kod bu. Mimari bu şekilde de süper değil biliyorum fakat bu yöntem ile yapabilmek python yeteneklerime katkıda bulunur diye düşünüyorum. Şimdiden teşekkürler