From a8c9ac37b1eb75a2c0546058b4cd8e8940eb6aab Mon Sep 17 00:00:00 2001 From: Bartek Date: Wed, 14 Dec 2022 04:50:05 +0100 Subject: [PATCH] =?UTF-8?q?Ponowna=20pr=C3=B3ba=20dodania=20dw=C3=B3ch=20p?= =?UTF-8?q?lik=C3=B3w?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend_background_remove.py | 43 +++++++++++++++ backend_scraping_final.py | 102 +++++++++++++++++++++++++++++++++++ 2 files changed, 145 insertions(+) create mode 100644 backend_background_remove.py create mode 100644 backend_scraping_final.py diff --git a/backend_background_remove.py b/backend_background_remove.py new file mode 100644 index 0000000..31b0613 --- /dev/null +++ b/backend_background_remove.py @@ -0,0 +1,43 @@ +from rembg import remove +import os +from PIL import Image +import io +import matplotlib.pyplot as plt +import matplotlib.image as mpimg + +# wskazanie folderów odczytu i zapisu zdjęć +src_folder = 'E:\\AUTOwycena\\AUTOpictures\\' +dst_folder = 'E:\\AUTOwycena\\AUTOsilhouettes\\' + +# znalezienie plików do modyfikacji +files = os.listdir(src_folder) +for file in files: + # ustalenie nazw oraz rozszerzeń plików + file_name, file_extension = os.path.splitext(file) + # ustalenie nazwy pliku do modyfikacji + file_name_before = src_folder + file + with open(file_name_before, 'rb') as i: + # ustalenie nazwy pliku po modyfikacji + file_name_after = dst_folder + file_name + '_silhouette' + file_extension + with open(file_name_after , 'wb') as o: + # wczytanie zdjęcia do modyfikacji + car_picture = i.read() + # usunięcie tła + car_silhouette = remove(car_picture) + # zpisanie zdjęcia po modyfikacji + o.write(car_silhouette) + + +# odczyt plików +car_pictures = os.listdir(src_folder) +car_silhouettes = os.listdir(dst_folder) + +for i in range(len(car_pictures)): + # odczyt zdjęć + img_A = mpimg.imread(src_folder + car_pictures[i]) + img_B = mpimg.imread(dst_folder + car_silhouettes[i]) + + # wydruk zdjęć + fig, ax = plt.subplots(1,2) + ax[0].imshow(img_A) + ax[1].imshow(img_B) \ No newline at end of file diff --git a/backend_scraping_final.py b/backend_scraping_final.py new file mode 100644 index 0000000..76de56d --- /dev/null +++ b/backend_scraping_final.py @@ -0,0 +1,102 @@ +# IMPORTOWANIE BIBLIOTEK +from fileinput import filename +from selenium import webdriver +from selenium.webdriver.chrome.service import Service +from selenium.webdriver.common.action_chains import ActionChains +from selenium.webdriver.common.by import By +from selenium.webdriver.support.ui import WebDriverWait +from selenium.webdriver.support import expected_conditions as EC +from selenium.webdriver.common.keys import Keys +import urllib.request +import csv + + + +# FUNKCJA ODPOWIADAJĄCA ZA ZAPISYWANIE ZDJĘĆ SAMOCHODÓW +def ZAPISYWANIE_ZDJĘĆ(opener, folder_path, miniaturka_link, id_oferty): + miniaturka_link = miniaturka_link.replace('/60/', '/800/') + for x in range(1, 10): ## zmieniając zasięg można ustawić ilość zdjęć pobieranych dla każdego auta (teraz ustawione jest na 10 zdjęć) + try: + opener.retrieve(f'{miniaturka_link[:-5]}{x}.jpg', f'E:\AUTOwycena\AUTOpictures\{id_oferty}_{x}.jpg') + except: + break + + +# FUNKCJA ODPOWIADAJĄCA ZA ZAPISYWANIE DANYCH TEKSTOWYCH W PLIKU CSV +def ZAPISYWANIE_DANYCH(opener, folder_path, oferta, oferta_link): + dane_oferty = oferta.find_elements(By.TAG_NAME, 'td') + miniaturka_link = oferta.find_element(By.TAG_NAME, 'a').find_element(By.TAG_NAME, 'img').get_attribute('src') + id_oferty = oferta_link.split('/id/')[-1] + marka = oferta.get_attribute('make') + model = oferta.get_attribute('model') + rodzaj_paliwa = dane_oferty[8].text + rok_produkcji = dane_oferty[10].text + przebieg = dane_oferty[12].text.replace(' ', '') + cena_start_aktualna = ';'.join(dane_oferty[14].text.split('\n')).replace(' ', '') + kosztorys_naprawy_ASO = dane_oferty[16].text.replace(' ', '') + wycena_przed = dane_oferty[18].text.replace(' ', '') + wycena_po = dane_oferty[20].text.replace(' ', '') + dane_oferty_razem = [id_oferty, marka, model, rodzaj_paliwa, rok_produkcji, przebieg, cena_start_aktualna, kosztorys_naprawy_ASO, wycena_przed, wycena_po] + with open(f'{folder_path}\AUTOwycena.csv', 'a', newline='') as file: + thewriter = csv.writer(file) + thewriter.writerow(dane_oferty_razem) + ZAPISYWANIE_ZDJĘĆ(opener, folder_path, miniaturka_link, id_oferty) + + +# FUNKCJA ODPOWIADAJĄCA ZA STWORZENIE LISTY WSZYSTKICH DOSTĘPNYCH OFERT DOTYCZĄCYCH SAMOCHODÓW +def LISTA_OFERT(driver): + dzisiejsze_oferty = driver.find_elements(By.CLASS_NAME, "listCarRow") + lista_ofert = [] + lista_ofert_linki = [] + for oferta in dzisiejsze_oferty: + lista_ofert.append(oferta) + lista_ofert_linki.append(oferta.find_element(By.TAG_NAME , "td").find_element(By.TAG_NAME , "a").get_attribute('href')) + liczba_ofert_dotyczacych_samochodow = int(driver.find_element(By.XPATH, '/html/body/div[2]/div[5]/div[2]/div/div/div[2]/div/div[1]/div[1]/div/span').text[1:-1]) + return lista_ofert[:liczba_ofert_dotyczacych_samochodow], lista_ofert_linki[:liczba_ofert_dotyczacych_samochodow] + + +# FUNKCJA ODPOWIADAJĄCA ZA PROCES LOGOWANIA +def LOGOWANIE(driver): + logowanie = driver.find_element(By.XPATH, "/html/body/div[2]/div[4]/div/div[3]/ul/li[5]/table/tbody/tr/td/a") + actions = ActionChains(driver) + actions.move_to_element(logowanie) + actions.click(logowanie) + actions.perform() + login_box = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, '/html/body/div[5]/div[2]/form/table/tbody/tr[1]/td/input'))) + password_box = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, '/html/body/div[5]/div[2]/form/table/tbody/tr[2]/td/input'))) + login_box.send_keys('WrecarDemo1') + password_box.send_keys('WrecarDemo2022') + password_box.send_keys(Keys.RETURN) + + +# FUNKCJA ODPOWIADAJĄCA ZA CAŁY PROCES POBIERANIA +def POBIERANIE_DANYCH(driver, opener, folder_path): + driver.get('https://wrecar.pl/') + LOGOWANIE(driver) + driver.get("https://wrecar.pl/car/auction") + lista_ofert, lista_ofert_linki = LISTA_OFERT(driver) + for num in range(len(lista_ofert)): + ZAPISYWANIE_DANYCH(opener, folder_path, lista_ofert[num], lista_ofert_linki[num]) + print(f'Zapisano dane {num/len(lista_ofert)*100:.2f}% ofert!') + if num == 4: + break + + +# FUNKCJA ZACZYNAJĄCA PROCES POBIERANIA DANYCH +def SELENIUM(ŚCIEŻKA_DO_CHROMEDRIVER_EXE, FOLDER_ZAPISU_DANYCH): + opener = urllib.request.URLopener() + opener.addheader('User-Agent', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36') + options = webdriver.ChromeOptions() + # options.headless = True ## jeśli linijka jest zakomentowana to widać klienta przegląrki, jeśli NIE jest zakomentowana, to proces wykonuje się w tle + options.add_experimental_option('excludeSwitches', ['enable-logging']) + options.add_experimental_option("detach", True) + driver_service = Service(executable_path=ŚCIEŻKA_DO_CHROMEDRIVER_EXE) + driver = webdriver.Chrome(service=driver_service, options=options) + POBIERANIE_DANYCH(driver, opener, FOLDER_ZAPISU_DANYCH) + driver.quit() + + +# ROZPOCZĘCIE PROCESU POBIERANIA DANYCH +ŚCIEŻKA_DO_CHROMEDRIVER_EXE = '' ## np. 'C:\chromedriver.exe' +FOLDER_ZAPISU_DANYCH = '' ## np. 'E:\AUTOwycena\PicturesDatabase' +SELENIUM(ŚCIEŻKA_DO_CHROMEDRIVER_EXE, FOLDER_ZAPISU_DANYCH) \ No newline at end of file