mac for example scrapy web-crawler

for - scrapy vs beautifulsoup



Cómo incluir la url de inicio en la regla "Permitir" en SgmlLinkExtractor usando una araña scrapy crawl (3)

He buscado muchos temas, pero no parece encontrar la respuesta para mi pregunta específica. Creé 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. Hasta el negocio:

mi url de inicio se ve de la siguiente manera: www.example.com. La página contiene los enlaces a los que quiero aplicar mi aspecto de araña:

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

...

Ahora tengo un problema: cada vez que ingreso la url de inicio, redirige a www.example.com/locationA de forma automática y todos los enlaces que obtuve incluyen mi araña.

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

Entonces mi problema es cómo puedo incluir www.example.com/locationA en las URL devueltas. Incluso obtuve la información de registro como:

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

-2011-11-28 21: 25: 34 + 1300 [example.com] DEPURACIÓN: redirigir (302) a (referencia: ninguna)

  • 2011-11-28 21: 25: 37 + 1300 [example.com] DEPURACIÓN: Redirigir (302) a (referencia: www.example.com/locationB)

Imprima desde parse_item: www.example.com/locationB

....

Creo que el problema podría estar relacionado con eso (referencia: ninguna) 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. Como todas las páginas contienen las listas de todas las ubicaciones, esta vez obtuve mi araña en:

-www.example.com/locationA

-www.example.com/locationC ...

En pocas palabras, estoy buscando la manera de incluir la URL que es igual a (o que se redirecciona desde) la url de inicio en la lista en la que la devolución de llamada parse_item funcionará.


Al principio pensé que hay una solución simple usando start_requests() como:

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

Pero las pruebas mostraron que cuando start_requests() se usa en lugar de una lista start_urls , spider ignora las rules , porque no se llama a CrawlSpider.parse(response) .

Entonces, 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.


Agregar código de muestra basado en la sugerencia de 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"""


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 a parse_start_url .

P.ej:

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