Scrapy - Liens suivants

La description

Dans ce chapitre, nous allons étudier comment extraire les liens des pages qui nous intéressent, les suivre et extraire les données de cette page. Pour cela, nous devons apporter les modifications suivantes dans notre code précédent illustré comme suit -

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

Le code ci-dessus contient les méthodes suivantes -

  • parse() - Il extraira les liens de notre intérêt.

  • response.urljoin - La méthode parse () utilisera cette méthode pour construire une nouvelle url et fournir une nouvelle requête, qui sera envoyée ultérieurement au callback.

  • parse_dir_contents() - Ceci est un rappel qui va en fait gratter les données d'intérêt.

Ici, Scrapy utilise un mécanisme de rappel pour suivre les liens. En utilisant ce mécanisme, le plus gros robot peut être conçu et peut suivre des liens d'intérêt pour extraire les données souhaitées de différentes pages. La méthode régulière sera la méthode de rappel, qui extraira les éléments, recherchera des liens pour suivre la page suivante, puis fournira une demande pour le même rappel.

L'exemple suivant produit une boucle, qui suivra les liens vers la page suivante.

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)