Monday 24 April 2017

Web scraping eli tietojen "kaavinta"

Tänä keväänä tori.fi:llä järjesti toista kertaa Autokuume-nimisen kilpailuarvonnan. Kilpailussa Tori.fi piilottaa automyynti-ilmoitusten joukkoon voittoina olevat autot, jotka tulee löytää normaalien ilmoitusten joukosta jotta pääsee osallistumaan arvontaan. Palkintoautojen ilmoitukset ovat muuten sisällöltään normaalit, mutta ne tunnistaa siitä että yhdessä myyntikuvista auto on peitetty punaisella peitteellä. Ilmoitukset on piilotettu kolmena peräkkäisenä lauantaina, eli jaossa on yhteensä kolme autoa.

Autokuume 2017 palkinnot.
Autoista julkistetaan etukäteen kuva joissa autot on peitetty. Tosi autotietäjät tietysti tunnistavat automallit jo tästä kuvasta, mutta me muut voimme arvailla tai ainakin rajoittaa valikoimaa hieman ulkomuodon perusteella.

Tori.fi:ssä on nyt noin 70000 automyynti-ilmoitusta ja haluaisi löytää tuon palkintona olevan auton niin kaikkien ilmoitusten läpikäyntiin menisi noin 100h klikkailua koneen ääressä. Aikaa voi tietysi säästää tekemällä rajoituksia hakuun kuvan perusteella ja muuten olettaen palkintona oleva auton muita hakuominaisuuksia (hinta, vuosimalli, km). Siltikin jos jäljelle jäisi esim. 1500 hakutulosta niin niiden läpikäyntiin menisi noin 2h.

Miten tämä sitten liittyy tiedon kaavintaan eli web scraping:iin? No tämä hakutulosten läpikäynti voidaan helposti automatisoida. Aikasemmin kirjoitin auton ostosta Excelin avulla ja silloin jo mainitsin että kopioin autojen myyntidataa Nettiautosta iMacros-selainlaajennuksen avulla. Samaa työkalua voidaan käyttää myös tässä yhteydessä.

Homma lähtee siitä että tehdään tori.fi:ssä haku myytävistä autoista ja avataan ensimmäinen hakutulos.
Hakutulos.
Nyt kun lähdemme automatisoimaan tulosten läpikäyntiä niin meitä kiinnostaa autojen kuvat. Ison kuvan alla on pikkukuvat joista oletettavasti löydämme etsittävän auton joten tavoitteenamme on tallettaa ne ja siirtyä seuraavaan hakutulokseen klikkaamalla oikeassa yläkulmassa olevaa "Seuraava>>" -linkkiä ja toistaa kuvien tallettaminen uudelleen.

Kaiken tämän voimme tehdä iMacros-selainlaajennuksella. iMacros käyttää omaa, hyvin rajoittunutta, koodikieltä makroissa, mutta makroja on myös mahdollista höystää muilla ohjelmointikielillä kuten JavaScriptillä. Tässä tapauksessa iMacrosin omat ominaisuudet eivät riittäneet koska tarvitsimme kaksi erillistä silmukkaa. iMacros JavaScript-koodi, jota tässä tapauksessa käytettiin on seuraavanlainen:

//imacros-js:showsteps no
// Make a search
// Set number of hits and number of images to be downloaded
// Open first hit and run the script

var macro1 = "CODE:";
macro1 += "SET !TIMEOUT_STEP 0" + "\n";
macro1 += "TAG POS=1 TYPE=H1 ATTR=TXT:* EXTRACT=TXT" + "\n";
macro1 += "ONDOWNLOAD FOLDER=* FILE={{!NOW:yyyymmdd_hhnnss}}_{{hit}}{{image}}_{{!EXTRACT}}.jpg WAIT=YES" + "\n";
macro1 += "TAG POS={{image}} TYPE=IMG ATTR=SRC:https://d38a5rkle4vfil.cloudfront.net/image/thumbs* CONTENT=EVENT:SAVEPICTUREAS" + "\n";

var macro2 = "CODE:";
macro2 += "TAG POS=1 TYPE=A ATTR=ID:next_url" + "\n";

for (var hit = 1; hit <= 1500; hit++) 
{
   iimSet("hit", hit);
   iimPlay(macro2);
   
   for (var image = 1; image <= 6; image++) 
   {
      iimSet("image", image);
      iimSet("hit", hit);
      var ret = iimPlay(macro1);
      if (ret != 1)
         break;
   }
}

