2015-11-16 6 views
1

Я использую Scrapy для очистки данных this site. Мне нужно позвонить getlink от parse. Нормальный вызов не работает, а при использовании yield, я получаю эту ошибку:python return несколько раз

2015-11-16 10:12:34 [scrapy] ERROR: Spider must return Request, BaseItem, dict or None, got 'generator' in <GET https://www.coldwellbankerhomes.com/fl/miami-dad 

электронный округ/КВЦ-17_1,17_3,17_2,17_8/вкл-22 />

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

# -*- coding: utf-8 -*- 

    from scrapy.spiders import BaseSpider 
    from scrapy.selector import Selector 
    from scrapy.http import Request,Response 
    import re 
    import csv 
    import time 

    from selenium import webdriver 



    class ColdWellSpider(BaseSpider): 
     name = "cwspider" 
     allowed_domains = ["coldwellbankerhomes.com"] 
     #start_urls = [''.join(row).strip() for row in csv.reader(open("remaining_links.csv"))] 
     #start_urls = ['https://www.coldwellbankerhomes.com/fl/boynton-beach/5451-verona-drive-unit-d/pid_9266204/'] 
     start_urls = ['https://www.coldwellbankerhomes.com/fl/miami-dade-county/kvc-17_1,17_3,17_2,17_8/incl-22/'] 

     def parse(self,response): 

       #browser = webdriver.PhantomJS(service_args=['--ignore-ssl-errors=true', '--load-images=false']) 
       browser = webdriver.Firefox() 
       browser.maximize_window() 
       browser.get(response.url) 
       time.sleep(5) 

       #to extract all the links from a page and send request to those links 
       #this works but even after returning i need to execute the while loop 
       return self.getlink(response) 

       #for clicking the load more button in the page 
       while True: 
        try: 
         browser.find_element_by_class_name('search-results-load-more').find_element_by_tag_name('a').click() 
         time.sleep(3) 
         self.getlink(response) 

        except: 
         break 

     def getlink(self,response): 
      print 'hhelo' 

      c = open('data_getlink.csv', 'a') 
      d = csv.writer(c, lineterminator='\n') 
      print 'hello2' 
      listclass = response.xpath('//div[@class="list-items"]/div[contains(@id,"snapshot")]') 

      for l in listclass: 
        link = 'http://www.coldwellbankerhomes.com/'+''.join(l.xpath('./h2/a/@href').extract()) 

        d.writerow([link]) 
        yield Request(url = str(link),callback=self.parse_link) 


     #callback function of Request 
     def parse_link(self,response): 
       b = open('data_parselink.csv', 'a') 
       a = csv.writer(b, lineterminator='\n') 
       a.writerow([response.url]) 

ответ

4

Spider must return Request, BaseItem, dict or None, got 'generator'

getlink() является генератором. Вы пытаетесь установить yield с генератора parse().

Вместо этого, вы можете/должны перебирать результаты getlink() вызова:

def parse(self, response): 
    browser = webdriver.Firefox() 
    browser.maximize_window() 
    browser.get(response.url) 
    time.sleep(5) 

    while True: 
     try: 
      for request in self.getlink(response): 
       yield request 

      browser.find_element_by_class_name('search-results-load-more').find_element_by_tag_name('a').click() 
      time.sleep(3) 
     except: 
      break 

Кроме того, я заметил, у вас есть и self.getlink(response) и self.getlink(browser). Последний не сработает, так как нет xpath() метода на экземпляре WebDriver - вы, вероятно, имели в вид, чтобы make a Scrapy Selector из исходного кода страницы, что ваш WebDriver управляемого браузера загружен, например:

selector = scrapy.Selector(text=browser.page_source) 
self.getlink(selector) 

Вы также должны принять посмотрите на Explicit Waits with Expected Conditions вместо ненадежных и медленных искусственных задержек через time.sleep().

Плюс, я не уверен, в чем причина, по которой вы пишете CSV вручную, вместо использования встроенных Scrapy Items и Item Exporters. И вы не закрываете файлы правильно и не используете контекстный менеджер with().

Кроме того, попробуйте поймать более конкретные исключения (исключения) и avoid having a bare try/expect block.

+0

Запись csv вручную - это просто проверить, работает ли код или нет –

Смежные вопросы