Scrapy – Installation Zum nutzen von Scrapy wird, scrapy mittels pip installiert. Falls eine IDE wie pycharm nutzen dann kann scrapy über die IDe interne funktion eingebunden werden.
1 | pip install scrapy |
Scrapy – Projekt erstellen Um ein Projekt anzulegen liefert Scrapy eine Konsole mit. Hierfür rufen sie Folgendes auf. In diesem Beispiel wählen wir den namen rankingtool.
1 2 | scrapy startproject rankingtool cd rankingtool/rankingtool/spiders scrapy genspider spidergoogle google.com |
Scrapy erzeugt automatisch ein Projekt und mittels dem gensider Befehl wird ein Spider ereugt. Der Spider ist die Klasse die explizit, die spezifiziert welche Webseiten geladen werden. Dort werden auch die Informationen gefiltert und Ergebnisobjekte erzeugt.
Für unser Projekt ist der Spider die stelle, in der das Ranking ausgelesen wird. Hierfür wird zunächst die start_requests überschieben. Diese wird nach dem Erstellen des Spider ausgerufen. Diese Methode muss ein scrapy FormRequest zurückliefern. Mit dessen Hilfe Scrapy den nächsten Webseiten aufruf durchführt. Ist dieser durchgeführt wird die Methode self.doSearch aufgerufen.
Für unser Projekt ist es nötig zunächst notwenig eine Suchanfrage zu versenden. Dies kann mittels der URL=”https://www.google.de/search?q
1 2 3 4 5 6 7 8 9 10 | class SpidergoogleSpider(scrapy.Spider): name = \'spidergoogle\' allowed_domains = [\'google.com\'] def start_requests(self): URL = "https://www.google.de/search?q="+self.SearchText self.logger.debug("Start to call google " + URL ) request = scrapy.FormRequest(URL , callback=self.doSearch) return [request] def doSearch(self, response): pass |
Das Ergebnis dieses Seitenaufrufs, ist die erste Google-Ergebnis-Seite. Diese wird mittels doSearch in Parameter response übermittelt. Dort wird überprüft ob die gesuchte Seite unter den Ergbnissen ist. Falls nicht wird auf die nächste such Seite gewechselt und dieses Ergebnis wieder auf doSearch übermittelt. Dadurch wird die doSearch Methode solange aufgerufen bis das nötige Seite gefunden wurde oder Google die suche abbricht.
Google erlaubt es nicht mehr alle Ergbnisse einzusehen. Typischerweise wird nach der 10 – 20 Seite keine weiteren Seiten Angeboten.
Im Falle das Suchergebnis ist Vorhanden wird ein neuer scrapy FormRequest erzeugt, welches ein Click simuliert. Die Methode doClick wird dann aufgerufen, sobald die Seite aufgerufen wurde.
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 38 | def doSearch(self, response): unescaped = response.text if (self.SiteURL in unescaped and "onmousedown" in unescaped): reg = r"<a\\shref=\"([^\"]+" + re.escape( self.SiteURL) + "[^\"]+)\"\\sonmousedown=\"return\\srwt\\(this,(([^\"),]+,){8})" found=re.findall(reg,unescaped) seite=found[0][0] uact = found[0][1].split("\',\'")[3] usg=found[0][1].split("\',\'")[4] ved = found[0][1].split("\',\'")[6] params = { "sa":"t", "rct":"j", "q": "", "esrc": "s", "source": "web", "cd": "8", "cad": "rja", "uact": uact, "ved": ved, "url": seite, "usg": usg, } URL = "https://www.google.com/url?" + urlencode(params) self.ClickURL=URL self.logger.debug("Start to make click " + URL) request = scrapy.FormRequest(URL, callback=self.doClick) return [request] else: if ("Es wurden keine mit deiner Suchanfrage" in unescaped): return None self.SiteCount+=10 URL = "https://www.google.de/search?q="+self.SearchText+"&start="+str(self.SiteCount) self.logger.debug("Start to call google " + URL) request = scrapy.FormRequest(URL, callback=self.doSearch) return [request] def doClick(self,response): pass |
Das Ergbnis dieses kleinem Tools, ist das hier nun in der lange seit ein akuelles Ranking von einer oder meheren Seiten abzurufen. Dies könnte genutzt werden um gezielt Webseiten zu optimieren. Ferne sollte auch beachtet werden das, dass Ranking vom Agent und vom Cookie abhängig ist. Vorstellbar wäre ein Tool das ein Ranking einer Seite unter bestimmten Suchergebnissen erfasst.
Bitte beachten Sie das vortauschen von Clicks strafbar ist.