Files
old-kivi-za-auta/kivi_cars/allcrawlers/autocrawler/crawleritem.py
2022-05-09 09:07:41 +02:00

324 lines
10 KiB
Python

# ----------Imports------------
from datetime import date
from traceback import print_tb
from unittest import result
from urllib import response
from urllib.request import Request
from warnings import filters
from xml.etree.ElementTree import tostring
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}
# 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'})
olx_id = []
# All filters
filters = {
"Olx_id" : 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 == 18): podaci['Kategorija'] = ('Automobili')
for i in range(0, 1): #len(olx_id)
# Artikal olx_link
# artikal_link = 'https://www.olx.ba/artikal/' + '35731053'
artikal_link = 'https://www.olx.ba/artikal/' + '36976713'
podaci["Olx_id"] = artikal_link
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
kw = podaci['Kilovata (KW)'].split()[0]
# 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"])
# Vrsta oglasa
dictionary_copy = podaci.copy()
podaci_db.append(dictionary_copy)
# ------------- CREATE PANDAS DATAFRAME - DICTIONARY --------------
# olx_db = pd.DataFrame(podaci_db) # treba biti niz
# # print(olx_db)
# olx_db.to_excel('proba2.xlsx',index=False)
# ----------------------- End of Code -------------------------
# print(len(podaci_db))
# print(podaci)
# print(podaci.keys())
# print(broj_el)