- Proje Tanıtımı
- Kullanılan Araçların Açıklamaları
- Proje Algoritması
Trendyol, Hepsiburada, n11, Amazon, gibi e ticaret sitelerinden istenilen ürüne ait bilgilerin yer aldığı bir veritabanı oluşturulacak ve bu veritabanından istenilen bilgileri web sayfası üzerinde gösterilecektir.
E-Ticaret sitelerine benzer yapıya sahiptir ama sadece bilgisayar kategorisinden oluşturulmuştur.
E-ticaret sitesinin kontrolü Admin tarafından sağlanmaktadır. Bu adminin yetkileri sayesinde:
- Sadece Admin tarafından yapılan işlemler:
- Bir notebook ürünlerinin fiyatının değiştirilmesi
- Notebook ürününe ait bir kaydın kaldırılması
- Yeni notebook ürünlerinin eklenmesi
- Notebook ürünlerinin puanında değişiklik yapılması
- Web Scraping ile veri yönetme:
- Ürün bilgilerinin güncellenmesi
Ana Sayfada veritabanında yer alan tüm kayıtlar lislenmiştir. Listelenirken her ürünün ismi sahip olduğu tüm özellikleri kapsıyor ve ismine tıklandığında ilgili ürünün detaylı bilgisine ulaşılıyor. İsminin altında ürüne ait en düşük 3 fiyat sıralanmakta ve bu 3 fiyatın olduğu e-ticaret sitesinin linki bulunmaktadır.
Layout kısmında herhangi bir ürünle ilgili arama kısmı bulunuyor. Buradan ürünün ismi, modeli ya da bulunduğu e-ticaret sitesine göre arama yapılabiliyor. Arama yanlışı olduğunda sistem düzeltilmiş öneride bulunuyor.
Ana Sayfanın sol tarafında ise dinamik filtreleme kısmı bulunmakta. En düşük fiyattan en yüksek fiyata, en yüksek fiyattan en düşük fiyata ve en yüksek puandan en düşük fiyata şeklinde sıralama işlemleri ise arama kısmının altında mevcuttur. Laptop bilgilerinin yer aldığı alanda fiyat bilgisi için de aynı durum geçerlidir.
Arayüz’ü tasarlarken W3school css templates kullandık. İstediğimiz sadeleştirilmeleri yaptıktan sonra ilave olarak ihtiyacımız olan özellikleri başka ücretsiz şablonlardan sağladık.
Sayfalar:
- Ana Sayfa: Tüm verilerin listelendiği, filtrelenerek sıralandığı sayfa.
- Login: Sistemde kayıtlı adminin giriş yaptığı sayfa.
- Admin Paneli: Adminin verileri kontrol ettiği sayfa.
-
Gerekli paketlerin yüklenmesi
pip install django pip install djongo pip install pymongo
-
Projenin oluşturulması
- Proje Database’e 2. görseldeki DATABASES değişkeni içerisindeki yapı aracılığıyla erişim sağlar.
django-admin startproject projeismi python manage.py startapp appismi // oluşturulan app aşağıdaki gibi, settings.py içerisindeki installed_apps klasörüne yazılmalıdır.
-
Web sayfasının URL’leri tanımlanır.
-
Html bağlantı işlemleri ve sayfaya yansıtılması
-
Database’de kullanacağımız Table yapısı, app içerisindeki models.py içerisinde oluşturulur
def __str__(self): return f"{self.name}, {self.marka}"
def yapısı admin panelindeki görüntülemede okuma kolaylığı sağlamak için kişiselleştirilebilir. (görseldeki örnek ürünün isim ve marka değerlerini 2 column şeklinde admin panelinde görüntüler. Admin Panel Kısım: X)
-
Oluşturulan Table yapısının ve diğer değişikliklerin database’e yansıtılması:
-
migration oluşturma
“Not Implemented Error: Database objects do not implement truth value testing or bool().” hatası almamak için:
pip install pymongo==3.12.3
-
migration’ı gönderme
-
Bunları denetlemek ve admin sayfasına erişmek için admin kullanıcısı oluşturma (migration oluşturmadan bu aşamaya geçmeyiniz!!!)
-
-
Projeye ekleyeceğimiz HTML dosyaları okunurluk ve genel işleyiş kolaylığı açısından proje içerisine açılan “templates” klasörü içerisindeki “appismi” klasörüne yerleştirilir. Templates klasörünün projeye tanıtılması ise aşağıdaki görseldeki gibidir.
-
HTML sayfalarına database üzerinden bilgi aktarabilmek için app içerisinde bulunan “urls.py” içerisine gerekli bağlantılar yapılır.
-
Admin sayfasına bağlantı sağlamak ve düzenlemek için app içerisindeki “admin.py” içerisinde aşağıdaki işlemler uygulanır. (Gerektiği gibi kişiselleştirilebilir.)
-
Admin sayfasının özelleştirilebilmesi (Web scraping için buton eklenmesi vb.) için hazır bir app kullandık.
Web Scraping yaparken dikkat edilmesi gerekenler:,
-
Üzerinde çalışılan sitenin URL geçerlilik kontrolü
import validators valid=validators.url('https://github.com/') if valid==True: print("Url geçerli") else: print("Url geçersiz")
-
Request atılan geçerli urlnin response değerinin 200 olup olmaması
response = requests.get(base_url.format(i), headers=headers) print(response)
-
Sitede istenilen verinin olup olmaması
-
BeautifulSoap
- if ile None olup olmama
- try except yapısı
-
Selenium
- try catch ile hata mesajlarını döndür. Bunun için ilgili kütüphaneleri ekle.
from selenium.common.exceptions import NoSuchElementException try: veri = browser.find_element("css selector","#productDetailsCarousel > div.owl-stage-outer > div > div.owl-item.active > a > picture > img") except NoSuchElementException: print("Exception Handled") continue
-
Veri çekerken selenium ile beutifulSoap karışık kullandık. BeutifulSoap’da veri çekememe problemi seleniuma göre daha çok oldu.
#BeautifulSoup
from bs4 import BeautifulSoup
import requests
#Selenium
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.common.exceptions import NoSuchElementException
#Kontrol
import validators
-
Google üzerinden arama yaptırma
browser = webdriver.Chrome(driver_path) browser.get("https://www.google.com/") Veri_girisi = browser.find_element("css selector",".gLFyf.gsfi") Veri_girisi.send_keys("Aranılacak veri") Veri_girisi.send_keys(Keys.ENTER)
-
İlgili sayfaya yönlendirme
# xpath gibi aramalar da yapılabilir tikla = browser.find_element("css selector","ilgili sayfanın linkinin olduğu yerin selector kopyası") tikla.click()
-
Fotograf indirme (Projenin güncel halinde bu özelliğe gerek kalmadı, isteğe bağlı kullanılabilir)
img_url = browser.find_element("XXXXXXX").get_attribute("src") browser.get(img_url) img_loc = "C:/Users/zerha/Downloads/xxxx.png" browser.save_screenshot(img_loc)
-
Veri Çekme
product_price = browser.find_element("css selector","#pdp-main > div.pdp-block2.pdpGeneralWidth > div.pdp-details > div.addtocart-component > div > div.AddToCart-AddToCartAction > div > div.pdp-amount.prc-last-2 > div > div > span") product_priceText = product_price.get_attribute("innerHTML")
-
Veri çekme
response = requests.get(base_url.format(i), headers=headers) soup = BeautifulSoup(response.content, 'html.parser') results = soup.find_all('li',{'class': 'productListContent-zAP0Y5msy8OHn5z7T_K_'})
Web sitelerinden veri çekerken ilk önce request ile web sitelerine giriş yaptık. Daha sonrasında aldığımız response değerler 200’ü gösterdiğini teyit edince response içerisindeki html bilgileri kullanarak request attığımız site içindeki verileri çektik. Çektiğimiz verileri direkt olarak mongoDb’ye kaydettik.
Kullandığımız varlıkların(entitys) temel özellikleri:
- Bilgisayar:
- Fotoğrafı
- Marka Model
- Adı
- Model No İşletim sistemi
- İşlemci tipi
- İşlemci nesli
- Ram Disk boyutu
- Disk türü
- Ekran boyutu
- Puanı
- Fiyat
- Bu bilgilerin alındığı site/siteler
- User(Admin):
- Kullanıcı adı
- Şifresi
Scraping ile çekilen bilgiler düzenli olarak veritabanında ve sitede güncellenmektedir.
Önceden kayıtlı olan bir verinin tekrardan kaydının önlenmesi için Duplicate kontrolü yapılmaktadır. Aynı zamanda Near Duplicate kontrolü ile aynı ürün bilgilerinin farklı isimlendirmelere tekrarlanmaması sağlanır.
Semi-structured, json tipinde veriler varsa ve bu verilerin herhangi bir yerinde sorgulama, groupby gibi işlemler gerekiyorsa Doküman tabanlı (Document- Oriented) NoSQL veritabanları seçilir. MongoDB doküman tabanlı NoSql veritabanlarından biridir. Peki özellikle bu tür veritabanlarından MongoDB veritabanını seçtik?
Çünkü MongoDB’nin çokça kendine ait nasıl kullanılacağını anlatan kaynaklara sahip. Diğer Doküman tabanlı NoSQL veritabanlarına göre daha çok kullanılıyor.Bu da proje geliştirirken daha kolay ilerlememizi sağladı.
MongoDB, verileri kaydettiği dokumanları JSON benzeri Binary JSON (BSN) formatında saklar. MongoDB’de yaptığımız işlemlerin ilişkisel veritabanındaki karşılıkları:
MongoDb de yapılan işlemler:
-
Yeni bir Cluster oluşturuldu. İsmi: "Cluster-WebScraping"
-
Cluster-WebScraping için veritabanı erişim izni verilen iki kullanıcı oluşturuldu.
- isim: zeyneperhan şifre: 20012022
- isim: hazarkoc şifre:20012022
-
Cluster-WebScraping'e IP üzerinden otomatik bağlanmak için Ip adresi eklendi
Not: Colab Notebook üzerinden denemeler yaptığımız için IP hatası almamak adına “Allow Acces From Anywhere” özelliğini seçtik.
-
Cluster içerisine yeni veritabanı eklenip koleksiyon oluşturuldu.
# MongoDb işlemleri için gerekli kütüphaneler eklendi
import pymongo
Cluster-WebScraping Url’sini elde etmek için:
- MongoDb Atlas veya MongoDb Compass'a göre seçim yapılır.
- MongoDb Atlas'ı seçtiğimiz için MongoDB Drivers kısmı seçilir.
- Driver ve versiyonu seçilir.
-
Driver: Pyhton Versiyon: 3.4 ve sonrası
NOT: Burada verdiği linki direkt kopyalamamak gerekiyor! Direkt olarak verdiği link içerisinde admin veritabanı bağlantısı içeriyor ama bu Mongo Atlas üzerinden görünmüyor. Bu yüzden Compas kullanmasak bile url’yi istediğimiz şekilde ayarlamak için Compas’ı kullandık.
-
# Cluster-WebScraping için bağlantı sağlandı (Compass yardımı ile). (username: zeyneperhan password: 20012022)
myclient = pymongo.MongoClient("mongodb://zeynep:20012022@ac-akv12vk-shard-00-00.6erqfem.mongodb.net:27017,ac-akv12vk-shard-00-01.6erqfem.mongodb.net:27017,ac-akv12vk-shard-00-02.6erqfem.mongodb.net:27017/?ssl=true&replicaSet=atlas-8ffx15-shard-0&retryWrites=true&w=majority")
# Kullanacağımız veritabanı için erişim sağladık.
mydb = myclient["Bilgisayar"]
# Bilgisayar Veritabanındaki Amazon koleksiyonuna erişim sağladık
mycollectionAmazon= mydb["Amazon"]
-
CREATE
mycollection.insert_one(XXXX)
-
READ
- Koleksiyon İçerisindeki Verileri okuma
# mycollection içerisindeki verileri teker teker alıp ilgili özelliği yazdırır. for product in mycollection.find({}): print(product['Name'])
b. Koleksiyon içerisindeki verinin gömülü dokümantasyon bilgilerini okuma:
for product in mycollection.find({}): print("----------------") print(product['Name']) print("\n") hepsiburada = product['HepsiBurada'] print("HepsiBurada Bilgileri:") print(hepsiburada['URL']) print(hepsiburada['Price']) print("\n") trendyol = product['Trendyol'] print("Trendyol Bilgileri:") print(trendyol['URL']) print(trendyol['Price']) print("----------------")
Çıktısı:
-
UPDATE
- Verinin içerisinde gömülü dokümantasyonu güncelleme:
#Name bilgisi product['Name'] olan verinin Trendyol Objesinin içerisindeki URL bilgisini günceller mycollection.update_one({ "Name" : product['Name'] },{ "$set": {"Trendyol.URL": "yeni bilgi"}})
-
DELETE
-
Filtreleme
ObjectId:
# ObjectId sorgulaması yapmak işçin gerekli kütüphane from bson.objectid import ObjectId product = mycollection.find_one({"_id": ObjectId('Aranan verinin idsi')}) # İlgili verinin ObjectId değerini çekmek için: id = product['_id']
NOT: Google CAPTCHA’dan kurtulmak User Agent’ı sürekli değiştirmek veya insan davranışlarına daha uygun olacak şekilde time.sleep() komutu kullanmak faydalı olabiliyor.
Aslında bu algoritmayı şu şekilde uyarlayabilirsiniz:
-
Şimdiki halinde olduğu bir belli bir eticaret sitesinin bilgisayar sayfalarını baz alıp diğer sitelerden fiyat bilgileri çekerek çalışma.
-
Elinizde bulunan bilgisayar isimlerini(bu isimler model,marka,seri no, ram gibi detaylı bilgiler bulundurmalı) diğer sitelerde aratarak veri ekleme.
-
Sırayla sitelerin hepsinden model ismi alarak.
🚨 NOT: MongoDb içerisinde verilerin duplicate olmasını engellemek adına:- Örenğin ilk olarak hepsiburadadan Bilgisayar isimleri, ilgili bilgisayarın fotoğrafı ve detaylı biligsini çekip elimizde bulunan 7 web sitesi(hepsiburada,amazon,trendyol,n11,çiçeksepeti,vatan,teknosa) için arama yaptıralım.
- bittikten sonra amazondan bilgisayar isimleri, ilgili bilgisayarın fotoğrafı ve detaylı biligsini çekip elimizde bulunan 6 web sitesi(amazon,trendyol,n11,çiçeksepeti,vatan,teknosa) için arama yaptıralım.
- Bu aşamada mongodb içerisinde kayıtlı verilerde amazon.mevcut bilgisi true olanla amazondan çekilen bilgileri karşılaştırılmalı. çakışma olursa bu veri atlanıp diğer veriye geçilmeli.
- gibi gibi bu şekilde azaltılarak devam ettirilebilir.
-
BTK AKADEMİ: Talha Kılıç
-
Slider
-
W3Schools Template
-
MongoDB Crud & Connection
ASP.NET Core with MongoDB || Complete CRUD || MongoDB Compass || NoSQL || .NET 5.0
-
Checkbox
How To Create a Custom Checkbox and Radio Buttons
Implementing Checkbox Product Filters ASP.NET MVC - How Can I Pass Data in Collection through URL?
Checkbox Filter asp.net mvc| Applying Filters using Checkbox on Shop Page in ASP.Net MVC- Session 21
-
Pyton json formatında yazdırma
-
Pyhton with MongoDb
-
Selenium ile web scraping
Web Scraping with Selenium in Python - Amazon Search Result(Part 1)
-
MongoDb dizi ve gömülü dokümanlar ile çalışmak
-
MongoDb gömülü doküman güncellemek için
-
Selenium hata döndürme
How To Handle Errors And Exceptions In Selenium Python | LambdaTest
-
Filtreleme işlemleri
Django E-commerce Product Filter Prototype
Django Filtering System Using Django-Filter | Django Filtering Tutorial
-
Admin Paneline Buton Eklenmesi