2011-11-28 15 views
7

He buscado muchos temas pero no parece encontrar la respuesta para mi pregunta específica. He creado una araña de rastreo para un sitio web y funciona perfectamente. Luego hice uno similar para rastrear un sitio web similar, pero esta vez tengo un pequeño problema. Debajo de la empresa:Cómo incluir la url de inicio en la regla "permitir" en SgmlLinkExtractor utilizando una araña scrapy crawl

mi url de inicio tiene el siguiente aspecto: www.example.com. La página contiene los enlaces que quieren aplicar mi araña parezca:

  • www.example.com/locationA
  • www.example.com/locationB
  • www.example.com/locationC

...

ahora tengo un problema: Cada vez que entro en la URL de inicio, se redirige a www.example.com/locationA automáticamente y todos los enlaces que consiguió incluir mi trabajo araña

  • www.example.com/locationB
  • www.example.com/locationC ...

Así que mi problema es cómo puedo incluir la www.example.com/locationA en la URLs.I vuelto incluso consiguió la información de registro como:

-2011-11-28 21: 25: 33 + 1300 [example.com] DEBUG: Redirigir (302) a partir de http: //www.example. com />

-2011-11-28 21:25: 34 + 1300 [example.com] DEBUG: Redirección (302) a (árbitro: Ninguno)

  • 2011-11-28 21: 25: 37 + 1300 [example.com] DEBUG: Redirigir (302) a (árbitro: www.example.com/locationB)

de impresión hacia fuera de parse_item: www.example.com/locationB

....

creo que el problema podría estar relacionado con que (referer: ninguno) de alguna manera. ¿Podría alguien por favor arrojar algo de luz sobre esto?

He reducido este problema cambiando la URL de inicio a www.example.com/locationB. Puesto que todas las páginas contienen las listas de todos los lugares, esta vez me dieron mi araña trabaja en:

-www.example.com/locationA

-www.example.com/locationC ...

En una cáscara de nuez, estoy buscando la manera de incluir la URL que es igual a (o ser redirigido desde) la url de inicio en la lista que la devolución de llamada parse_item funcionará.

+0

¿Podría incluir un breve ejemplo de su raspador para ayudarnos a entender su problema con más detalle? – jsalonen

Respuesta

1

Al principio pensé que no existe una solución sencilla utilizando start_requests() como:

def start_requests(self): 
    yield Request('START_URL_HERE', callback=self.parse_item)  

embargo, las pruebas mostraron que cuando se utiliza start_requests() lugar de una lista start_urls, araña ignora rules, porque CrawlSpider.parse(response) no se llama.

Por lo tanto, aquí está mi solución:

import itertools 
class SomeSpider(CrawlSpider): 
    .... 
    start_urls = ('YOUR_START_URL',) 
    rules = (
     Rule(
      SgmlLinkExtractor(allow=(r'YOUR_REGEXP',),), 
      follow=True, 
      callback='parse_item'), 
     ), 
    ) 
    def parse(self, response): 
     return itertools.chain(
        CrawlSpider.parse(self, response), 
        self.parse_item(response)) 

    def parse_item(self, response): 
     yield item 

Tal vez hay una mejor manera.

13

Para otros tiene el mismo problema, después de una gran cantidad de búsquedas, todo lo que necesita hacer es nombrar su función de devolución de llamada al parse_start_url.

Ej:

rules = (
     Rule(LinkExtractor(allow=(), restrict_xpaths=(
      '//*[contains(concat(" ", @class, " "), concat(" ", "pagination-next", " "))]//a',)), callback="parse_start_url", follow=True), 
    ) 
3

Adición de código de ejemplo basado en la sugerencia mindcast:

I manage using following approach 

class ExampleSpider(CrawlSpider): 
name = "examplespider" 
allowed_domains = ["example.com"] 
start_urls = ['http://example.com/A'] 


rules = (Rule (SgmlLinkExtractor(restrict_xpaths=("//div[@id='tag_cloud']/a",)), callback="parse_items", follow= True),) 

def parse_start_url(self, response): 
    self.log('>>>>>>>> PARSE START URL: %s' % response) 
    # www.example.com/A will be parsed here 
    return self.parse_items(response) 

def parse_items(self, response): 
    self.log('>>>>>>>> PARSE ITEM FROM %s' % response.url) 
    """Scrape data from links based on Crawl Rules""" 
0

Una solución sencilla es añadir específicamente una regla para los start_urls (en su caso: http://example.com/locationA) (por favor, ignore el problema de sangría):

class ExampleSpider(CrawlSpider): 
    name = "examplespider" 
    allowed_domains = ["example.com"] 
    start_urls = ['http://example.com/locationA'] 

    rules = (
    Rule(LinkExtractor(allow=('locationA')), callback='parse_item'), 
    Rule(LinkExtractor(allow=('location\.*?'),restrict_css=('.pagination-next',)), callback='parse_item', follow=True), 
) 

    def parse_item(self, response): 
     self.log('>>>>>>>> PARSE ITEM FROM %s' % response.url) 
Cuestiones relacionadas