Wie ich mit einer eigenen App versucht habe, eine Wohnung in München zu finden.
Es ist ziemlich einfach, auf Partys in München ein gemeinsames Thema zu finden: den Wohnungsmarkt. Ja, in München sind Mieten in vielen Fällen sehr hoch (wer das nicht glaubt, kann es hier, oder hier nachlesen). Und was noch ein weiteres Problem ist: Eine Wohnung zu finden, ist richtig schwer. Und trotzdem versucht man es. Denn hier zu leben hat ja durchaus Vorteile.
Vor einigen Jahren bin ich auf einen Blogpost von Karim Jedda gestoßen. Er arbeitet im Bereich Automation – und hatte das gleiche Problem, wie viele andere Leute: Wo bekomme ich eine Wohnung her? Sein Vorteil: Er konnte den Prozess automatisieren. Und nutze das gleich für ein Sozial-Experiment mit verschiedenen Namen, Herkunft und Nachrichten:
„a girl with an italian name, gets an 90% answer rate, a guy with an arab name and is younger than 25 gets, 1% answer rate. The master of all, is the young munich guy who is around 25 , called Hanz who almost gets an answer all the time. “
Karim Jedda auf seinem Blog
Wem dieser Versuchsaufbau bekannt vorkommt: Karim war auch an dem spannenden BR Data/Spiegel Online-Datenprojekt Hanna und Ismael beteiligt. Das Projekt versuchte, Diskriminierung am Mietmarkt zu messen.
Aber dieser Aufbau kann auch dem ganz einfachen Zweck dienen, eine neue Wohnung zu finden.
Die Grundannahme dabei: Wohnungsbesitzer stellen ihre Wohnung auf einem der gängigen Immobilienportale ein und werden dann mit hunderten von Bewerbungen überschüttet. Und schauen sich dann vielleicht nur die ersten Bewerbungen an. Sind da passende potenzielle Mieter dabei, werden sie eingeladen. Der Trick ist also, unter diese ersten Mails zu kommen. Am besten, indem man möglichst schnell von neuen Wohnungen erfährt.
Wie eine automatisierte Wohnungssuche aussehen könnte
Auch ich habe vor einigen Jahren eine neue Wohnung in München gesucht. Und habe dann darüber nachgedacht, meine Datenskills dafür einzusetzen.
Es gibt ja wirklich diverse Portale, die Wohnungen anbieten. Vermutlich verstößt es gegen deren AGB, wenn man diese Angebote automatisiert alle paar Minuten abgreifen würde. Technisch wäre das allerdings gar nicht so aufwendig.
Ich will das mal in einem – natürlich rein hypothetischen 😉 – Beispiel in der Programmiersprache Python (Version 2.7) skizzieren:
- Wir benutzen für das Scraping der Angebote verschiedene Libraries: urllib.request, um Webseiten zu öffnen; BeautifulSoup, um die Daten aus den HTML-Seiten zu „scrapen“ (mehr dazu hab ich übrigens schonmal gebloggt); damit wir nicht so auffallen, können wir fake_useragent benutzen. Das so tut, als käme unsere Anfrage nicht von einem Skript, sondern von einem Browser.
- Die Daten, die dabei anfallen würden, könnten wir in eine Datenbank schreiben. Ganz easy ist zum Beispiel sqlite. Dafür laden wir die Library sqlite3 und erstellen ein entsprechendes Schema:
![Screenshot Datenbank Wohnungssuche Schema](https://benedict-witzenberger.de/wordpress/wp-content/uploads/2020/02/Screenshot-Datenbank-Wohnungssuche-Schema-1024x393.png)
- Zu einem festgelegten Zeitpunkt (also alle paar Minuten) rufen wir die Wohnungs-Webseiten auf uns speichern die für uns relevanten Daten in die Datenbank.
- Damit wir keine Daten doppelt schreiben, arbeiten wir mit IDs. Steht eine ID schon in der Datenbank, wird ein Eintrag nicht übernommen.
![Screenshot Datenbank Wohnungssuche Inhalte](https://benedict-witzenberger.de/wordpress/wp-content/uploads/2020/02/Screenshot-Datenbank-Wohnungssuche-Inhalte-1024x502.png)
- Ein zweites Skript prüft nach jedem Durchlauf, ob neue Einträge/IDs in der Datenbank stehen. Wenn ja, sendet es eine E-Mail mit den neuen Wohnungsangeboten an mich. Das hat der folgende Codeblock ausgelöst:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
# sucht in der Datenbank nach neuen Wohnungen: time_test = cursor.execute("select * from wohnungen where timestamp >= ?", (last_time,)).fetchall() # Wenn es neue Wohnungen gibt, wird jede einzeln zum HTML hinzugefügt: if time_test: result_list = [] # für jede neue Wohnung bekommt result_list einen Eintrag mehr: for row in time_test: result_list.append(""" <h2>{}</h2> Adresse: {} {}<br> Warmmiete: {} Euro<br> Zimmer: {}<br> Link: {} <br> (Zeitstempel zur Überprüfung: {})<br>""".format(row[1], row[5], row[4], row[7], row[6], row[8], time.strftime('%d.%m.%Y %H:%M:%S', time.localtime(row[3])))) # body ist der Text in der Mail, der die Wohnungen umgibt: body = """ <html> <head></head> <p>Hallo,<br> Ich habe {} neue Wohnungen gefunden. Schau sie Dir doch mal an.<br> """.format(len(result_list)) +\ "<br>".join(result_list) +\ """ <br> Viele Grüße,<br> Dein Bot </p></html> """ |
Ich hab mich ehrlicherweise nicht getraut, automatisierte Mails zu verschicken. Denn ich glaube, dass es viel Sinn macht, in den Mails auf die angebotene Wohnung einzugehen – das können automatisierte Mail-Templates nur zu einem kleinen Teil leisten (indem sie Daten übernehmen, die eindeutig im Angebot stehen – Preis, Quadratmeter, Viertel, …).
Die Pointe am Ende ist übrigens sehr ähnlich zu der im Blogpost auf Funnybretzel. Ich habe eine Wohnung in München gefunden, allerdings nicht im Internet. Sondern ganz klassisch: über eine Zeitungsannonce.