TDK dan Veri Çekmek

Merhabalar, tdk dan veri çekmeye çalışıyordum,amacım kullanıcıdan kelimeyi alıp tdk sitesinin veri tabanından anlamını çekmekti.Burada selenium kullanayım dedim,bana verdigi hata:

terminalselenium
Bu da kullandığım kod parçası:

#from selenium import webdriver
#from selenium.common.exceptions import TimeoutException


#driver = webdriver.Firefox()
browser = None

def startSelenium():
    import selenium
    from selenium import webdriver
    from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
    import binascii
    import hashlib
    firefox_capabilities = DesiredCapabilities.FIREFOX
    firefox_capabilities["marionette"] = True
    firefox_capabilities["binary"] = "/usr/bin/firefox"
    global browser
    browser = webdriver.Firefox()
    
startSelenium()

bu hatadan sonra iflah olmaz selenium dedim.(fotograf attıgım için uzgunum ama,yanlış varsa affola)

Ben google araştırması ile birtakım github linkleri buldum:

Bana biraz daha yardım edebilme imkanınız var mı?Gerçekten araştırdım, hala araştırıyorum,elime kayda deger pek bir şey geçmedi malesef.
Başka bir yol biliyorsanız anlatabilirseniz cidden çok sevinirim.Illa kod falan da olmayabilir,bu yolda kullanabilecegim kutuphane vb onerisi de olabilir, incelemekten çekinmem.

Adamlar nasıl site yapmışsa artık,istedigim veriyi çekemiyorum.(belki de ben beceriksizim)

Ben de başka şeyler bulabilirsem burada paylaşırım,belki buradan bir şey çıkar diye duşundum.

Kolay gelsin :slight_smile:

Selenium kullanmanız mecburi mi? HTTP isteği + gelen HTML verisini işleme yolu ile çözülemez mi? Engelliyor mu bu şekilde erişimi? Biraz baktım da belirli bir URL deseni yok ancak belirli bir URL’e POST atıyor, bununla birlikte çevrilmesi istenen metni gönderiyor. Bunun yanında bir de guid isimli bir query string parametresi gönderiyor. Bu guid’in gönderilen metin ile uyumlu olması gerek. Bunun nasıl üretildiğini anlamak için JS kodunu çözümlemek gerek. Maalesef daha ileri gidecek vakti bulamadım. :slight_smile:

1 Beğeni
#-*-coding: utf-8-*-
import urllib
import urllib2
import re


url="http://www.tdk.gov.tr/index.php?option=com_gts&arama=gts&guid=TDK.GTS.5b3540b01b6e58.33593130" #sorgu URL'miz
postdata=urllib.urlencode({"kelime":"piton"})#aranacak kelime 'piton'. urllib kütüphanesinin urlencode methoduyla post verisine çevirliyor
req = urllib2.Request(url=url,data=postdata)#bir sorgu(request) gönderiliyor
cont = str(urllib2.urlopen(req).read()).replace("\n","")#kaynak kod okunuyor. replace mehodunu satırları kaldırmak için kullandım çünkü re'nin search methodu alt satıra geçmiyor

regex = r"</i></th></tr></thead>(.*?)</table>"#html'i parçalamak için regex cümlesi (kaynak kodda kelime anlamlarının olduğu kısım)
result = re.search(regex,cont)#regex aranıyor
result = result.group(1)
result = str(result.replace("\n","").replace("\r","").replace("\t",""))#alınan kısmı replace methoduyla düz bir metne çevirdim
regex2 = r"</i>(.*?)<br>"#kelime anlamalarını çekmek için regex cümlesi
mean = re.findall(regex2,str(result))#findall methoduyla tüm anlamlar liste olarak geri döndürülüyor

say = 1
for i in mean:
	print str(say)+"-"+ i 
	say+=1

