https://github.com/TheidenHD/Forschungsprojekt_HWR_Agil
- Python
- SQLite
- SQLAlchemy
pip install sqlalchemy
pip install pytrends
pip install requests
pip install beautifulsoup4
Von Hand angelegte Tabellen deren Daten vom Programm zur Ausführung genutzt werden. Diese tabellen werden über die Skripts in /main/database/scripts/ mit Daten befüllt.
Vom Programm angelegte Tabellen in denen das Programm die Ergebnisse hinterlegt.
Bei jedem Durchlauf des Programmes wird ein Eintrag in der Scan-Tabelle angelegt mit dem
aktuellen Datum und dem Suchintervall für das Programm. Das Suchintervall kann zum Beispiel ein
Wert von 90 Tagen haben, wodurch das Programm bei dem Scan nur die Daten aus diesem Intervall
mit in das Ergebnis mit einbezieht.
Ein Scan durchsucht dann jede Quelle in der Source-Tabelle und legt dafür jeweils einen Eintrag in der
Search-Tabelle an. Der Search-Eintrag kann dabei einen Gewichtungswert enthalten, falls bestimmte
Quellen mehr in das Endergebnis einfließen sollen als andere.
Bei der Suche in einer Quelle wird für jede darin gefundene Rasse aus der Race-Tabelle ein Eintrag in der Found-Tabelle angelegt. Für die jeweils im Found-Eintrag hinterlegte Rasse, wird für jede gefundenen Krankheit aus der Disease-Tabelle ein Eintrag in der Hit-Tabelle angelegt mit der Anzahl der gefundenen Vorkommen der Krankheit bei dieser Rasse.
Die beiden Tabellen RaceName und DiseaseName halten die eigentlichen Namen der Tabellen Race und Disease, da es für viele Rassen und Krankheiten mehrere Bezeichnungen gibt. Die Tabellen Race und Diesase gruppieren diese Namen also eigentlich nur über die Id.
Als Schnittstelle zur Datenbank wird die Objektrelationale Abbildung von SQLAlchemy genutzt. Es gibt unter /main die Datei database_context.py, welche die Verbindung zur Datenbank herstellt und unter /main/models mehrere Modellklassen, welche die Datenbanktabellen nachstellen. Diese Modellklassen ermöglichen es mit den Tabellen aus der Datenbank als Python-Objekte zu arbeiten und beinhalten Variablen für die Werte in den Spalten, sowie Verweise auf andere Einträge die in Beziehung stehen.
from sqlalchemy import Column, Integer, ForeignKey
from sqlalchemy.orm import relationship
from ..database_context import database
class Hit(database.table_base):
__tablename__ = 'Hit'
#Spalten
id = Column(Integer, primary_key=True)
amount = Column(Integer)
disease_id = Column(Integer, ForeignKey('Disease.id'))
#Verweise auf andere Einträge (Basierend auf ForeignKeys)
found_id = Column(Integer, ForeignKey('Found.id'))
found = relationship("Found", back_populates="hits")
disease = relationship("Disease", back_populates="hits")
def create_demo_data():
#Erstellen einer Session zum Bearbeiten der Datenbank
session = database.create_session()
#Abrufen von Einträgen von der Datenbank
disease = session.query(Disease).first()
race = session.query(Race).first()
#Erstellen von neuen Einträgen
found = Found(id=0)
scan = Scan(id=0, date=date.today(), interval=30)
source = Source(id=0, name="TestSource", url="www.TestSource.com")
search = Search(id=0, weight=7)
hit = Hit(id=0, amount=2)
#Verweise zu anderen Einträgen hinzufügen
hit.disease = disease
hit.found = found
found.race = race
found.search = search
search.source = source
search.scan = scan
#Hinzufügen von Änderungen zur Session
session.add(found)
session.add(scan)
session.add(source)
session.add(search)
session.add(hit)
#Änderungen der Session auf die Datenbank übertragen
database.commit_session(session)
Für einen neuen Crawler kann die Vorlage verwendet werden.
Der Ordner in dem ein Crawler liegt muss im main\crawlers Ordner liegen un darf nicht mit "_" anfangen.
Des Weiteren muss die Hauptdatei auf "_main.py" enden.
from ..crawler import *
class Example(Crawler):
def __init__(self):
super().__init__("Example","www.example.de",1)
def a_crawl(self, races: List[Race], diseases: List[Disease], scan: Scan):
return [[races[0], dict.fromkeys(diseases, 5)], [races[1], dict.fromkeys(diseases, 6)]]