2017-06-19 39 views
2

私はscrappyが呼び出すメインの解析関数からgetNext()関数を呼び出そうとしますが、呼び出されることはありません。Python Scrapy関数呼び出し

class BlogSpider(scrapy.Spider): 
     # User agent. 
     name = 'Mozilla/5.0 (Linux; Android 4.0.4; Galaxy Nexus Build/IMM76B) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.133 Mobile Safari/535.19' 
     start_urls = ['http://www.tricksforums.org/best-free-movie-streaming-sites-to/'] 

     def getNext(self): 
     print("Getting next ... ") 
     # Check if next link in DB is valid and crawl. 
     try: 
      nextUrl = myDb.getNextUrl() 
      urllib.urlopen(nextUrl).getcode() 
      yield scrapy.Request(nextUrl['link']) 
     except IOError as e: 
      print("Server can't be reached", e.code) 
      yield self.getNext() 

     def parse(self, response): 
     print("Parsing link: ", response.url) 
     # Get all urls for futher crawling. 
     all_links = hxs.xpath('*//a/@href').extract() 
     for link in all_links: 
      if validators.url(link) and not myDb.existUrl(link) and not myDb.visited(link): 
      myDb.addUrl(link) 
     print("Getting next?") 
     yield self.getNext() 

私はそれ以前に収穫をしていましたが、何も問題はありませんでしたか?そして、この収穫は何であるはずですか? :)

+0

コンソールには何が印刷されていますか? – alecxe

+0

'( 'リンクの解析:'、 'http://www.tricksforums.org/best-free-movie-streaming-sites-to/') 次の取得方法は?'それだけです。 – Alessandro

+0

「次へ」を参照してください。つまり、getNext()が実行されたことを意味します。ありがとう。 – alecxe

答えて

1

あなたは発電機を生産しようとしていますが、発電機からの生産はです。

あなたは、Python 3.3+の上にある場合は、yield fromを使用することができます。

yield from self.getNext() 

それとも、単にreturn self.getNext()を行います。

+0

うまくいって:)。しかし、私はまだ利回りの取引を得ていません。 – Alessandro

+1

@Alessandroあなたはまた、コンソール上のメッセージに気づいたはずです: '2017-06-19 15:42:49 [scrapy.core.scraper]エラー:スパイダーは返さなければなりませんリクエスト、BaseItem、dictまたはNoneは、で 'generator'を取得しました - [このSOのトピック](https ://stackoverflow.com/q/1756096/771848)を参照してください。ありがとう! – alecxe

+1

私は "--nolog"フラグを持っていました。 – Alessandro