El uso de una araña Scrapy durante varios sitios web
-
25-09-2019 - |
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.
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>
, dondename
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:
-
Sobre las primeras direcciones URL a la visita, puede pasarlo como un atributo en la llamada araña con
-a
, y utilizar la funciónstart_requests
para configurar cómo iniciar la araña -
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"