2016-08-08 6 views
0

선택적 로그인으로 재귀 webspider를 구축 중입니다. json 설정 파일을 통해 대부분의 설정을 동적으로 만들고 싶습니다.치료 InitSpider : __init__에 규칙을 설정 하시겠습니까?

__init__ 함수에서이 파일을 읽고 모든 변수를 채우려 고 시도하지만 Rules과 작동하지 않습니다.

class CrawlpySpider(InitSpider): 

... 

#---------------------------------------------------------------------- 
def __init__(self, *args, **kwargs): 
    """Constructor: overwrite parent __init__ function""" 

    # Call parent init 
    super(CrawlpySpider, self).__init__(*args, **kwargs) 

    # Get command line arg provided configuration param 
    config_file = kwargs.get('config') 

    # Validate configuration file parameter 
    if not config_file: 
     logging.error('Missing argument "-a config"') 
     logging.error('Usage: scrapy crawl crawlpy -a config=/path/to/config.json') 
     self.abort = True 

    # Check if it is actually a file 
    elif not os.path.isfile(config_file): 
     logging.error('Specified config file does not exist') 
     logging.error('Not found in: "' + config_file + '"') 
     self.abort = True 

    # All good, read config 
    else: 
     # Load json config 
     fpointer = open(config_file) 
     data = fpointer.read() 
     fpointer.close() 

     # convert JSON to dict 
     config = json.loads(data) 

     # config['rules'] is simply a string array which looks like this: 
     # config['rules'] = [ 
     # 'password', 
     # 'reset', 
     # 'delete', 
     # 'disable', 
     # 'drop', 
     # 'logout', 
     # ] 

     CrawlpySpider.rules = (
      Rule(
       LinkExtractor(
        allow_domains=(self.allowed_domains), 
        unique=True, 
        deny=tuple(config['rules']) 
       ), 
       callback='parse', 
       follow=False 
      ), 
     ) 

Scrapy 여전히 config['rules']에 존재하기 때문에 또한 logout 페이지 히트 페이지를 크롤링합니다. 따라서 지정된 페이지가 거부되지 않습니다. 내가 여기서 무엇을 놓치고 있니?

업데이트 : 이미 __init__ 내부 CrawlpySpider.rules = ...뿐만 아니라 self.rules = ...를 설정하여 시도

. 두 변형 모두 작동하지 않습니다.

  • 거미 : InitSpider
  • 규칙 : 크롤 전에 LinkExtractor
  • :

를 크롤링하기 전에 로그인을하는 것은 나는 심지어 내 parse 기능에 그것을 거부하려고

# Dive deeper? 
    # The nesting depth is now handled via a custom middle-ware (middlewares.py) 
    #if curr_depth < self.max_depth or self.max_depth == 0: 
    links = LinkExtractor().extract_links(response) 
    for link in links: 
     for ignore in self.ignores: 
      if (ignore not in link.url) and (ignore.lower() not in link.url.lower()) and link.url.find(ignore) == -1: 
       yield Request(link.url, meta={'depth': curr_depth+1, 'referer': response.url}) 

답변

0

당신은 인스턴스 속성을 설정할 위치의 클래스 속성 설정 :

# this: 
CrawlpySpider.rules = (
# should be this: 
self.rules = (
<...> 
+0

나는 그것을 시도해도 작동하지 않았다. 나는 그 정보를 내 질문에 추가했다. – cytopia

+0

InitSpider는'_compile_rules'와 같은 것을 가지고 있지 않습니다 (CrawlSpider와 마찬가지입니다). 분명히 InitSpider는 Spider에서 상속하는 것만 큼 규칙조차 갖고 있지 않은 것처럼 보입니다. CrawlSpider는이 모든 것을 구현합니다. – cytopia