spider docs crawler python scrapy scrapyd

python - docs - scrapy ruby



Cómo configurar y lanzar una araña Scrapy mediante programación(direcciones URL y configuraciones) (4)

Al principio pensé que scrapyd estaba hecho para esto, pero después de leer el documento, parece que es más un demonio capaz de manejar ''arañas envasadas'', también conocidas como ''huevos desechados''; y que todas las configuraciones (start_urls, allowed_domains, settings) aún deben estar codificadas en el propio ''huevo áspero''; así que no parece una solución a mi pregunta, a menos que me haya perdido algo.

No estoy de acuerdo con la declaración anterior, no es necesario que start_urls esté codificado de forma rígida, se pueden pasar dinámicamente a la clase, debería poder pasarla como un argumento como este

http://localhost:6800/schedule.json -d project=myproject -d spider=somespider -d setting=DOWNLOAD_DELAY=2 -d arg1=val1

O debería poder recuperar las URL de una base de datos o un archivo. Lo obtengo de una base de datos como esta.

class WikipediaSpider(BaseSpider): name = ''wikipedia'' allowed_domains = [''wikipedia.com''] start_urls = [] def __init__(self, name=None, url=None, **kwargs): item = MovieItem() item[''spider''] = self.name # You can pass a specific url to retrieve if url: if name is not None: self.name = name elif not getattr(self, ''name'', None): raise ValueError("%s must have a name" % type(self).__name__) self.__dict__.update(kwargs) self.start_urls = [url] else: # If there is no specific URL get it from Database wikiliks = # < -- CODE TO RETRIEVE THE LINKS FROM DB --> if wikiliks == None: print "**************************************" print "No Links to Query" print "**************************************" return None for link in wikiliks: # SOME PROCESSING ON THE LINK GOES HERE self.start_urls.append(urllib.unquote_plus(link[0])) def parse(self, response): hxs = HtmlXPathSelector(response) # Remaining parse code goes here

He escrito un rastreador de trabajo utilizando scrapy,
Ahora quiero controlarlo a través de una aplicación web de Django, es decir:

  • Establecer 1 o varios start_urls
  • Establecer 1 o varios allowed_domains
  • Establecer valores de settings
  • Comienza la araña
  • Detener / pausar / reanudar una araña
  • recuperar algunas estadísticas mientras se ejecuta
  • Recuperar algunas estadísticas después de que se complete la araña.

Al principio pensé que scrapyd estaba hecho para esto, pero después de leer el documento, parece que es más un demonio capaz de manejar ''arañas envasadas'', también conocidas como ''huevos desechados''; y que todas las configuraciones ( start_urls , allowed_domains , settings ) aún deben estar codificadas en el propio ''huevo áspero''; así que no parece una solución a mi pregunta, a menos que me haya perdido algo.

También observé esta pregunta: ¿Cómo asignar URL a scrapy para rastrear? ; Pero la mejor respuesta para proporcionar múltiples urls es calificada por el autor como un "truco feo", que involucra algunos subprocesos de Python y un complejo manejo de shell, así que no creo que la solución se encuentre aquí. Además, puede funcionar para start_urls , pero parece que no permite allowed_domains o settings allowed_domains .

Luego le eché un vistazo a los servicios web desechados : parece ser la buena solución para recuperar estadísticas. Sin embargo, todavía requiere una araña en ejecución, y no hay ninguna pista para cambiar la settings

Hay varias preguntas sobre este tema, ninguna de ellas parece satisfactoria:

Sé que scrapy se utiliza en entornos de producción; y una herramienta como scrapyd muestra que definitivamente hay algunas formas de manejar estos requisitos (no puedo imaginar que los huevos que se tratan con scrapyd se generen a mano).

Muchas gracias por tu ayuda.


¡Esto es realmente muy simple!

from mypackage.spiders import MySpider from scrapy.crawler import CrawlerProcess results = [] class MyPipeline(object): """ A custom pipeline that stores scrape results in ''results''""" def process_item(self, item, spider): results.append(dict(item)) process = CrawlerProcess({ # An example of a custom setting ''USER_AGENT'': ''Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)'', ''ITEM_PIPELINES'': {''__main__.MyPipeline'': 1}, # Hooking in our custom pipline above }) start_urls=[ ''http://example.com/page1'', ''http://example.com/page2'', ] process.crawl(MySpider, start_urls=start_urls) process.start() # the script will block here until the crawling is finished # Do something with the results print results


Creo que necesitas mirar esto

http://django-dynamic-scraper.readthedocs.org/en/latest/

Esto hace algo similar a lo que quieres. También utiliza el apio de la tarea sheduling. Puedes ver el código para ver lo que está haciendo. Creo que será fácil si modifica su código para hacer lo que quiera.

También tiene buenos documentos sobre cómo configurar la interfaz con django


Para cambiar la configuración mediante programación y ejecutar el raspador desde una aplicación, esto es lo que obtuve:

from scrapy.crawler import CrawlerProcess from myproject.spiders import MySpider from scrapy.utils.project import get_project_settings os.environ[''SCRAPY_SETTINGS_MODULE''] = ''myproject.my_settings_module'' scrapy_settings = get_project_settings() scrapy_settings.set(''CUSTOM_PARAM'', custom_vaule) scrapy_settings.set(''ITEM_PIPELINES'', {}) # don''t write jsons or anything like that scrapy_settings.set(''DOWNLOADER_MIDDLEWARES'', { ''myproject.middlewares.SomeMiddleware'': 100, }) process = CrawlerProcess(scrapy_settings) process.crawl(MySpider, start_urls=start_urls) process.start()