KefenGroup / turistomer-server

Server part of the 2023-2024 Spring Computer Science Final Project TOBB University of Economics and Technologies
0 stars 0 forks source link

Hotel Data Scraping #20

Closed keremyvnc closed 8 months ago

keremyvnc commented 8 months ago

``## Görev Açıklaması Kullanıcıya yapılacak otel önermeleri için web scraping yapılarak otel bilgilerini elde etmek.

Görev Gereksinimleri ve Yapılacaklar

Otel verileri TripcAdvisor sitesi üzerinden çekmek planlanmaktadır. Çekilecek otel verisinin özelliği şu şekildedir.

Yapılacaklar

Otelin,

Yazılım Tasarımı

Bu işlem için Beatiful Soup ve Selenium kullanılacaktır. Beautiful Soup, ham HTML verilerinin kazınması için kullanılırken, Selenium ise JavaScript temelli HTML verilerinin kazınmasında kullanılır, özellikle butonlar, form gönderimleri gibi interaktif öğelerle etkileşim gerektiğinde tercih edilir.

    url = f'https://www.tripadvisor.com.tr{hotel_links[i]}'
    browser = uc.Chrome(options=chrome_options)
    random_sleep()
    print(url)
    try:
            browser.get(url)
            random_sleep()
            cookie = WebDriverWait(browser, 20).until(
                EC.presence_of_element_located((By.ID, "onetrust-cookie-btn-container"))
            )
            cookie.click()
            sleep(4)
            denied = WebDriverWait(browser, 20).until(
                EC.presence_of_element_located((By.CSS_SELECTOR, ".ot-pc-refuse-all-handler"))
            )
            denied.click()

            page_html = browser.page_source
            random_sleep()
            bsobj = soup(page_html, 'lxml')
            try:
                names.append(bsobj.find('h1', {'class': 'biGQs _P rRtyp'}).text.strip())
            except (NameError, AttributeError) as e:
                print("Name is not found! Skipping the name section... ", url)
                names.append('None')
            random_sleep()
            try:
                links.append(bsobj.find('div', {'class': 'eeVey S4 H3 f u LGJIs'}).find('a').get('href'))
            except:
                print("Link is not found! Skipping the name section...", url)
                links.append('None')

            random_sleep()
            try:
                phone_numbers.append(bsobj.find('div', {'class': 'kpIff f u'}).text)
            except:
                print("PhoneNumber is not found! Skipping the name section...", url)
                phone_numbers.append('None')

            sleep(3)
            try:
                addresses.append(bsobj.find('span', {'class':'biGQs _P pZUbB KxBGd'}).text)
            except:
                print("Address is not found! Skipping the name section...", url)
                addresses.append('None')
            random_sleep()
            try:
                img = bsobj.find('img', {'class': 'MJDXi'}) 
                if img:
                    src = img['src']
                    match = re.search(r"center=([-\d.]+),([-\d.]+)", src)
                    if match:
                        latitude, longitude = match.groups()
                        print(f"Latitude: {latitude}, Longitude: {longitude}")
                        coordinates.append([latitude, longitude])
                    else:
                        print("Latitude and longitude not found in the URL.")
                        coordinates.append([None, None])
                else:
                    print("Image tag not found.")
                    coordinates.append([None, None])
            except Exception as e:
                print(f"An error occurred while extracting coordinates: {e}")
                coordinates.append([None, None])
            random_sleep()
            try:
                ratings.append(bsobj.find('span', {'class': 'kJyXc P'}).text)
            except:
                print("Rating is not found! Skipping the name section...", url)
                ratings.append('None')
            random_sleep()

            browser.execute_script("window.scrollBy(0, 900);")
            random_sleep()
            try:
                prices.append(bsobj.find('div', {'class': 'aLfMd'}).text)
            except Exception as e:
                print("Price is not found! Skipping the name section...", url)
                print(e)
                prices.append('None')
            random_sleep()
            try:
                try:
                    css_selector = "div.LRBRp.S4.b._S"
                    daha_fazla_goster = WebDriverWait(browser, 10).until(
                        EC.element_to_be_clickable((By.CSS_SELECTOR, css_selector))
                    )
                    sleep(3)
                    # Elementi sayfanın görünür alanına getir
                    browser.execute_script("arguments[0].scrollIntoView();", daha_fazla_goster)
                    sleep(2)
                    browser.execute_script("window.scrollBy(0, -300);")
                    sleep(1)
                    # Elemente tıkla
                    daha_fazla_goster.click()
                except:
                    print("Daha fazla göstere basilamadi")
                random_sleep()
                bsobj2 = soup(browser.page_source, 'lxml')
                divs = bsobj2.find_all('div', {'class':'gFttI f ME Ci H3 _c'})
                temp = []
                for div in divs:
                    temp.append(div.text)
                    print(div.text)
                olanaklar.append(temp)
                sleep(5)
                browser.quit()
            except:
                print("Olanaklar is not found! Skipping the name section...", url)
                olanaklar.append('None')
            sleep(3)

    except (TimeoutException, WebDriverException) as e:
        browser.quit()
        print(e.msg)
        sleep(6)
        counter = counter + 1
        i=i-1
        if(counter == 5):
            break

Aşağıdaki kod bloğunda BeatifulSoup request sonucu gelen raw HTML içerisinde ilgili aramalar yapılarak veri çekiliyor. Selenium kullanılarak da sayfa açıldığı zaman sayfayla daha karmaşık olarak etkileşime girebiliyoruz.