Koodissa macro1 hoitaa kuvien talletuksen. Ensin asetetaan aikakatkaisu nollaksi joka ehkä nopeuttaa makron suorittamista tilanteissa joissa kuvat loppuvat kesken. TAG komennolla etsimme ensimmäisen (POS=1) H1-tyyppiä olevan elementin sivulta joka on sivun otsikko joka näkyy selaimen yläpalkissa. Tätä käytetään seuraavalla rivillä osana tiedostonimeä. Tiedostonimi asetetaan siis FILE= parametrilla ja olen käyttänyt tässä tapauksessa ensin päiväys+kellonaika ja sen jälkeen monesko hakuosuma {{hit}} on kyseessä ja sen hakuosuman kuvan numero {{image}}. Sen jälkeen {{!EXTRACT}} lisää vielä edellisellä rivillä talletetun sivun otsikon tiedostonimeen, jotta löydetty auto on helpompi löytää uudelleen. Tiedosonimi on siis muotoa: 20170330_190349_31_Skoda Fabia Farmari Tsi.jpg. Viimeinen rivi macro1:ssä tekee varsinaisen kuvan talletuksen. Siinä siis käydään läpi kaikki kuvat joiden osoite alkaa https://d38a5rkle4vfil.cloudfront.net/image/thumbs. {{image}} on kuvan järjestysnumero jota kasvatetaan alempana olevassa for-silmukassa.

macro2 taasen hoitaa seuraavaan hakutulokseen siirtymisen. Siinä aktivoidaan ensimmäinen linkki jonka ID on next_url. Linkkien ID:t ja järjestysnumerot saa helpoiten selvitettyä nauhoittamalla iMacros-työkalulla makron jossa painetaan linkkiä.

Alimmaisena on sitten varsinainen JavaScript osuus joka generoi iMacros makrot. Siinä ulommainen for-silmukka määrittelee kuinka monta kertaa siirrytään seuraavaan hakutulokseen (hit). Tämän numeron tulee olla sama kuin hakutulosten määrä. Makro siis aloittaa suoraan siirtymällä seuraavaan hakutulokseen kun oletettavasti avoinna olevan sivu on jo tarkistettu manuaalisesti.

Sisempi silmukka taas määrittelee kuinka monta kuvaa ilmoituksesta talletetaan. Makrot palauttavat aina jonkun paluuarvon (ret). Tässä tapauksessa paluuarvo on 1 jos kuva löytyi ja jos kuvaa taas ei löydy niin palautusarvona tulee joku virhekoodi. Jos palautusarvo on jotain muuta kuin 1 niin sisemmän silmukan suorittaminen keskeytetään ja siirrytään seuraavaan hakutukseen. Näin emme turhaan käytä aikaa ylimääräisiin silmukoihin ilmoituksissa joissa on vain yksi kuva.

Näin saamme talletettua kaikkien hakutulosten pikkukuvat yhteen hakemistoon ilman että käyttäjän tarvitsee tehdä muuta kuin käynnistää makro. Kun makro on mennyt läpi hakutulokset muutamassa tunnissa, niin käyn vain hakemiston kuvat läpi ja etsin punaiseen kankaaseen käärityn auton ja pääsen osallistumaan arvontaan.

----------------------------------------------------------
Ja miten tämä sitten toimi käytännössä... no aika huonosti.

1.4. Oletin että palkintoauto olisi vuosimallia 2010 tai uudempi. Palkintoauto oli 2009 vuosimallia ja jäi haustani pois.
8.4. Jätin haustani pois mm. viistoperäiset kun ei kuvassa selaiselta näyttänyt, auto oli viistoperäinen.
15.4. En ollut koneen ääressä ko. päivänä.

Palkintoautot paljastettuna.
Seuraava vuotta varten muistiin seuraavaa:
  • Palkintoautot ovat yksityisen henkilön ilmoituksia
  • Palkinnon ilmaisevat kuvat ovat toinen ja kolmas kuva, eli riittää että ottaa kuvan 2 tai 3 talteen
  • Kuvien kuvasuhde on kamerakuvista poikkeva; 670x475


Tuesday 19 July 2016

Passat B7 sisätilalämmitinhaaroitussarjan asennus

Tässä ohjeet 2013 Volkswagen Passat DSG B7 sisätilalämmitinpistorasian asennukseen.

Ostin Defa-sisähaaroitusjohdon ja puskurijohdon tori.fi:stä, noin 40€ postitettuna. Myös Autovahinkokeskuksella on hyvä valikoima käytettyjä johtosarjoja, puskurijohto ja sisähaaroitus yht. noin 70€. Passattiin tarvitaan puskurijohdon lisäksi kaksi jatkojohtoa jotta ne ylttävät apukuskin jalkatilaan helposti.