Buna benzer bir şey yapılabilir.Regex kullanmak istemezseniz alternatif olarak Beautiful Soup gibi html parçalamaya yarayan kütüphanelerde kullanılabilir veya urllib yerine requests gibi kütüphanelerde kullanılabilir.Kod bu haliyle kullanılamaz, sorun çıkaracaktır.Örneğin her kelimede kaynak kod aynı şekilde dönmeyecektir bu yüzden regex ile parçalarken istenmeyen kısımlar da ekrana yazdırılabilir.Kodu sadece fikir olması açısından yazdım.

1 Beğeni

Garip; guid parametresini değiştirmesek de çalışıyor her arama için, ne işe yarıyor bu parametre anlamadım… :thinking:

Tam aksine hocam,selenium u pc ye kuramadım,vazgeçtim.Ben siteyi biraz inceledim,dediginiz gibi adamlar form etiketi altından belli bir yere kelimeyi yolluyor,donen sonucu aynı html sayfasında yazdırıyor,bir tane url var ama kelimeyi ne şekilde,nasıl yazdıracagımı şaşırdım gerçekten.

Dediginizi pek anlayamadım ama

kelime = "elma"
https://www.google.com.tr//search?q= + kelime

gibi onune kelime koyup sonucu çekebilecegim bir şekilde degil site.Adamlar sırf veri çekemesinler diye ugraşmış.

Yok veri çekebiliyorum ama arattırdıgım kelimenin anlamını alamıyorum.

Form etiketinin post attıgı yeri goremiyorum,nasıl bir script yapısı kullanmışlar anlamadım.

Canınız sagolsun.

İncelerim, çok teşekkurler, duzenleme de yapmaya çalışır, sonucu bildiririm.

RoboBrowser ile çok rahat yapılabilir istenilen işlem. Tek yapmanız gereken TDK’da kelime arama kutusuna sağ tıklayıp ögeyi denetle(incele) yapmanız ve gerekli form etiketlerini tespit etmeniz.

from robobrowser import RoboBrowser

key_word = input("> ")

br = RoboBrowser(parser = "html.parser")
br.open("http://www.tdk.gov.tr/index.php?option=com_gts&arama")
form = br.get_form()
form["kelime"] = key_word
br.submit_form(form)

src = str(br.parsed.get_text())


print(src[5580:6100])

Çıktının dilimlenme sebebi tam olarak HTML tag’ine göre nasıl çıktı alacağımı bilmememden kaynaklı. Dilimlenmesi yüzünden çıktı yarıda kesilebilir veya gereksiz yazılar ekrana çıkabilir. Bir yolunu bilen varsa ve yaparsa daha sağlıklı olur o şekilde kullanmak. Yine de şimdilik tam sonucu veriyor.

1 Beğeni

bu selenium var ya gecko driver siz yapamaz, gecko driver ile selenium un aşkı yanında leyla ile mecnun halt etmiş :smiley:
gecko driver kurulumu için şu linkte belirtilen adımları takip edin, hem firefox hem de chrome için anlatılmış,
gecko driver kurulum
sonra da şu şekilde firefox u açmayı deneyin:
from selenium import webdriver
from selenium.webdriver.common.keys import Keys

driver = webdriver.Firefox()
driver.get("http://www.python.org")
assert "Python" in driver.title
elem = driver.find_element_by_name("q")
elem.clear()
elem.send_keys("pycon")
elem.send_keys(Keys.RETURN)
assert "No results found." not in driver.page_source
driver.close()

Bunu hiç bilmiyordum,çok sagolun.Bakayım buna bi.

O bende,o işin kolay yanı gibi gözüküyor,sadece arama sonucu da olsun da,tag ayırma sıkıntı degil.

Bir de selenium u sizin dediginiz gibi kurmayı deneyeyim.Biliyorum geckodriver lazım,ama linux un kendi deposunda sundugu bir paket degil,o yuzden ben kuramadım bunu, aslında kurdum ama sizin önerilerinize göre tekrar kurayım.Çok teşekkurler.

Sen reyissin yav,cidden allah razı olsun,allah izin verirse edebiyat hocama faydalı olacagım, çok teşekkürler, çıktı parserleme babı bende.Çözemedigim yer olursa burada sorarım.Cidden çok teşekkürler :slight_smile:
Kolay gelsin :slight_smile:

1 Beğeni