2017-05-03 1 views
0

i scrapy auf einer Website mit verschachtelten Seiten üben, und ich brauche nur die innerste Seite Inhalte zu kratzen, aber gibt es eine Möglichkeit, die Daten aus der Parsing-Funktion zu tragen die analysieren innersten Seite, auf der Haupt Parse-Funktion, viele Parse-Funktionen Seiten zu öffnen, aber nur Elemente aus der letzten Parse-Funktion zu erhalten, und tragen über an der Haupt Parse FunktionPython Scrapy verschachtelte Seiten müssen nur Elemente aus innersten Seite

hier ist das, was ich versucht habe

try: 
    import scrapy 
    from urlparse import urljoin 

except ImportError: 
    print "\nERROR IMPORTING THE NESSASARY LIBRARIES\n" 



class CanadaSpider(scrapy.Spider): 
    name = 'CananaSpider' 
    start_urls = ['http://www.canada411.ca'] 


    #PAGE 1 OF THE NESTED WEBSITE GETTING LINK AND JOING WITH THE MAIN LINK AND VISITING THE PAGE 
    def parse(self, response): 
     SET_SELECTOR = '.c411AlphaLinks.c411NoPrint ul li' 
     for PHONE in response.css(SET_SELECTOR): 
      selector = 'a ::attr(href)' 
      try: 
       momo = urljoin('http://www.canada411.ca', PHONE.css(selector).extract_first()) 

       #PASSING A DICTIONARYAS THE ITEM 
       pre = {} 
       post = scrapy.Request(momo, callback=self.parse_pre1, meta={'item': pre}) 
       yield pre 
      except: 
       pass 

#PAGE 2 OF THE NESTED WEBSITE 


    def parse_pre1(self, response): 

     #RETURNING THE SAME ITEM 
     item = response.meta["item"] 
     SET_SELECTOR = '.clearfix.c411Column.c411Column3 ul li' 

     for PHONE in response.css(SET_SELECTOR): 
      selector = 'a ::attr(href)' 
      momo = urljoin('http://www.canada411.ca', PHONE.css(selector).extract_first()) 
      pre = scrapy.Request(momo, callback=self.parse_pre1, meta={'page_2': item}) 
      yield pre 

    def parse_info(self, response): 

     #HERE I AM SCRAPING THE DATA 
     item = response.meta["page_2"] 
     name = '.vcard__name' 
     address = '.c411Address.vcard__address' 
     ph = '.vcard.label' 

     item['name'] = response.css(name).extract_first() 
     item['address'] = response.css(address).extract_first() 
     item['phoneno'] = response.css(ph).extract_first() 
     return item 

Ich erben den Artikel was mache ich falsch?

+0

können Sie bitte etwas erarbeiten, ich bin hier –

+1

Python sollte nicht Ihr Rückruf in 'parse_pre1 'function sollte sich auf' callback = self.parse_info' anstatt auf 'callback = self.parse_pre1' beziehen – JkShaw

Antwort

2

In parse Ihre rentieren pre in Instanz post, auch sollten Sie Scrapy.Item Klassen verwenden, kein dict.

def parse(self, response): 
     SET_SELECTOR = '.c411AlphaLinks.c411NoPrint ul li' 
     for PHONE in response.css(SET_SELECTOR): 
      selector = 'a ::attr(href)' 
      try: 
       momo = urljoin('http://www.canada411.ca', PHONE.css(selector).extract_first()) 

       #PASSING A DICTIONARYAS THE ITEM 
       pre = {} # This should be an instance of Scrapy.Item 
       post = scrapy.Request(momo, callback=self.parse_pre1, meta={'item': pre}) 
       yield post 
      except: 
       pass 

Und in parse_pre1 Sie als Rückruf parse_pre1 wieder eingestellt, ich glaube, dass Sie meinen parse_info

def parse_pre1(self, response): 

    #RETURNING THE SAME ITEM 
    item = response.meta["item"] 
    SET_SELECTOR = '.clearfix.c411Column.c411Column3 ul li' 

    for PHONE in response.css(SET_SELECTOR): 
     selector = 'a ::attr(href)' 
     momo = urljoin('http://www.canada411.ca', PHONE.css(selector).extract_first()) 
     pre = scrapy.Request(momo, callback=self.parse_info, meta={'page_2': item}) 
     yield pre