Läpivienti sijaitsee konetilassa akun takana. Akku poistetaan tieltä irroittamalla akkukaapelit ja akun kiinnityslätkä akun alareunasta moottorin puolelta. Tämän jälkeen akkukotelon seinät poistetaan. Tulipellissä näkyy alkuperäisen johtosarjan läpivienti ja sen vieressä on vasemmalla puolella on 'kellonmuotoinen' kumilätkä josta vedin haaroitussarjan sisään. Nyt kun asiaa mietin niin kyseessä varmaan on manuaalivaihteisen auton kytkinpolkimen läpivienti ja siinä tapauksessa tämä ohje sopii vain automaattilaatikolla oleviin autoihin. Toisaalta vieressä on auton johtosarjan läpivienti jossa on vielä tilaa panssarikaapelille.

Läpivienti akkukotelon takana.
Läpivienti lähempää, oikealla puolella auton johtosarjan läpivienti.


Asennuksen sisältä aloitin poistamalla radion ja hansikaslokeron. Radio irroitetaan vetämällä kehys irti, alla olevassa kuvassa on kiinnityspisteiden paikat. Apuna käytin Ebaysta tilattua verhoilunirroitustyökalusarjaa.

Radion kehys.
Hansikaslokeron lähtee irti irroittamalla kolme ruuvia alhaalta ja muutama ruuvi lokeron etulaidasta sisäpuolelta. Tämän lisäksi keskellä alhaalla on lukitus jota meisselillä painamalla lokero lopulta irtoaa. Seuraavaksi irroitin kuskin jalkatilan alasuojan joka on muutamalla ruuvilla kiinni. OBD II liitin pitää myös irroittaa. Ratin vasemmalta puolelta kannattaa irroittaa lokero niin näkyvyys kojelaudan alle on parempi. Se irtoaa ilman työkaluja avaamalla se alas asti ja vetämällä irti saranoilta. Irroitin myös apukuskin vasemman jalkalistan johon kiinnitin pistorasian. Tämän irroitus ei ole välttämätön jos ruuvaa rasian suoraan kiinni muoviin. Itse käytin 4 mm läpipultteja ja muttereita. Jalkalista irtoaa irroittamalla yksi ruuvi ja vetämällä takaa vaihdekepin kohdalta alaspäin. Ruuvin vieressä on vielä yksi pidike joka irtoaa vetämällä muovia taaksepäin.

Läpivienti sisäpuolella on kahden verhoilun läpi tulevan kierretapin yläpuolella. Äänieristeet ovat aika paksut ja painoin ulkopuolelta piikillä merkin mistä johdon aioin vetää läpi ja porasin 20mm reikäporalla eristeisiin reiän.

Läpivienti sisäpuolelta katsottuna.

Läpivienti valkoisten tappien kohdalla, äänieriste oli valmiiksi leikattu kuvan mukaisesti. Reikä porattu itse.

 Sisällä työnsin johdon radion yläpuolelta kuskin jalkatilaan jossa se riitti noin ratin yläpuolelle jossa liitin johdon moottoritilasta tulevaan johtoon. Rasian ruuvasin apukuskin jalkatilassa aivan vasempaan etukulmaan ja johto meni kivasti hansikaslokeron vierestä verhoilujen sisään.
Sisähaaroitusjohdon rasia. Kuvassa myös samalla lisäämäni jalkatilan valo.

 Konetilassa läpiviennin läpi tulevan johdon vedin aluksi vinosti alaspäin jotta mahdollinen vesi ei valuisi johtoa myöden sisään. Johdossa oli sen verran ylimääräistä että vedin puskurijohdon jatkoskohdan akun vierestä imuilmaputken päälle johon siis tuli toinen liitos. Siitä vedin puskurijohdon kaapelinvetovaijerilla alemman maskin reunaan eikä puskuria tarvinnut irroittaa lainkaan.

Defa minipistoke Passat B7 maskissa.
Minipistokkeen kiinnitin nyt aluksi ihan vain nippusiteillä mutta jos tässä joskus otan puskurin irti niin todennäköisesti siirrän pistokkeen sumuvalon viereen. Johdon kiinnitys on myös vielä puutteellinen kun etupää on niin hyvin suojattu että johtoon ei pääse mistään helposti käsiksi.

 Lohkolämmitintä en ole ainakaan vielä hankkinut kun käsittääkseni DSG:n kanssa olisi lämmittimessä oltava pumppu. TT Thermon 1000KLD pitäisi olla autoon sopiva ja tuota on myös kehuttu tehokkaaksi. Luotettavuudesta olen taasen lukenut jotain moitteita. Akkulaturin hankinta on myös ollut suunnitelmissa, mutta Passatissa kun on kaksi akkua niin latausjärjestelyt eivät ole ihan yksinkertaiset jos haluaa ladata molempia akkuja samaan aikaan.




