2017-10-04 6 views
0

Je suis nouveau à Scrapy et je suis vraiment juste perdu sur la façon dont je peux retourner plusieurs articles dans un bloc. Fondamentalement, je reçois un tag HTML qui a une citation qui contient des balises imbriquées de texte, le nom de l'auteur, et quelques balises sur cette citation.Scrapy Return Plusieurs articles

Le code ici renvoie seulement un devis et c'est tout. Il n'utilise pas la boucle pour retourner le reste. Je fais des recherches sur le web depuis des heures et je suis désespéré de ne pas comprendre. Voici mon code à ce jour:

Spider.py

import scrapy 
from scrapy.loader import ItemLoader 
from first_spider.items import FirstSpiderItem 

class QuotesSpider(scrapy.Spider): 
name = 'quotes' 
allowed_domains = ['quotes.toscrape.com'] 
start_urls = ['http://quotes.toscrape.com/'] 

def parse(self, response): 
    l = ItemLoader(item = FirstSpiderItem(), response=response) 

    quotes = response.xpath("//*[@class='quote']") 

    for quote in quotes: 
     text = quote.xpath(".//span[@class='text']/text()").extract_first() 
     author = quote.xpath(".//small[@class='author']/text()").extract_first() 
     tags = quote.xpath(".//meta[@class='keywords']/@content").extract_first() 

     # removes quotation marks from the text 
     for c in ['“', '”']: 
      if c in text: 
       text = text.replace(c, "") 

     l.add_value('text', text) 
     l.add_value('author', author) 
     l.add_value('tags', tags) 
     return l.load_item() 

    next_page_path = 
    response.xpath(".//li[@class='next']/a/@href").extract_first() 

    next_page_url = response.urljoin(next_page_path) 
    yield scrapy.Request(next_page_url) 

Items.py

import scrapy 

class FirstSpiderItem(scrapy.Item): 

text = scrapy.Field() 
author = scrapy.Field() 
tags = scrapy.Field() 

Voici la page que je suis en train de gratter:

Link

Répondre

0

Faites un essai. Il vous donnera toutes les données que vous vouliez gratter.

import scrapy 

class QuotesSpider(scrapy.Spider): 

    name = 'quotes' 
    start_urls = ['http://quotes.toscrape.com/'] 

    def parse(self, response): 
     for quote in response.xpath("//*[@class='quote']"): 
      text = quote.xpath(".//span[@class='text']/text()").extract_first() 
      author = quote.xpath(".//small[@class='author']/text()").extract_first() 
      tags = quote.xpath(".//meta[@class='keywords']/@content").extract_first() 
      yield {"Text":text,"Author":author,"Tags":tags} 

     next_page = response.xpath(".//li[@class='next']/a/@href").extract_first() 
     if next_page: 
      next_page_url = response.urljoin(next_page) 
      yield scrapy.Request(next_page_url) 
+0

J'ai déjà créé cette araignée sous cette forme. J'essaye de le créer en utilisant des articles au lieu de céder. Merci pour votre réponse quand même! –

0

Je cherchais aussi une solution pour le même problème. Et voici la solution que j'ai trouvé:

def parse(self, response): 
    for selector in response.xpath("//*[@class='quote']"): 
     l = ItemLoader(item=FirstSpiderItem(), selector=selector) 
     l.add_xpath('text', './/span[@class="text"]/text()') 
     l.add_xpath('author', '//small[@class="author"]/text()') 
     l.add_xpath('tags', './/meta[@class="keywords"]/@content') 
     yield l.load_item() 

    next_page = response.xpath(".//li[@class='next']/a/@href").extract_first() 
    if next_page is not None: 
     yield response.follow(next_page, callback=self.parse) 

Pour enlever les guillemets du texte, vous pouvez utiliser un processeur de sortie dans items.py.

from scrapy.loader.processors import MapCompose 

def replace_quotes(text): 
    for c in ['“', '”']: 
     if c in text: 
      text = text.replace(c, "") 
    return text 

class FirstSpiderItem(scrapy.Item): 
    text = scrapy.Field() 
    author = scrapy.Field() 
    tags = scrapy.Field(output_processor=MapCompose(replace_quotes)) 

Faites-moi savoir si c'était utile.