Pazartesi, Temmuz 31, 2017

Python + Selenium ile Telefon numarasi yakalamaca

Webde tonlarca örnek bulmak mümkün belki ama insanın denediği şey "Türkiye Şartları"na (haha) uymayınca biraz motivasyonu düşüyor.

Şimdi DevNami'nin şurada anlattığı örneği, yerelleştirelim.


Öncelikle web sayfasından veri alıp işlemek için selenium modülünü kuralım:
Bunun için
Başlat>çalıştır> cmd.exe
ile açılan dos/komut penceresinde
pip install selenium
yazıp enterlamak yeterli olacaktır.

Web tarayıcı olarak Chrome kullanmak için 
https://sites.google.com/a/chromium.org/chromedriver/downloads 
adresinden chromedriver.exe indirelim.

Not defteri, SublimeText ya da Python IDE editörlerinden birisini açıp aşağıdaki kodları Sel-Telefon.py adıyla kayıt edelim.

(Az önce indirdiğimiz chromedriver.exe dosyası da Sel-Telefon.py ile aynı klasörde olsun.)

from selenium import webdriver as web
import re

url = "https://www.turhost.com/"

d = web.Chrome("chromedriver.exe")
d.get(url)
doc = d.page_source

telefonlar = re.findall(r'[(\s][\d]{3,4}[\s)-]+[\d]{1,4}[\s-]+[\d]{1,4}[\s-]+[\d]{2,4}',doc)

for tel in telefonlar:
    print tel
    
d.quit()


Burada;
from selenium import webdriver as web

Selenium modülü içinden webdriver'ı içeri aktardık. Ve buna arkadaşlar arasında kısaca web diyeceğiz dedik. Adı ibrahim ama biz ibo diye sesleneceğiz ;)

Burada;
import re
Regular Expression / Düzenli İfade modülü import ettik. Düzenli ifadeler biraz karmaşık gibi durabilir ama mantığı yerleşince hayli zaman kazandıracak işler de yapabilir.

Burada;
url = "https://www.turhost.com/"
Telefounu almak istediğimiz bir adres girdik

Burada;
d = web.Chrome("chromedriver.exe")
d.get(url)
doc = d.page_source

d isimli değişkenimizi adeta Chrome yaptık.
çocuğum d, şu adresi getir,
doc senin içeriğin ise, d'nin getirdiği adresin kaynak kodları olsun dedik.


Burada;
telefonlar = re.findall(r'[(\s][\d]{3,4}[\s)-]+[\d]{1,4}[\s-]+[\d]{1,4}[\s-]+[\d]{2,4}',doc)

for tel in telefonlar:
    print tel

telefonlar değişkenine, re ile sayfada yakaladıklarımızı atadık.
sonra her atanan telefonu tek tek listelemek için bir döngüye soktuk.

Türkiye'de telefon yazım şekli genelde (0212) 555 44 33 şeklinde yani;
[Parantez]+[4 Rakam]+[Parantez]+[boşluk]+[3 Rakam]+[boşluk]+[2 Rakam]+[boşluk]+[2 Rakam]
formatında. Bunu ReGex olarak yazarsak şöyle:
[(]+[\d]{4}+[)]+[\s]+[\d]{3}+[\s]+[\d]{2}+[\s]+[\d]{2}


 Ancak (0212) 555-44-33 şeklinde boşluk yerine Tire işareti kullanımı da olabiliyor
O zaman formatımız şu hale geliyor
[Parantez]+[4 Rakam]+[Parantez]+[boşluk ya da tire]+[3 Rakam]+[boşluk ya da tire]+[2 Rakam]+[boşluk ya da tire]+[2 Rakam]


O halde bizde [\s] yerine [\s-] yazıyoruz.

Ama bir de kurala uyamayanlar, parantez koymayan 0212 yerine 212 yazanlar var.
Ya da numara daha güzel görünmesi için 899 1 899 şeklinde yazanlar.
Bu durumda minimum ve maximum digit/rakam adeti için formatımızı düzenleyelim:
[(]+[\d]{3,4}+[)]+[\s]+[\d]{1,4}+[\s]+[\d]{1,4}+[\s]+[\d]{2,4} 

Burada da;
d.quit()
d'yi yani bir nevi chormu kapatıyoruz. (30 tane chrome açıksa makina üzülür malum, üzülmesin) 


Başka sayfalarda da denemek için url kısmını https://tr.godaddy.com/ ve https://www.natro.com/ ile değiştirince de çalışıyor. Tabi burada düşünemediğiz yazım şekillerini yakalamayacaktır.
onlar için format düzenlemesi yada telefonlar2 gibi yeni bir değişken ataması yapılabilir.

##  Bu paylaşımlardaki amacım, Python dersi vermek değil. Çünkü ben de yeni öğreniyorum.
##  Birlikte öğrenelim ;)

Uzuun Ara

Çook uzun bir aradır yazmıyordum.
Ve yazacak çook şey oldu.

Bi' şekilde Python'a bulaştım. Sanırım, Birlikte öğrenmek ve öğrendiğim bazı şeyleri paylaşmak için yeniden yazmak geldi içimden.
Belki arada geçen bazı şeyleri de yazarım ara ara.. belki ama.

Şimdi biraz Python'layalım ;)