Passat B7 Navigator retrofit (RCD510 -> RNS510)

I have 2013 Volkswagen Passat (European version) with fairly good options, but I was missing RNS-510 navigation unit. I decided upgrade my RCD-510 to RNS-510 if I find reasonable priced unit.

Purchase  

Quite soon after I had the car I found one RNS unit for sale and price was only 295€. Before purchasing the unit I checked for local VW service that I would get the security PIN code from them for it as the seller did not have the code. That was confirmed and I bought the unit and we made the contract papers showing original Vehicle Identification Number (VIN), registration number and radio serial number. With that paper I can prove that the unit is not stolen.

RNS-510 was from 2009 Passat with part number 1T0 035 680 B. This will mean that I do not have the LED screen, but I hope it will be just fine.


GPS antenna

 I assumed that I did not have the GPS antenna in my car so I ordered one from ebay.de Lithuanian seller for less than 8€. Magic word for finding antenna was FAKRA. FAKRA is the type of the connector. I installed the antenna above center air vents, just behind the vent outlet. This can be done by removing the clove box.

Security PIN code

Called local VW dealer service and they promised the code for new RNS510 and for my current RCD510 for small fee. Codes were not given on phone as ID and car papers will be checked. I drowe there and small fee ended up to be 50€! And that was per code! So I was requested to pay 100€ for the codes that should have been given with the car. I refused their offer and walked away.

Next I contacted another VW dealer and their approach was more customer friendly. They would check the codes for free! So I drove to the second dealer with serial numbers and contract papers. They enter the VIN codes to the system but could not get codes for either of the units. The car where the RNS510 was from was imported from Germany and my Passat was imported from Sweden. Dealer assumed that they are not able to get codes from the database for the imported vehicles. Anyhow they said that I could come another day and they will plug-in the tester and fetch the codes that way.

Later I came again to the dealer service and they got the code for the original RCD510 and then I replaced the unit with new RNS510. The service tried to change the coding for the new unit, but that was not easy for them so I suggested that I will do the coding with VCDS :). That was done and the code for the RNS510 was acquired as well.

Firmware

 

Original firmware in the unit was 1100. According the information in gpsundergroumd.com latest suitable firmware would be 5274, but 5238 was mainly recommended. I burned the firmware to CD-R and restarted the unit with eject+info+Setup buttons. Then SWL disc was requested and update started. Update process took almost one hour. Firmware and map updates can be done without security PIN code. All was ok when I got the security code and I was able to check it.

Maps

I downloaded the latest maps V10 Eastern Europe from the gpsunderground.com links (with very slow download speed). I did read from that same forum that burning the maps to DVD can easily fail so I took the SD-Card update path. I downloaded the Maps-Tool application that will prepare the SD-card and boot-up DVD. Just restart the unit with eject+info+Setup and insert the SD card and boot-up DVD and the maps will be copied from SD-card to the HDD. 

Installation

 The installation is fairly easy. Just pull out the radio trim cover. I used trim removal tools that I ordered from Ebay for couple of euros. Photo below will show where the connecting parts are located in rest-of-the-world model Passat.
Then remove 4 screws and pull out. Connectors have locking latches that need to be pulled out before connectors can be removed.
 

VCDS coding

Navigator need to be configured for the car. This will require coding of the CAN-bus gateway. Gateway must know that new unit is present and old unit is removed. Help for these changes I found from wiki.ross-tech.com. As I have the Dynaudio audio system with amplifier the navigator unit output need to be coded for lower level. For this I found good instructions from my-gti.com

Custom start-up screen

Final touch was update of the custom start-up screen. There is a good web site www.netdata.be/iso/ where you can create your own logos or download logos that other users have made. I selected one from the downloads. Then the service create .ISO-file that can be burned to CD-R and then just insert the disc and restart the unit. Now my start-up screen will look like this:
Custom start-up screen for RNS510.


Friday 13 May 2016

Auton osto Excelillä

Auton hankinta tuli ajankohtaiseksi ja kun ostolla ei ole tällä kertaa mitään kiirettä niin ajattelin hieman perehtyä autojen hinnamuodostukseen Excelin avulla ja siten yrittää löytää ns. alihinnoitellut kohteet.

