2012-03-05 21 views
18

Quiero usar el Python Scrapy module para raspar todas las URL de mi sitio web y escribir la lista en un archivo. Busqué en los ejemplos, pero no vi ningún ejemplo simple para hacer esto.¿Cómo uso el módulo Python Scrapy para enumerar todas las URL de mi sitio web?

+6

stackoverflow no es un sitio para pedir a la gente a escribir el código para usted - * * probar algo y luego llegar preguntar algo sobre una problema específico con el que te encuentras – Amber

+0

¿Has probado el tutorial allí? Es bastante explicativo. Si has/has probado el tutorial y todavía tienes problemas, intenta publicar algún código que hayas probado primero (+1 @Amber) – inspectorG4dget

+3

Amber, e inspectorG4dget, escribí el programa que hace esto, pero aún no puedo publicarlo porque no tengo suficiente reputación, hay un tiempo de espera. Voy a publicar la solución mañana por la mañana. –

Respuesta

40

Aquí está el programa de Python que trabajó para mí:

from scrapy.selector import HtmlXPathSelector 
from scrapy.spider import BaseSpider 
from scrapy.http import Request 

DOMAIN = 'example.com' 
URL = 'http://%s' % DOMAIN 

class MySpider(BaseSpider): 
    name = DOMAIN 
    allowed_domains = [DOMAIN] 
    start_urls = [ 
     URL 
    ] 

    def parse(self, response): 
     hxs = HtmlXPathSelector(response) 
     for url in hxs.select('//a/@href').extract(): 
      if not (url.startswith('http://') or url.startswith('https://')): 
       url= URL + url 
      print url 
      yield Request(url, callback=self.parse) 

Guardar esto en un archivo llamado spider.py.

A continuación, puede utilizar un oleoducto de Shell para publicar proceso de este texto:

bash$ scrapy runspider spider.py > urls.out 
bash$ cat urls.out| grep 'example.com' |sort |uniq |grep -v '#' |grep -v 'mailto' > example.urls 

Esto me da una lista de todos los URLs únicos en mi sitio.

+2

Eso es genial. Usted tiene la respuesta. Ahora adelante y acepte la respuesta ... y, oh, sí, podría haber una insignia de "Aprendiz propia" esperando por usted. :) – Nishant

+0

Hay un pequeño error en este programa. La línea 'if not url.startswith ('http: //'):' no manejará los enlaces https correctamente. –

+0

@JoshuaSnider Lo actualicé. Pero este es un fragmento corto de código de muestra, por lo que no está destinado a ser autorizado para todas las situaciones. –

12

algo más limpio (y tal vez más útil) estaría utilizando LinkExtractor

from scrapy.linkextractors import LinkExtractor 

    def parse(self, response): 
     le = LinkExtractor() # empty for getting everything, check different options on documentation 
     for link in le.extract_links(response): 
      yield Request(link.url, callback=self.parse) 
+0

¿Esto devuelve enlaces dentro del sitio web o externos también? –

Cuestiones relacionadas