2017-03-06 2 views
1

Hier ist eine Struktur einer Website, die ich mit scrapy Schrott, wo * ist eine Seite und --- Link angibt. Ich möchte Daten von # Seiten auskratzen. Ich habe bereits einen Scraper gemacht, der Daten von einer einzigen # Seite scrappen kann.Wie kann man mehrere Seiten mit Scrapy verschrotten?

import scrapy 


class MyItem(scrapy.Item): 
    topic = scrapy.Field() 
    symptoms = scrapy.Field() 


class QuotesSpider(scrapy.Spider): 
    name = "medical" 

    allowed_domains = ['medlineplus.gov'] 
    start_urls = ['https://medlineplus.gov/ency/article/000178.htm'] 

    def parse(self, response): 
     item = MyItem() 

     item["topic"] = response.css('h1.with-also::text').extract_first() 
     item["symptoms"] = response.css("article div#section-2 li::text").extract() 

     yield item 

Ausgang Homepage ist https://medlineplus.gov/encyclopedia.html ich Informationen über alle Krankheiten in der Enzyklopädie kratzen will.

Antwort

2

Sie benötigen würden mit der „encyclopedia.html“ Seite, folgen Sie den „Alpha“ Links (die A-Z Artikel Links) zu starten, dann für jede gefolgt Seite, die Links zu den Artikeln folgen.

Sie können dies mit einem CrawlSpider und der Link Extractors, aber da die Crawling Tiefe klein ist, können wir dies tun mit einer regelmäßigen Spider:

from urlparse import urljoin # Python 2 only 

import scrapy 
from scrapy.http import Request 


class MyItem(scrapy.Item): 
    topic = scrapy.Field() 
    symptoms = scrapy.Field() 


class MedicalSpider(scrapy.Spider): 
    name = "medical" 

    allowed_domains = ['medlineplus.gov'] 
    start_urls = ['https://medlineplus.gov/encyclopedia.html'] 

    def parse(self, response): 
     for link in response.css("ul.alpha-links li a::attr(href)").extract(): 
      yield Request(urljoin(response.url, link), callback=self.parse_alpha_page) 

    def parse_alpha_page(self, response): 
     for link in response.css("ul#index li a::attr(href)").extract(): 
      yield Request(urljoin(response.url, link), callback=self.parse_page) 

    def parse_page(self, response): 
     item = MyItem() 

     item["topic"] = response.css('h1.with-also::text').extract_first() 
     item["symptoms"] = response.css("article div#section-2 li::text").extract() 

     yield item 

Beachten Sie, dass es aussieht wie es eine bessere Art und Weise ist um die gewünschten Daten vom MedlinePlus zu erhalten (siehe "For Developers" page).

+0

danke! Jetzt habe ich verstanden, wie man Callback benutzt. Es gibt Erklärungen in vielen Dokumenten, aber das hat meine Zweifel auf einen Schlag geklärt. Übrigens gibt es seit ich neu auf der Scrapy bin, gute Webseiten/Tutorials zum Scrapy mit guten Beispielen und Erklärungen? Es wird viel helfen. Danke noch einmal. –

+0

@ ShubhamB. Sicher, es gibt viele Informationen und Tutorials im Internet - das offizielle Tutorial in den Scrapy-Dokumenten ist ziemlich detailliert. Oder es ist, dass newcoder.io Tutorial (http://newcoder.io/Intro-Scrape/). Eine weitere gute Möglichkeit, Ihre scrapy Fähigkeiten zu verbessern, ist zu gehen, über die [most scrapy Fragen abgestimmt SO] (http://stackoverflow.com/questions/tagged/scrapy?sort=votes&pageSize=10). Vielen Dank. – alecxe