Metasuche selbst gemacht
Searx ist eine Metasuchmaschine, die jeder auf seinem eigenen Server selbst betreiben kann. Tut man dies öffentlich, sollte man jedoch noch ein paar zusätzliche Vorkehrungen treffen und z.B. Suchanfragen mittels Filtron filtern. Sonst wird man von den angefragten Suchmaschinen schnell ausgesperrt.
Ich betreibe seit einiger Zeit die öffentliche Searx-Instanz unter https://searx.xyz. Das hat auch lange sehr gut funktioniert, bis einige Bots die Seite mit Anfragen bombardiert haben. Die Seite selbst hat das Problemlos weggesteckt. Allerdings funktioniert searx so, dass die eingegebene Suchanfrage an bis zu 70 Suchmaschinen weitergereicht wird. Diese mögen es in der Regel nicht, wenn eine einzelne IP zu viele Anfragen (ggf. auch noch mit seltsamen Inhalten) anstellt. Google verweigerte mir daraufhin Antworten und wollte stattdessen ein Captcha ausgefüllt bekommen.
Glücklicherweise haben die searx Entwickler aber das Tool filtron im Gepäck. Filtron ist im Grunde ein vor searx geschalteter Proxy, der die Anfragen filtern kann. Hierzu benötigt man ein Ruleset (rules.json
):
Der erste Abschnitt (name: search request
) sorgt dafür dass nur Suchanfragen beachtet werden. Die eigentliche Filterarbeit findet in den subrules
statt. Die Regel roboagent limit
sperrt Tools wie curl
und wget
aus (limit: 0
), mit denen gerne Abfragen von Websites automatisiert werden. Sicher ist das nicht, da man den Agent einfach maskieren kann. Dasselbe gilt für bekannte Bots, z.B. von Suchmaschinen (botlimit
). Die Regel IP limit
sorgt dafür dass von einer bestimmten IP “nur” 256 Abfragen in 300 Sekunden möglich sind. Werden in dieser Zeit mehr Anfragen gestellt wird die Meldung Rate limit exceeded, try again later.
ausgegeben. Die Regel rss/json limit
schränkt den Abruf von Suchergebnissen in den Formaten csv
, json
und rss
auf 4
in 600
Sekunden ein, diese Abfragen werden hauptsächlich von Bots gestellt und waren der Hauptgrund warum Google mir nicht mehr antworten wollte, daher ist die Regel sehr strikt. Die Regel useragent limit
sollte nun selbsterklärend sein.
Ich betreibe searx als Docker-Container und natürlich bot es sich hier an filtron ebenfalls in einem Docker-Container zu verpacken. Hier nutze ich folgendes Dockerfile:
Das Dockerfile von searx selbst sieht wie folgt aus:
Mittels der beiden Dockerfiles erstelle ich mit docker build . -t localhost:5000/filtron
respektive docker build . -t localhost:5000/searx
lokale Images, die ich mittels docker push localhost:5000/filtron
bzw. docker push localhost:5000/searx
in mein lokales Docker-Repository lade (das ist nicht nötig, erleichtert mir aber ein paar interne Prozesse).
Damit searx und filtron problemlos miteinander kommunizieren können kombiniere ich beide Container mit docker-compose:
Da ich die beiden nötigen Images im lokalen Repo verwalte kann ich einfach die fertigen Images von dort herunterladen. Alternativ könnte ich image
durch ein Buildverzeichnis mit den jeweiligen Dockerfiles von searx und filtron ersetzen, dann erzeugt docker-compose die nötigen Images on-the-fly.
Mittels docker-compose up
bzw. docker-compose create && docker-compose start
können die beiden Container nun gestartet werden. filtron steht daraufhin unter der Adresse 127.0.0.1:8888
zur Verfügung und leitet Anfragen an searx weiter.