2016-05-10 11 views
1

Also arbeite ich an einer Python-Web-Anwendung, es ist eine Suchmaschine für Sportartikel (Sport Outfits, Werkzeuge .... etc). Im Grunde sollte es nach einem bestimmten Schlüsselwort in mehreren Geschäften suchen und die Ergebnisse vergleichen, um die 20 besten Ergebnisse zurückzugeben.Was ist die effizienteste Möglichkeit, Daten in diesem Fall zu extrahieren?

Ich dachte, dass der beste und einfachste Weg, dies zu tun ist, eine JSON-Datei zu schreiben, die Regeln für den Schaber enthält, wie man Daten auf jeder Website extrahiert. Für ex:

[{"www.decathlon.com" : { "rules" : { "productTag" : "div['.product']", 
"priceTag" : "span[".price"]" } }] 

So für Decathlon, Produkt Artikel suchen wir div Tags mit der Produktklasse.

Ich habe eine Liste von etwa 10 - 15 Websites zu kratzen. Also für jede Website geht es zu rules.json, sehen Sie die zugehörigen Regeln und verwenden Sie sie, um Daten zu extrahieren.

Pros für diese Methode: Sehr einfach zu schreiben, brauchen wir einen minimalen Python-Skript für die Logik, wie man ihre Regeln lesen und Karte Urls und die Daten durch BeautifulSoup extrahieren + Es ist auch sehr einfach hinzufügen, Lösche neue URLs und ihre Regeln.

Nachteile dieser Methode: Für jede Suche starten wir eine Anfrage an jede Website, also etwa 10 Anfragen gleichzeitig, dann vergleichen Ergebnisse, also wenn 20 Benutzer gleichzeitig suchen, werden wir rund 200 haben Anfragen, die unsere App sehr verlangsamen werden!

Eine andere Methode:

Ich dachte, dass wir eine riesige Liste von Schlüsselwörtern haben könnte, dann um 00:00 Uhr, ein Skript Startanforderungen an alle URLs für jedes Keyword in der Liste, sie zu vergleichen, dann Speichern Sie die Ergebnisse in CouchDB, um sie über den Tag hinweg zu verwenden, und sie wird täglich aktualisiert. Das einzige Problem mit dieser Methode ist, dass es fast unmöglich ist, eine Liste aller möglichen Schlüsselwörter zu haben.

Also bitte, hilf mir, wie soll ich damit fortfahren? Da ich nicht viel Zeit habe.

Antwort

1

Entspricht der "Keyword" -Liste: Anstatt eine Liste aller möglichen Keywords zu führen, könnten Sie möglicherweise eine Prioritätswarteschlange mit wichtigen Stichworten basierend darauf einrichten, wie oft ein Keyword durchsucht wird. Wenn ein neues Schlüsselwort gefunden wird, fügen Sie es zur Liste hinzu, andernfalls aktualisieren Sie es jedes Mal, wenn es durchsucht wird. Starten Sie ein Skript, um URLs für die oberen, sagen wir, 30 Schlüsselwörter jeden Tag anzufordern (mehr oder weniger abhängig davon, wie oft Wörter gesucht werden und was Sie tun möchten).

Dies löst nicht unbedingt Ihr Problem mit zu vielen Anfragen, kann aber die Wahrscheinlichkeit verringern, dass es zu sehr zu einem Problem wird.

1

HTTP-Anfragen können sehr teuer sein. Deshalb möchten Sie sicherstellen, dass Sie Ihre Anfragen parallelisieren und dafür etwas wie Sellerie verwenden können. Auf diese Weise reduzieren Sie die Gesamtzeit auf die langsamste Website. Es kann eine gute Idee sein, das Anfrage-Timeout auf eine kürzere Zeit (5 Sekunden?) Zu setzen, falls eine der Webseiten nicht auf Ihre Anfrage antwortet. Haben Sie die Fähigkeit, Domäne als "down/not responding" zu kennzeichnen und in der Lage zu sein, diese Ausnahmen zu behandeln.

Andere Optimierung wäre, Seiteninhalt nach jeder Suche für einige Zeit zu speichern, falls das gleiche Suchwort eingeht, so dass Sie teure Anfragen überspringen können.

Verwandte Themen