Initial commit
This commit is contained in:
commit
82e53f4b5a
5
.gitignore
vendored
Normal file
5
.gitignore
vendored
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
.idea/
|
||||||
|
venv/
|
||||||
|
__pycache__/
|
||||||
|
.env
|
||||||
|
*.iml
|
99
main.py
Normal file
99
main.py
Normal file
|
@ -0,0 +1,99 @@
|
||||||
|
import logging
|
||||||
|
import os
|
||||||
|
|
||||||
|
import pymysql
|
||||||
|
import requests
|
||||||
|
from dotenv import load_dotenv
|
||||||
|
|
||||||
|
import sql_connction_handler as sql_handler
|
||||||
|
|
||||||
|
API_URL = 'https://creativecommons.tankerkoenig.de/json/detail.php'
|
||||||
|
|
||||||
|
|
||||||
|
def get_prices_for_station(station_id, api_id: str, api_key) -> []:
|
||||||
|
"""
|
||||||
|
Crawls the prices for the given station and returns them in a tuple: (E5, E10, Diesel)
|
||||||
|
:param api_id: The api id of the station
|
||||||
|
:return: The tuple with the prices
|
||||||
|
"""
|
||||||
|
url = f'{API_URL}?id={api_id}&apikey={api_key}'
|
||||||
|
|
||||||
|
station_details = requests.get(url).json()
|
||||||
|
|
||||||
|
if station_details['ok'] is True:
|
||||||
|
details = station_details['station']
|
||||||
|
return [
|
||||||
|
(station_id, details['e5'], 'E5'),
|
||||||
|
(station_id, details['e10'], 'E10'),
|
||||||
|
(station_id, details['diesel'], 'Diesel'),
|
||||||
|
]
|
||||||
|
|
||||||
|
return []
|
||||||
|
|
||||||
|
|
||||||
|
def save_prices_to_sql(prices: [()], conn: pymysql.Connection):
|
||||||
|
"""
|
||||||
|
Saves the list of price tuples to sql
|
||||||
|
:param prices: The list of prices to save to sql
|
||||||
|
:param conn: The pymysql connection
|
||||||
|
"""
|
||||||
|
stmt = 'INSERT INTO prices (station, price, fuel_type) VALUES (%s, %s, %s)'
|
||||||
|
cur = conn.cursor()
|
||||||
|
success = cur.executemany(stmt, prices)
|
||||||
|
if success:
|
||||||
|
conn.commit()
|
||||||
|
cur.close()
|
||||||
|
|
||||||
|
return
|
||||||
|
|
||||||
|
|
||||||
|
def get_stations_from_sql(conn: pymysql.Connection) -> []:
|
||||||
|
"""
|
||||||
|
Gets all stations that should be crawled from sql
|
||||||
|
:param conn: The pymysql connection
|
||||||
|
:return: The list of stations
|
||||||
|
"""
|
||||||
|
stmt = 'SELECT station_id, tankerkoenig_id FROM stations WHERE active_crawling = 1'
|
||||||
|
cur = conn.cursor()
|
||||||
|
cur.execute(stmt)
|
||||||
|
res = cur.fetchall()
|
||||||
|
cur.close()
|
||||||
|
|
||||||
|
stations = []
|
||||||
|
|
||||||
|
for station in res:
|
||||||
|
stations.append({
|
||||||
|
'id': station[0],
|
||||||
|
'api_id': station[1]
|
||||||
|
})
|
||||||
|
|
||||||
|
return stations
|
||||||
|
|
||||||
|
|
||||||
|
def crawl_and_save():
|
||||||
|
"""
|
||||||
|
Main function, crawls data from api and saves it to sql
|
||||||
|
"""
|
||||||
|
conn = sql_handler.get_connection()
|
||||||
|
api_key = os.getenv('TANKERKOENIG_API_KEY')
|
||||||
|
|
||||||
|
if not conn or not api_key:
|
||||||
|
logging.warning('Could not fetch prices as either SQL connection or API key are missing!')
|
||||||
|
return
|
||||||
|
|
||||||
|
stations = get_stations_from_sql(conn)
|
||||||
|
|
||||||
|
station_prices = []
|
||||||
|
|
||||||
|
for station in stations:
|
||||||
|
prices = get_prices_for_station(station['id'], station['api_id'], api_key)
|
||||||
|
|
||||||
|
station_prices.extend(prices)
|
||||||
|
|
||||||
|
save_prices_to_sql(station_prices, conn)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
load_dotenv()
|
||||||
|
|
||||||
|
crawl_and_save()
|
3
requirements.txt
Normal file
3
requirements.txt
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
pymysql
|
||||||
|
python-dotenv
|
||||||
|
requests
|
34
sql_connction_handler.py
Normal file
34
sql_connction_handler.py
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
import logging
|
||||||
|
import os
|
||||||
|
|
||||||
|
import pymysql as pymysql
|
||||||
|
|
||||||
|
|
||||||
|
def get_connection() -> pymysql.Connection:
|
||||||
|
"""
|
||||||
|
Get a connection to SQL.
|
||||||
|
This function is used on the vServer for local testing
|
||||||
|
@return: pymysql connection object
|
||||||
|
"""
|
||||||
|
try:
|
||||||
|
if os.environ['IS_VSERVER'] == 'true':
|
||||||
|
conn = pymysql.connect(
|
||||||
|
user=os.environ['vServer_SQL_User'],
|
||||||
|
password=os.environ['vServer_SQL_Password'],
|
||||||
|
host='localhost',
|
||||||
|
port=3306,
|
||||||
|
database='Spritpreise'
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
conn = pymysql.connect(
|
||||||
|
user=os.environ['PADDY_SQL_USER'],
|
||||||
|
password=os.environ['PADDY_SQL_PASSWORD'],
|
||||||
|
host=os.environ['SQL_SERVER'],
|
||||||
|
port=3306,
|
||||||
|
database='Spritpreise'
|
||||||
|
)
|
||||||
|
|
||||||
|
return conn
|
||||||
|
except pymysql.Error as e:
|
||||||
|
logging.error('SQL Connection error: %s', e)
|
||||||
|
return None
|
Loading…
Reference in New Issue
Block a user