Pregunta

Es necesario crear un usuario web configurable araña / rastreador, y estoy pensando en usar Scrapy. Sin embargo, no puedo difícil que el código de los dominios y expresiones regulares URL: permitido. Es - esto va a ser configurable en lugar de una interfaz gráfica de usuario

¿Cómo (tan simple como sea posible) crear una araña o un conjunto de arañas con Scrapy donde los dominios y expresiones regulares URL: es permitido son dinámicamente configurable? P.ej. Escribo la configuración en un archivo, y la araña lee alguna manera.

¿Fue útil?

Solución

ADVERTENCIA:. Esta respuesta fue de Scrapy v0.7, gerente de araña API ha cambiado mucho desde entonces

Reemplaza clase SpiderManager defecto, cargar sus reglas personalizadas a partir de una base de datos o en otro lugar y instanciate una araña personalizado con sus propias reglas / expresiones regulares y nombre_de_dominio

en MyBot / settings.py:

SPIDER_MANAGER_CLASS = 'mybot.spidermanager.MySpiderManager'

en 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)

y ahora la clase de araña costumbre, en 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):
         ...

Notas:

  • Puede extender CrawlSpider también si usted desea tomar ventaja de su sistema de reglas
  • Para ejecutar un uso araña: ./scrapy-ctl.py crawl <name>, donde name se pasa a SpiderManager.fromdomain y es la clave para obtener más información retreive araña del sistema de fondo
  • A medida que las anulaciones solución por defecto SpiderManager, que codifica una araña clásica (un módulo de Python por SPIDER) no funciona, pero, creo que esto no es un problema para usted. Más información sobre el administrador predeterminado arañas TwistedPluginSpiderManager

Otros consejos

Lo que necesita es crear dinámicamente clases de araña, la subclasificación de su clase de araña genérica favorita suministrada por scrapy (subclases CrawlSpider con su rules añadido o XmlFeedSpider, o lo que sea) y añadiendo domain_name, start_urls, y posiblemente extra_domain_names (y / o start_requests(), etc), ya que se obtienen o deducirlas de su interfaz gráfica de usuario (o un archivo de configuración, o lo que sea).

Python hace que sea fácil de realizar tales creación dinámica de objetos de clases; un ejemplo muy simple podría ser:

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))

Esto le da una lista de las mismas clases de araña pelado-hueso - es probable que desee añadir métodos parse a ellos antes de crear una instancia. Sazone al gusto ...; -).

Shameless auto promoción en domo ! que necesita para crear una instancia del rastreador como se indica en los ejemplos, para su proyecto.

También tendrá que hacer el rastreador configurable en tiempo de ejecución, que es simplemente pasar a la configuración de orugas, y anulando la configuración de tiempo de ejecución, cuando la configuración cambia.

Ahora bien, es muy fácil de configurar scrapy para estos fines:

  1. Sobre las primeras direcciones URL a la visita, puede pasarlo como un atributo en la llamada araña con -a, y utilizar la función start_requests para configurar cómo iniciar la araña

  2. Usted no necesita configurar la variable allowed_domains para las arañas. Si no se incluye la variable de clase, la araña será capaz de permitir que cada dominio.

Se debe terminar con algo como:

class MySpider(Spider):

    name = "myspider"

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


    def parse(self, response):
        ...

y debe llamar con:

scrapy crawl myspider -a start_url="http://example.com"
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top