# ----------Imports------------ from datetime import date from traceback import print_tb from unittest import result from urllib import response from urllib.request import Request from bs4 import BeautifulSoup from matplotlib import dates from numpy import diag_indices import requests import pandas as pd import random # List of User-Agent user_agent_list = [ 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36', 'Mozilla/5.0 (iPhone; CPU iPhone OS 14_4_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0.3 Mobile/15E148 Safari/604.1', 'Mozilla/4.0 (compatible; MSIE 9.0; Windows NT 6.1)', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36 Edg/87.0.664.75', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.18363', ] user_agent = user_agent_list[random.randint(0, len(user_agent_list)-1)] headers = {'User-Agent': user_agent} # Vrsta pretraga (vrsta=*): # Sve pretrage link: https://www.olx.ba/pretraga?id=18&kategorija=18&sort_order=desc&sort_po=datum # Samo prodaja link: https://www.olx.ba/pretraga?id=18&kategorija=18&sort_order=desc&sort_po=datum&vrsta=samoprodaja # Samo potraznja link: https://www.olx.ba/pretraga?id=18&kategorija=18&sort_order=desc&sort_po=datum&vrsta=samopotraznja # Sa zamjenom (sazamjenom=sazamjenom) #https://www.olx.ba/pretraga?id=18&kategorija=18&stanje=0&sort_order=desc&sort_po=datum&sazamjenom=sazamjenom # Array of object filteri podaci_db = [] # Pagination cross webpages # n is number of pages to crawl pages_number_to_crawl = 2 for i in range(1,pages_number_to_crawl): # if kategorija=18 - Automobili main_website = 'https://www.olx.ba/pretraga?id=18&kategorija=18&stanje=0&vrstapregleda=tabela&sort_order=desc&sort_po=datum&kilometra-a_min=0&kilometra-a_max=0&stranica=' + str(i) category_of_vehicle = 18 # Request to website response_for_page = requests.get(main_website, headers=headers) # Soup object soup_page = BeautifulSoup(response_for_page.content, 'html.parser') # Results results_all_items_per_page = soup_page.find_all('div',{'class':'listitem'}) # List of olx id olx_id = [] # All filters filters = { "Olx_id" : None, "Vrsta_oglasa" : None, "Kategorija" : None, "Cijena" : None, "Stanje" : None, "Lokacija_kanton" : None, "Lokacija_grad" : None, "Proizvođač" : None, "Model" : None, "Godište" : None, "Kilometraža" : None, "Kilovata (KW)" : None, "Kubikaža" : None, "Gorivo" : None, "Broj vrata" : None, "Konjskih snaga" : None, "Metalik" : None, "Masa/Težina (kg)" : None, "Tip" : None, "Pogon" : None, "Emisioni standard" : None, "Veličina felgi" : None, "Transmisija" : None, "Broj stepeni prijenosa" : None, "Boja" : None, "Muzika / ozvučenje" : None, "Parking senzori" : None, "Parking kamera" : None, "Registrovan do" : None, "Godina prve registracije" : None, "Broj prethodnih vlasnika" : None, "Posjeduje gume" : None, "Višezonska klima" : None, "Rolo zavjese" : None, "Svjetla" : None, "Zaštita/Blokada" : None, "Sjedećih mjesta" : None, "Turbo" : None, "DPF/FAP filter" : None, "Strane tablice" : None, "Ocarinjen" : None, "Prilagođen invalidima" : None, "Servo volan" : None, "Tempomat" : None, "ESP" : None, "El. podizači stakala" : None, "Senzor mrtvog ugla" : None, "Digitalna klima" : None, "Touch screen (ekran)" : None, "Panorama krov" : None, "Koža" : None, "Masaža sjedišta" : None, "El. pomjeranje sjedišta" : None, "Senzor auto. svjetla" : None, "Alarm" : None, "Daljinsko otključavanje" : None, "Auto kuka" : None, "Udaren" : None, "Start-Stop sistem" : None, "Park assist" : None, "Registrovan" : None, "Na lizingu" : None, "Servisna knjiga" : None, "Komande na volanu" : None, "ABS" : None, "Airbag" : None, "Električni retrovizori" : None, "Klima" : None, "Navigacija" : None, "Šiber" : None, "Naslon za ruku" : None, "Hlađenje sjedišta" : None, "Grijanje sjedišta" : None, "Memorija sjedišta" : None, "Alu felge" : None, "Centralna brava" : None, "Oldtimer" : None, "ISOFIX" : None, "Datum" : None, "Vrijeme" : None } # Number of all items broj_el = 0 # Getting all id's of articles for i in range(0, len(results_all_items_per_page)): if(results_all_items_per_page[i].find('p')): # Divide id from rest of link address_content = results_all_items_per_page[i].find('a')['href'] temp = address_content.split('/') artikal_number = temp[4] olx_id.append(artikal_number) broj_el = broj_el + 1 for i in range(0, broj_el): # New dictionary instance for every item podaci = filters.copy() # Add kategorija if (category_of_vehicle == 884): podaci['Kategorija'] = ('Prikolice') # Artikal olx_link artikal_link = 'https://www.olx.ba/artikal/' + olx_id[i] podaci["Olx_id"] = olx_id[i] response_item = requests.get(artikal_link, headers=headers) soup_item = BeautifulSoup(response_item.content, 'html.parser') result_item = soup_item.find('div',{'class':'artikal_lijevo'}) # print(artikal_link) # Getting filters info from item # Osnovni filteri # Cijena if (result_item.find('div',{'id':'pc'})): x_cijena = result_item.find('div',{'id':'pc'}).findAll('p') item_cijena = x_cijena[1].get_text().split()[0] if(item_cijena == 'Po'): item_cijena = "Po dogovoru" podaci['Cijena'] = item_cijena print(podaci['Cijena']) # Lokacija #kanton if (result_item.find('div',{'class':'mobile-lokacija'})): x_lokacija = result_item.find('div',{'class':'mobile-lokacija'})['data-content'].split() item_kanton = x_lokacija[0].replace(',','') podaci['Lokacija_kanton'] = item_kanton print(podaci['Lokacija_kanton']) #grad x_lokacija.pop(0) item_grad = x_lokacija mojstring = ' '.join(item_grad) podaci['Lokacija_grad'] = mojstring print(podaci['Lokacija_grad']) # Stanje if (result_item.find('div',{'class':'mobile-stanje'})): x_stanje = result_item.find('div',{'class':'mobile-stanje'}).get_text().split() item_stanje = x_stanje[1] podaci['Stanje'] = item_stanje print(podaci['Stanje']) # Ispod divs if (result_item.find_all('div',{'class':'ispod'})): ispod_divs = result_item.find_all('div',{'class':'ispod'}) for i in range (len(ispod_divs)): # Proizvodjac if (i==0): x_proizvodjac_p = ispod_divs[0].find_all('p') x_proizvodjac = x_proizvodjac_p[1].get_text() podaci['Proizvođač'] = x_proizvodjac print(podaci['Proizvođač'] ) # Model if (i==1): x_model_p = ispod_divs[1].find_all('p') x_model = x_model_p[1].get_text() podaci['Model'] = x_model print(podaci['Model']) # Godiste if (i==2): x_godiste_p = ispod_divs[2].find_all('p') x_godiste = x_godiste_p[1].get_text() podaci['Godište'] = x_godiste print(podaci['Godište']) # Kilometraza if (i==3): x_kilometraza_p = ispod_divs[3].find_all('p') x_kilometraza = x_kilometraza_p[1].get_text() podaci['Kilometraža'] = x_kilometraza print(podaci['Kilometraža']) # Gorivo if (i==4): x_gorivo_p = ispod_divs[4].find_all('p') x_gorivo = x_gorivo_p[1].get_text() podaci['Gorivo'] = x_gorivo print(podaci['Gorivo']) # Napredni filteri # Dodatna polja if (result_item.find_all('div',{'id':'dodatnapolja1'})): dodatnapolja_all_divs = result_item.find_all('div',{'id':'dodatnapolja1'}) for i in range (0,len(dodatnapolja_all_divs)): df_pom = dodatnapolja_all_divs[i].find_all('div',{'class','df'}) for j in range (0,len(df_pom)): df_pom1 = df_pom[j].find('div',{'class','df1'}).get_text() if (df_pom[j].find('div',{'class','df2'}).find('i')): df_pom2 = True else : df_pom2 = df_pom[j].find('div',{'class','df2'}).get_text() podaci[df_pom1] = df_pom2 # KW single kw = podaci['Kilovata (KW)'].split()[0] podaci['Kilovata (KW)'] = kw print(kw) # Vrijeme i datum if (result_item.find('time', {'class' : 'entry-date'})): date_time_div = result_item.find('time', {'class' : 'entry-date'}).get_text().split() datum = date_time_div[0] vrijeme = date_time_div[2] podaci["Datum"] = datum podaci["Vrijeme"] = vrijeme # print(podaci["Datum"], podaci["Vrijeme"]) # Insert datas to database dictionary_copy = podaci.copy() podaci_db.append(dictionary_copy) print('--------------------------------------------------------------------') # ------------- CREATE PANDAS DATAFRAME - DICTIONARY -------------- # olx_db = pd.DataFrame(podaci_db) # treba biti niz # # print(olx_db) # olx_db.to_excel('probatest1.xlsx',index=False)