Python ve Selenium kullanarak dinamik bir web sitesini kazıma.

Dec 17 2022
Giriş Bir süre önce, otel rezervasyonları için İspanyol bir web sitesinden veri toplamam gereken bir görev verildi. Bu tür görevlerle karşılaştığımızda birkaç seçeneğimiz var, Güzel çorba, Scrapy ve Selenium.

Giriş

Bir süre önce, otel rezervasyonları için İspanyol bir web sitesinden veri toplamam gereken bir görev verildi. Bu tür görevlerle karşılaştığımızda birkaç seçeneğimiz var, Güzel çorba, Scrapy ve Selenium. Güzel çorba, dinamik web siteleriyle pek iyi çalışmaz ve scrapy komut dosyasının çalışma şeklini tercih etmiyorum. Bağlantıları hemen koymaya başladığınız scrapy ve diğer yöntemlerin aksine, selenium'da önce görev için kullanmak istediğiniz tarayıcı için bir Web sürücüsü edinmeniz gerekir.

Proje için sistem kurulumu

Herhangi bir projeye başlamadan önceki en önemli adım, sisteminizi projeye hazır hale getirmektir. Proje kurulumu için izlenecek adımlar şunlardır:

  1. Python - Python'u buradan indirebilirsiniz . Ayrıca kurarken yola python eklediğinizden emin olun.
  2. Proje dizininizde bir sanal ortam oluşturun. kullanarak sanal ortam oluşturabilirsiniz.python -m venv [name you want to give to your environment].
  3. Sanal ortamınızı etkinleştirin. [environment name]\Scripts\activateŞimdiye kadar proje dizininde olduğunuzu ve sanal ortamınızı etkinleştireceğinizi varsayıyorum .
  4. Şimdi bu ortamda selenium kuracaksınız. pip install selenium==<required version>gerekli selenium sürümünü kuracaktır. Proje için sürüm 3'ü kullandım.
  5. Kullandığınız chrome sürümüne bağlı olarak bir chrome sürücüsü edinin. Sürücünüzü buradan alabilirsiniz .
Proje dizininin yapısı.

Ayıklanan veriler "Data" dizinine ve indirdiğimiz sürücü "driver" dizinine gider.

Şimdi, ana dizinin içinde, verileri web sitesinden sıyırmak için komut dosyasını yazacağınız bir python dosyası oluşturacaksınız.

Gerekli kütüphaneleri içe aktararak başlayacağız:

Kitaplıkların içe aktarılması gerekiyor.

Komut dosyasını başlatmak için önce selenium.webdriveraşağıdaki şekilde kullanarak bir sürücü nesnesi oluşturacağız:

driver = webdriver.Chrome(executable_path ='data/chromedriver.exe')

Verilerini toplamak istediğimiz site rentia ve bu adreste bulunabilir “https://es.rentalia.com/”

komutu kullanarak önce sürücünün web sitesine erişmesini sağlayacağızdriver.get('https://es.rentalia.com/')

Artık sürücü web sitesine girdikten sonra, bulunduğu web sayfasında bulunan tüm html öğelerine erişebilir. Web sayfasında bulunan öğelere erişmek için kullanabileceğimiz işlevleri öğrenmek için bu bağlantıya başvurabilirsiniz-”https://iqss.github.io/dss-webscrape/finding-web-elements.html”.

Şimdiye kadar selenium webdriver'daki öğe seçici işlevine aşina olmalısınız ve bir sonraki adım, verilerinizi almak istediğiniz öğelerin referanslarını almaktır. Bunun için tarayıcınızda geliştirici seçeneklerini açmanız yeterlidir F12, seçmek istediğiniz öğeye basmanız veya sağ tıklamanız yeterlidir ve tıkladığınızda inceleme seçeneği bulacaksınız ve bunun için html koduna yönlendirileceksiniz. Bu koddan sınıf adını, html'yi, id'yi alabilirsiniz veya X-path'i, X-path'i code html öğesine tıklandığında görüntülenen menüden elde edebilirsiniz.

X yolunu şu şekilde elde edersiniz:

İşlemden başlayarak:

İlk ve en önemli nokta, web sürücünüzü çalıştıracağınız tarayıcıda web sitesini açın ve işlemleri gözlemlemeye başlayın.

Örneğin, sayfa yüklendiği anda çerezleri kabul etmek için bir düğme vardır. İçerideki içerikle yalnızca o düğmeyi tıkladıysanız etkileşim kurabileceksiniz.

Alt kısımda, sizden şartları kabul etmenizi isteyen bloğu görebilirsiniz.

Şimdi, bir kez geçtikten sonra, veriye ihtiyacınız olan alan için sonuçları almak için girdileri doldurmanız gerekecek. Sonuç sayfası, gecelik fiyat, konum, kısa bir açıklama vb. Bu nedenle, numarayı almak için her otel odasının ayrıntılar sayfasına gitmemiz gerekecek.

Odalarla ilgili temel bilgileri içeren listeler sayfası.
Bunu ayrıntılar sayfasında bulacaksınız.

Komut dosyasının oluşumunu aşağıdaki adımlara ayırdım:

  • Web sayfasına gitmek için şartları kabul etmek için düğmeye erişme.
  • #clicking the accepting button 
    cookies_btn = driver.find_element('xpath', '//*[@id="didomi-host"]/div/div/div/div//div[2]/button[2]')
    cookies_btn.click()
    # we used xpath to access the element and once we get the object made for the element we can click simply by adding click() method.
    

    # inputing the locations from the given list 
    input_field.send_keys(loc)
    ActionChains(driver).send_keys(Keys.DOWN).send_keys(Keys.ENTER).perform()
    # we replicated the interaction we make to input and submit the query in the input bar using action chains
    

    Bilgi çıkarma.

Her sitenin verilerini elde etmek için, sahip olduğumuz değişkenlere göre yalnızca başlıkları olan bir tablo oluşturmak için bir yazma ifadesinin içine döngü ekledim ve ardından döngü devam ederken kod, tanımladığımız ve ayıklama için kullandığımız yer tutucudan gelen verilerle satırları doldururdu. Veri toplamada iyi ve verimli çalışmasını sağlamak için eklediğim birkaç şey daha vardı, bitmiş kodu burada bulabilirsiniz . Örneğin, komut dosyasını kullanıcıdan argüman olarak alacak şekilde yaptım, gerekli tüm bilgileri o depoda alacaksınız. Ancak oradan kod almadan önce, bunu kendi başınıza uygulamanızı isterim.

Ayrıca, bir csv dosyasındaki verileri almak için standart bir kural yoktur, bu yüzden ilginç olduğunu düşündüğünüz şeyi yapın.

Umarım bu yardımcı olmuştur!