Scrapy - Enlaces siguientes

Descripción

En este capítulo estudiaremos cómo extraer los enlaces de las páginas de nuestro interés, seguirlos y extraer datos de esa página. Para esto, necesitamos realizar los siguientes cambios en nuestro código anterior que se muestra a continuación:

import scrapy
from tutorial.items import DmozItem

class MyprojectSpider(scrapy.Spider):
   name = "project"
   allowed_domains = ["dmoz.org"]
   
   start_urls = [
      "http://www.dmoz.org/Computers/Programming/Languages/Python/",
   ]
   def parse(self, response):
      for href in response.css("ul.directory.dir-col > li > a::attr('href')"):
         url = response.urljoin(href.extract())
            yield scrapy.Request(url, callback = self.parse_dir_contents)

   def parse_dir_contents(self, response):
      for sel in response.xpath('//ul/li'):
         item = DmozItem()
         item['title'] = sel.xpath('a/text()').extract()
         item['link'] = sel.xpath('a/@href').extract()
         item['desc'] = sel.xpath('text()').extract()
         yield item

El código anterior contiene los siguientes métodos:

  • parse() - Extraerá los enlaces de nuestro interés.

  • response.urljoin - El método parse () utilizará este método para crear una nueva URL y proporcionar una nueva solicitud, que se enviará más tarde a la devolución de llamada.

  • parse_dir_contents() - Esta es una devolución de llamada que realmente raspará los datos de interés.

Aquí, Scrapy usa un mecanismo de devolución de llamada para seguir enlaces. Con este mecanismo, se puede diseñar el rastreador más grande y puede seguir enlaces de interés para extraer los datos deseados de diferentes páginas. El método regular será el método de devolución de llamada, que extraerá los elementos, buscará enlaces para seguir la página siguiente y luego proporcionará una solicitud para la misma devolución de llamada.

El siguiente ejemplo produce un bucle, que seguirá los enlaces a la página siguiente.

def parse_articles_follow_next_page(self, response):
   for article in response.xpath("//article"):
      item = ArticleItem()
    
      ... extract article data here

      yield item

   next_page = response.css("ul.navigation > li.next-page > a::attr('href')")
   if next_page:
      url = response.urljoin(next_page[0].extract())
      yield scrapy.Request(url, self.parse_articles_follow_next_page)