¿Cómo dar URL a scrapy para rastrear?

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

En la documentación se indica que se puede dar el nombre de la araña o la URL, pero cuando recibo la url arroja un error:

// El nombre de mi araña es un ejemplo, pero 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:

Archive “/usr/local/lib/python2.7/dist-packages/Scrapy-0.14.1-py2.7.egg/scrapy/spidermanager.py”, línea 43, en create raise KeyError (“Spider not found:% s “% spider_name) KeyError: ‘Spider no encontrado: example.com’

¿Cómo puedo hacer una cita para usar mi araña en la url dada en la terminal?

No estoy seguro de la opción de línea de comando. 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 comienza como: scrapy crawl my_spider -a start_url="http://some_url"

Una forma aún más fácil de permitir múltiples argumentos de url de lo que sugirió Peter es dándoles como una cadena con las URL separadas por una coma, como esta:

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

En la araña, simplemente debes dividir la cadena en ‘,’ y obtener una matriz de direcciones URL:

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

Use el comando scree parse. 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

Esta es una extensión del enfoque dado por 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 como esta, por ejemplo:

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

entonces Scrapy (estoy usando la versión estable actual 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 eludir 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 hack algo 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 un subproceso de Python y generar los argumentos de línea de comando en un bucle o algo.

Espero eso ayude. 🙂

Sjaak Trekhaak tiene la idea correcta y he aquí cómo permitir los 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) 

También puedes probar esto:

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

Se abrirá una ventana en el navegador de la URL solicitada.

    Intereting Posts