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:
- Esta página using-one-scrapy-spider-for-several-websites parece estar desactualizada, ya que scrapy ha evolucionado mucho desde 0.7.
- creating-a-generic-scrapy-spider No hay respuesta aceptada, todavía hablamos de ajustar parámetros de shell.
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()