follow - scrapy vs beautifulsoup
¿Cómo dar URL a scrapy para rastrear? (6)
Esta es una extensión del enfoque dado por Sjaak Trekhaak en este hilo. El enfoque tal como está hasta ahora solo funciona si usted 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 evitar este problema seleccionando una variable diferente para cada url de inicio, junto con un argumento que contenga el número de urls 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 algo feo pero funciona. Por supuesto, es tedioso escribir explícitamente todos los argumentos de la línea de comandos para cada url. Por lo tanto, tiene sentido envolver el comando scrapy crawl
en un subprocess Python y generar los argumentos de la línea de comandos en un bucle o algo así.
Espero eso ayude. :)
Quiero usar scrapy para rastrear páginas web. ¿Hay alguna forma de pasar la URL de inicio desde el propio terminal?
En la documentation se indica que se puede dar el nombre de la araña o la URL, pero cuando le di la url, se produce un error:
// el nombre de mi araña es un ejemplo, pero le estoy dando url en lugar de mi nombre de araña (Funciona bien si doy el nombre de araña).
scrapy crawl example.com
ERROR:
Archivo "/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 not found: example.com''
¿Cómo puedo hacer scrapy para usar mi araña en la url dada en la terminal?
No estoy muy 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 comience así: scrapy crawl my_spider -a start_url="http://some_url"
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)
También puedes probar esto:
>>> scrapy view http://www.sitename.com
Se abrirá una ventana en el navegador de la URL solicitada.
Una forma aún más fácil de permitir múltiples argumentos de URL de lo que Peter sugirió es dándoles 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 dividirías la cadena en '','' y obtendrías un conjunto de urls:
self.start_urls = kwargs.get(''start_urls'').split('','')
Utilice el comando scrapy parse. Puedes analizar un url con tu araña. url se pasa desde el comando.
$ scrapy parse http://www.example.com/ --spider=spider-name