2012-03-13 43 views
21

Quiero usar scrapy para rastrear páginas web. ¿Hay alguna manera de pasar la URL de inicio desde el terminal mismo?Cómo dar URL a scrapy para rastrear?

Se da en la documentation que, o bien el nombre de la araña o la dirección URL se puede dar, pero cuando me dé la URL que genera un error:

// nombre de mi araña es ejemplo, pero yo Estoy dando url en lugar de mi nombre de araña (Funciona bien si le doy el nombre de araña).

scrapy crawl example.com

ERROR:

File "/usr/local/lib/python2.7/dist-packages/Scrapy-0.14.1-py2.7.egg/scrapy/spidermanager.py", line 43, in create raise KeyError("Spider not found: %s" % spider_name) KeyError: 'Spider not found: example.com'

¿Cómo puedo hacer scrapy usar mi araña en la URL dada en la terminal ??

+0

¿Se ha agregado example.com a los allowed_domains de su spider? –

+0

sí example.com se agrega a allowed_domains. Lo que realmente quiero es dar start_url desde la línea de comandos. ¿Cómo puedo hacerlo? –

Respuesta

43

No estoy seguro de la opción de línea de comandos. Sin embargo, podrías escribir tu araña así.

class MySpider(BaseSpider): 

    name = 'my_spider'  

    def __init__(self, *args, **kwargs): 
     super(MySpider, self).__init__(*args, **kwargs) 

     self.start_urls = [kwargs.get('start_url')] 

y ponerlo en marcha como: scrapy crawl my_spider -a start_url="http://some_url"

+0

muchas gracias, esto es exactamente lo que estaba buscando. Funcionó bien para mí :) –

+0

Este enfoque solo funciona para exactamente una url. Si desea proporcionar más de una URL, consulte [mi enfoque] (http://stackoverflow.com/a/12749782/1125413) en este hilo. – pemistahl

+1

Para varias URL: 'self.start_urls = kwargs.pop ('start_urls'). Split (',')' que se ejecuta * antes de * the super(). –

3

Uso de comandos scrapy de análisis. Puedes analizar una url con tu araña. url se pasa del comando.

$ scrapy parse http://www.example.com/ --spider=spider-name 

http://doc.scrapy.org/en/latest/topics/commands.html#parse

+0

Desafortunadamente, scrapy parse no parece tener opciones para guardar resultados en un archivo (en varios formatos) como scrapy crawl – dan3

+0

Si está buscando simplemente depurar por qué una url en particular su araña está fallando, esta es una opción fácil. – jeffjv

+0

No se puede guardar/exportar fácilmente al archivo. De lo contrario, esto hubiera sido perfecto. – Citricguy

3

Esta es una extensión de the approach given by Sjaak Trekhaak en este hilo. El enfoque tal como está hasta ahora solo funciona si proporciona exactamente una url. Por ejemplo, si desea proporcionar más de una URL de este tipo, por ejemplo:

-a start_url=http://url1.com,http://url2.com 

continuación Scrapy (estoy usando la actual versión estable 0.14.4) terminará con la siguiente excepción:

error: running 'scrapy crawl' with more than one spider is no longer supported 

Sin embargo, puede evitar este problema eligiendo una variable diferente para cada url de inicio, junto con un argumento que contiene el número de URL pasadas. Algo como esto:

-a start_url1=http://url1.com 
-a start_url2=http://url2.com 
-a urls_num=2 

A continuación, puede hacer lo siguiente en su araña:

class MySpider(BaseSpider): 

    name = 'my_spider'  

    def __init__(self, *args, **kwargs): 
     super(MySpider, self).__init__(*args, **kwargs) 

     urls_num = int(kwargs.get('urls_num')) 

     start_urls = [] 
     for i in xrange(1, urls_num): 
      start_urls.append(kwargs.get('start_url{0}'.format(i))) 

     self.start_urls = start_urls 

Este es un truco un poco feo, pero funciona. Por supuesto, es tedioso anotar explícitamente todos los argumentos de línea de comando para cada url. Por lo tanto, tiene sentido ajustar el comando scrapy crawl en Python subprocess y generar los argumentos de la línea de comandos en un bucle o algo.

Espero que ayude.:)

+0

Si llamo a scrapy 0.24.4 de esta manera: 'scrapy crawl MySpider -a start_urls = http: //example.com/ -o - -t json' Todo funciona bien. Inicialmente puse opciones entre -o y - y obtengo el mismo error. –

10

Una forma aún más fácil para permitir que varios url-argumentos que lo que sugiere Peter es dándoles como una cadena con las direcciones URL separadas por una coma, así:

-a start_urls="http://example1.com,http://example2.com" 

En la araña lo haría entonces simplemente dividir la cadena en '' y obtener un conjunto de direcciones URL:

self.start_urls = kwargs.get('start_urls').split(',') 
3

Sjaak Trekhaak tiene la idea correcta y aquí es cómo permitir múltiplos:

class MySpider(scrapy.Spider): 
    """ 
    This spider will try to crawl whatever is passed in `start_urls` which 
    should be a comma-separated string of fully qualified URIs. 

    Example: start_urls=http://localhost,http://example.com 
    """ 
    def __init__(self, name=None, **kwargs): 
     if 'start_urls' in kwargs: 
      self.start_urls = kwargs.pop('start_urls').split(',') 
     super(Spider, self).__init__(name, **kwargs) 
0

También puede probar esto:

>>> scrapy view http://www.sitename.com 

se abrirá una ventana en el navegador de la dirección URL solicitada.

Cuestiones relacionadas