Lähdin liikkeelle Nettiauton Ajoneuvohintatilastosta jossa pystyy listaamaan viimeisen 6kk:n ajalta toteutuneet kaupat mallin ja vuosimallin perusteella. Hinnat ovat käyttäjien ilmoittamia toteutuneita hintoja (ei siis pyyntihintoja). Tilasto jo sellaisenaan on hyvä apu eri autojen hintaluokkien selvittelyyn, mutta halusin mennä luonnollisesti hieman pidemmälle.

Siirsin Nettiauton tilastodatan Exceliin. Tämän tietysti voisi tehdä käsin copy-pastella, arvot käsin syöttämällä tai tallettamalla html-sivu ja siivoamalla se jollain scriptillä. Itse kuitenkin käytin apuna Firefoxiin ladattavaa iMacros selainlaajennusta jonka avulla poimin tilaston rivit .csv tiedostoon sivu kerrallaan. iMacros ei ole kaikkein helppokäyttöisin makro-ohjelma, mutta paras mitä tähän käyttöön löysin ja olen käyttänyt sitä aiemminkin. En nyt kuitenkaan kirjoita iMacrosin käytöstä tämän enempää, mutta pääasia kuitenkin oli että data saatiin Exceliin.

Otantana minulla oli kolme automallia, Skoda SuperB, Volkswagen Passat ja Volvo V70. Jokaisesta automallista keräsin datat vuosilta 2011-2014. Näistä kertyi yhteensä noin 3000 riviä ja se oli syynä miksi tuohon datan keräämiseen kannatti käyttää jotain automaattista työkalua.

Excelissä data näytti .csv tuonnin jälkeen tällaiselta:
Data tuotuna Exceliin.

Taulukossa oli kaikki vuosimallit peräkkäin ja tämä mahdollisti helpot datan suodatukset eri parametreillä. Automallit jaoin eri välilehdille.

Tästä datasta sitten loin scatter kuvaajan jossa x-akselilla on mittarilukema ja y-akselilla hinta. Eri vuosimallit ovat eri sarjoja jolloin eri vuosimalleilla on erinäköinen arvopiste. Tuloksena saatiin seuraavanlaiset kuvaajat:

Skoda SuperB 2011-2014 Nettiauto.com

Volkswagen Passat 2011-2014 Nettiauto.com

Volvo V70 2011-2014 Nettiauto.com

Kuvaajaan lisäsin myös trendiviivat (exponentiaalinen) jokaiselle vuosimallille erikseen jolloin eri vuosimallien väliset keskimääräiset hintaerot näykyvät selvästi.

Miten tätä kuvaajaa sitten pitäisi hyödyntää? No jos jossain on myynnissä kiinnostavan auto, niin taulukosta on helppo katsoa kilometrien, vuosimallin ja hinnan perusteella mihin kohtaan ko. auto sijoittuu ja saa nopean käsityksen siitä onko hinta kohdallaan. Mitä enemmän vasemmalla ja alhaalla piste on sitä parempi hinta/km suhde autolla on. Tilastosta voi myös katsoa että jos olet ostamassa 40tkm ajettua Skoda SuperB:tä niin hinnassa ei juurikaan ole eroa sillä onko auton vuosimalli 2011 vai 2012.

Huonona puolena Nettiauton hintatilastossa on se että sitä ei voi valmiiksi suodattaa esim. moottorin koon perusteella. Suodatuksen voi onneksi helposti tehdä Excelin puolella. Tähän alle olen kerännyt SuperB, Passat ja V70 mallien tiedot nelivetoisista Diesel (farmareista) joiden ajokilometrit ovat alle 110 tkm. Excelin suodattimiin sai helposti vain kaksi ehtoa saraketta kohden niin esim. Passatin osalta Variant-suodatinta en saanut enää mukaan ilman että datan olisi ensin kopioinut toiseen taulukkoon ja tehnyt siellä uuden suodatuksen. Alla olevissa taulukoissa pisteitä on luonnollisesti vähemmän ja trendiviivat eivät otannan vähäisyyden vuoksi ole niin havainnolliset kuin isommalla datamäärällä.
SuperB 2.0 Combi TDI 4x4 2011-2014 Nettiauto.com

Passat 2.0 TDI 4wd (mukana myös sedan) 2011-2014 Nettiauto.com

V70 2.0 -> AWD 2011-2014 Nettiauto.com


Että ei muuta kuin autokaupoille ja lopulta se auto tulee kuitenkin ostettua pelkän fiiliksen perusteella :)