2017-10-31 3 views
0

여러 거미에서 되풀이 작업을 처리하는 함수를 만들려고합니다. 그것을 깨뜨리는 것처럼 보이는 요청을하는 것입니다. 이 질문은 this question의 후속 조치입니다.요청을 생성하는 BaseSpider 클래스의 기능

import scrapy 
import json 
import re 

class BaseSpider(scrapy.Spider): 

    start_urls = {} 

    def test(self, response, cb, xpath): 
     self.logger.info('Success') 
     for url in response.xpath(xpath).extract(): 
      req = scrapy.Request(response.urljoin(url), callback=cb) 
      req.meta['category'] = response.meta.get('category') 
      yield req 

yield req 코드에있을 때, "성공"로거가 갑자기 더 이상 작동하지 않고 콜백 함수를 호출 할 것 같지 않습니다. yield req이 주석 처리되면 로거는 "성공"로거를 표시합니다. 나는 문제가 거미의 코드를 아래에, 거미에 생각하지 않지만 :

def parse(self,response): 
    self.logger.info('Base page: %s', response.url) 
    for req in self.test(response, self.parse_page, '//h3/a/@href'): 
     yield req 

시험 방법 수익률 결과와 이유를 먹으 렴 :

# -*- coding: utf-8 -*- 
import scrapy 
from crawling.spiders import BaseSpider 

class testContactsSpider(BaseSpider): 
    """ Test spider """ 
    name = "test" 
    start_urls = {} 
    start_urls['test'] = 'http://www.thewatchobserver.fr/petites-annonces-montres#.WfMaIxO0Pm3' 

    def parse(self,response): 
     self.logger.info('Base page: %s', response.url) 
     self.test(response, self.parse_page, '//h3/a/@href') 

    def parse_page(self, response): 
     self.logger.info('Page: %s', response.url) 

답변

1

난 당신이 뭔가를 필요가 있다고 생각 리턴 제네레이터 유형. 아래에서 try 코드 및 Understanding Generators in Python이 읽기 ​​:

def test(): 
    print('Inside generator!') 
    for i in range(5): 
    yield i 

print('============') 
g = test() #save as variable 
test()  #trying to call func 
print('============') 
print(next(g)) #next of "g" generator 
print(next(g)) 
print('============') 
print(next(test())) #next of newly created generator 
print(next(test())) 
print('============') 
for i in test(): #for each elem that returns generator 
    print(i) 


이 예에서 우리는 발전기 사용하지 : 우리는 다음 요소와 먹으 렴을 얻으려고 노력이에서

self.test(response, self.parse_page, '//h3/a/@href') 

을이 호출 이유 :

self.test(response, self.parse_page, '//h3/a/@href').next() 
#or 
    next(self.test(response, self.parse_page, '//h3/a/@href')) 


+0

이것은 실제로 작동하는 것 같습니다. 그러나 이상적으로는 가능한 한 간단하게 코드를 작성하고 싶습니다. 'self.parse' 함수에서 루프를 수행하지 않고'self.test' 함수에서 이러한 요청을 직접 내놓을 수는 없습니까? – Casper

+0

나는 그것이 가능하다고 생각하지 않는다. 코드를 좀 더 단순하게 유지하려면 (Python 3_에서) req in test() : yield req' 대신'yield from test()'를 사용할 수 있습니다. – Fidan

+0

불행히도 2.7을 달리고 있지만 도움을 주셔서 감사합니다. – Casper