Frage

Ich brauche einen vom Benutzer konfigurierbare Web-Spider / Crawler zu erstellen, und ich denke an Scrapy verwenden. Aber ich kann es nicht schwer Code die Domains und erlaubt URL Regex:. Es - dies wird stattdessen in einer GUI konfigurierbar sein

Wie kann ich (so einfach wie möglich) eine Spinne oder einen Satz von Spinnen mit Scrapy schaffen, in denen die Domains und erlaubt URL Regex: es sind dynamisch konfigurierbar? Z.B. Ich schreibe die Konfiguration in eine Datei, und die Spinne liest es irgendwie.

War es hilfreich?

Lösung

ACHTUNG:. Diese Antwort war für Scrapy v0.7, Spider-Manager api seitdem viel geändert

außer Kraft setzt Standard SpiderManager Klasse, laden Sie Ihre benutzerdefinierten Regeln aus einer Datenbank oder sonstwo und instanziiert eine eigene Spinne mit Ihren eigenen Regeln / reguläre Ausdrücke und domain_name

in mybot / settings.py:

SPIDER_MANAGER_CLASS = 'mybot.spidermanager.MySpiderManager'

in mybot / spidermanager.py:

from mybot.spider import MyParametrizedSpider

class MySpiderManager(object):
    loaded = True

    def fromdomain(self, name):
        start_urls, extra_domain_names, regexes = self._get_spider_info(name)
        return MyParametrizedSpider(name, start_urls, extra_domain_names, regexes)

    def close_spider(self, spider):
        # Put here code you want to run before spiders is closed
        pass

    def _get_spider_info(self, name):
        # query your backend (maybe a sqldb) using `name` as primary key, 
        # and return start_urls, extra_domains and regexes
        ...
        return (start_urls, extra_domains, regexes)

und jetzt Ihre individuelle Spinne Klasse, in mybot / spider.py:

from scrapy.spider import BaseSpider

class MyParametrizedSpider(BaseSpider):

    def __init__(self, name, start_urls, extra_domain_names, regexes):
        self.domain_name = name
        self.start_urls = start_urls
        self.extra_domain_names = extra_domain_names
        self.regexes = regexes

     def parse(self, response):
         ...

Weitere Informationen:

  • Sie können CrawlSpider verlängern, wenn Sie die Vorteile seiner Geschäfts System zu übernehmen möchten
  • Um eine Spinne Verwendung laufen: ./scrapy-ctl.py crawl <name>, wo name zu SpiderManager.fromdomain geleitet und ist der Schlüssel mehr Spinne Info aus dem Backend-System retreive
  • Als Lösung überschreibt SpiderManager Standard, eine klassische Spinne Codierung (ein Python-Modul pro SPIDER) nicht funktioniert nicht, aber ich denke, das ist für Sie kein Thema ist. Weitere Informationen über Standard-Spinnen-Manager TwistedPluginSpiderManager

Andere Tipps

Was Sie brauchen, ist dynamisch Spinne Klassen zu erstellen, Subklassen Ihre Lieblings-generic Spinne Klasse von scrapy geliefert (CrawlSpider Subklassen mit Ihrem rules hinzugefügt oder XmlFeedSpider, oder was auch immer) und das Hinzufügen von domain_name, start_urls und möglicherweise extra_domain_names (und / oder start_requests(), usw.), wie Sie sie von Ihrem GUI erhalten oder ableiten (oder Config-Datei oder was auch immer).

Python macht es einfach, eine solche dynamische Erstellung von Klassenobjekten auszuführen; ein sehr einfaches Beispiel könnte sein:

from scrapy import spider

def makespider(domain_name, start_urls,
               basecls=spider.BaseSpider):
  return type(domain_name + 'Spider',
              (basecls,),
              {'domain_name': domain_name,
               'start_urls': start_urls})

allspiders = []
for domain, urls in listofdomainurlpairs:
  allspiders.append(makespider(domain, urls))

Dies gibt Ihnen eine Liste von sehr nackten Knochen Spinne Klassen - Sie werden wahrscheinlich parse Methoden, um sie hinzufügen möchten, bevor Sie sie instanziiert. Abschmecken ...; -).

Shameless Eigenwerbung auf domo ! Sie benötigen den Crawler instanziiert wie in den Beispielen angegeben, für Ihr Projekt.

Darüber hinaus müssen Sie die Crawler konfigurierbar Laufzeit machen, das einfach ist die Konfiguration auf Crawler vorbei, und überschreiben Sie die Einstellungen zur Laufzeit, wenn Konfiguration geändert.

Jetzt ist es extrem einfach zu konfigurieren scrapy für diese Zwecke:

  1. über den ersten Urls Besuch, können Sie es als ein Attribut auf der Spinne Anruf mit -a passieren, und die start_requests Funktion Setup verwenden, wie die Spinne starten

  2. Sie haben keine allowed_domains Variable Setup für die Spinnen benötigen. Wenn Sie nicht, dass die Klassenvariable umfassen, wird die Spinne der Lage, jede Domain zu ermöglichen.

Es sollte so etwas am Ende:

class MySpider(Spider):

    name = "myspider"

    def start_requests(self):
        yield Request(self.start_url, callback=self.parse)


    def parse(self, response):
        ...

und Sie sollten es nennen mit:

scrapy crawl myspider -a start_url="http://example.com"
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top