Учебники

Scrapy — следующие ссылки

В этой главе мы изучим, как извлечь ссылки на интересующие нас страницы, следовать им и извлекать данные с этой страницы. Для этого нам нужно внести следующие изменения в наш предыдущий код, показанный ниже:

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

Приведенный выше код содержит следующие методы —

  • parse () — он извлечет ссылки нашего интереса.

  • response.urljoin — метод parse () будет использовать этот метод для создания нового URL-адреса и предоставления нового запроса, который позднее будет отправлен обратному вызову.

  • parse_dir_contents () — это обратный вызов, который фактически очистит интересующие данные.

parse () — он извлечет ссылки нашего интереса.

response.urljoin — метод parse () будет использовать этот метод для создания нового URL-адреса и предоставления нового запроса, который позднее будет отправлен обратному вызову.

parse_dir_contents () — это обратный вызов, который фактически очистит интересующие данные.

Здесь Scrapy использует механизм обратного вызова для перехода по ссылкам. Используя этот механизм, можно спроектировать более крупный сканер, который может переходить по интересующим ссылкам для извлечения нужных данных с разных страниц. Обычным методом будет метод обратного вызова, который будет извлекать элементы, искать ссылки для перехода на следующую страницу и затем предоставлять запрос на тот же обратный вызов.

В следующем примере создается цикл, который будет следовать ссылкам на следующую страницу.