2012-01-10 13 views
12

Estoy usando scrapy para rastrear varias páginas en un sitio. La variable start_urls se usa para definir las páginas que se rastrearán. Me gustaría empezar inicialmente con primera página, definiendo así start_urls = [1st page] en el archivo example_spider.pydynamic start_urls in scrapy

Tras conseguir más información de primera página, que determinaría cuáles son las páginas siguientes para ser rastreadas, entonces asignaría start_urls en consecuencia. Por lo tanto, tengo que sobrescribir arriba example_spider.py con cambios en start_urls = [1st page, 2nd page, ..., Kth page], luego ejecutar scrapy crawl nuevamente.

¿Es ese el mejor enfoque o hay una mejor manera de asignar dinámicamente start_urls utilizando la API de scrapy sin tener que sobrescribir example_splider.py? Gracias.

Respuesta

21

start_urls El atributo de clase contiene las URL de inicio, nada más. Si ha extraído URLs de otras páginas que desea raspar - rendimiento a partir de parse de devolución de llamada correspondientes solicitudes con [otro] devolución de llamada:

class Spider(BaseSpider): 

    name = 'my_spider' 
    start_urls = [ 
       'http://www.domain.com/' 
    ] 
    allowed_domains = ['domain.com'] 

    def parse(self, response): 
     '''Parse main page and extract categories links.''' 
     hxs = HtmlXPathSelector(response) 
     urls = hxs.select("//*[@id='tSubmenuContent']/a[position()>1]/@href").extract() 
     for url in urls: 
      url = urlparse.urljoin(response.url, url) 
      self.log('Found category url: %s' % url) 
      yield Request(url, callback = self.parseCategory) 

    def parseCategory(self, response): 
     '''Parse category page and extract links of the items.''' 
     hxs = HtmlXPathSelector(response) 
     links = hxs.select("//*[@id='_list']//td[@class='tListDesc']/a/@href").extract() 
     for link in links: 
      itemLink = urlparse.urljoin(response.url, link) 
      self.log('Found item link: %s' % itemLink, log.DEBUG) 
      yield Request(itemLink, callback = self.parseItem) 

    def parseItem(self, response): 
     ... 

Si aún desea personalizar inicio solicita la creación, método de reemplazo BaseSpider.start_requests()

+0

es el parseItem (self, response) devuelve el artículo? – friddle

+0

'parseItem' como cualquier otra devolución de llamada puede devolver un' Item' u otra 'Solicitud' con otra devolución de llamada – warvariuc

+0

gracias por su respuesta – friddle