Scrapy - Folgen Links
Beschreibung
In diesem Kapitel erfahren Sie, wie Sie die Links der Seiten unseres Interesses extrahieren, ihnen folgen und Daten von dieser Seite extrahieren. Dazu müssen wir die folgenden Änderungen in unserem vorherigen Code wie folgt vornehmen :
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
Der obige Code enthält die folgenden Methoden:
parse() - Es werden die Links von unserem Interesse extrahiert.
response.urljoin - Die parse () -Methode verwendet diese Methode, um eine neue URL zu erstellen und eine neue Anforderung bereitzustellen, die später an den Rückruf gesendet wird.
parse_dir_contents() - Dies ist ein Rückruf, der die interessierenden Daten tatsächlich abkratzt.
Hier verwendet Scrapy einen Rückrufmechanismus, um Links zu folgen. Mit diesem Mechanismus kann der größere Crawler entworfen werden und Links von Interesse folgen, um die gewünschten Daten von verschiedenen Seiten zu entfernen. Die reguläre Methode ist die Rückrufmethode, mit der die Elemente extrahiert, nach Links gesucht werden, die der nächsten Seite folgen, und dann eine Anforderung für denselben Rückruf bereitgestellt wird.
Das folgende Beispiel erzeugt eine Schleife, die den Links zur nächsten Seite folgt.
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)