· 5 years ago · Jul 09, 2020, 10:18 PM
1#!/usr/bin/python3.6
2'''
3Program som innhenter informasjon om absolutt alle registrerte kjøretøy i hele norge over tid.
4Kjøres i bakgrunnen og vedlikeholder en dårlig oppdatert sqlite3database kontinuerlig.
5'''
6import requests
7import sqlite3
8import json
9import time
10
11class getData():
12 def __init__(self):
13 ''' sett opp og initialiser databasen '''
14 location = 'data.db'
15 self.x = sqlite3.connect(location)
16 self.sql = self.x.cursor()
17 write = 'create table if not exists cars (kjennemerke TEXT, data TEXT)'
18 self.sql.execute(write)
19 self.x.commit()
20 # API url
21 self.url = 'https://www.vegvesen.no/ws/no/vegvesen/kjoretoy/kjoretoyoppslag/v1/kjennemerkeoppslag/kjoretoy/'
22 # last potensielle kombinasjona inn i minnet:
23 try:
24 with open('data.json', 'r') as _dict:
25 self.data = json.loads(_dict.read())
26 _dict.close() # close file.
27 print('Lastet inn skiltkombapulator fra fil.')
28 except:
29 import string
30 strings = []
31 disallowed = ['I', 'M,', 'O', 'Q', 'W']
32 nocombo = ['SS', 'NS']
33 possible_combos = []
34 self.data = {}
35 print('Kunne ikke laste skiltkombapulator fra fil. Oppretter..')
36 for i in string.ascii_uppercase:
37 if i not in disallowed:
38 strings.append(i)
39
40 for i in strings:
41 for y in strings:
42 if i+y not in nocombo or i+y not in possible_combos:
43 possible_combos.append(i+y)
44 self.data[i+y] = []
45
46 for pre in possible_combos:
47 for i in range(10000, 99999):
48 self.data[pre].append(i)
49
50 with open('data.json', 'w') as fil:
51 print('Dumping to table')
52 fil.write(json.dumps(self.data))
53 fil.close()
54 pass
55
56 def request(self, merke):
57 ''' Gjør den faktiske requesten mot vegvesnet'''
58 req = requests.get(self.url + merke)
59 data = json.loads(req.text)
60 if 'status' not in data:
61 #Success we found a car!
62 query = "INSERT INTO cars (kjennemerke, data) VALUES(?, ?)"
63 val = (merke, json.dumps(data))
64 self.sql.execute(query, val)
65 self.x.commit()
66 try:
67 print('{}, først registrert {}'.format(merke, data['registrering']['forstegangsregistrering']))
68 except:
69 print('{} - fant ikke førstegangsregistrering, likevel data likevel lagret.'.format(merke))
70 pass
71 time.sleep(120) # wait!
72 elif 'status' in data:
73 if data['status'] == 400:
74 # car not found
75 self.miss += 1 #øk misscounteren med 1.
76 pass
77 elif data['status'] == 500:
78 # Ratelimited!
79 time.sleep(5) #we'll wait and try again.
80 self.request(merke) # rekursivt selvkall.
81 else:
82 print('Fikk feilkode {} fra server. Full feilbeskjed under: \n\n{}'.format(data['status'], data))
83 else:
84 pass
85 return
86
87 def parse(self):
88 ''' Parse gjennom skiltkombinasjona. '''
89 for i in self.data:
90 self.miss = 0
91 if i == 'YA':
92 for y in self.data[i]:
93 if self.miss >= 100:
94 # Vi har ikke fønne de 100 siste søkan vi har gjort, hopp videre tell neste bokstavserie
95 break
96 kjennemerke = i + str(y)
97 if len(self.x.execute('SELECT * from cars WHERE kjennemerke = "{}"'.format(kjennemerke)).fetchall()) == 0:
98 if y >= 30000:
99 self.request(kjennemerke)
100x = getData()
101x.parse()