2013-07-19 2 views
3

Я последовал совет из этих двух постов, я также пытаюсь создать общий Scrapy паук:передачи аргументов Scrapy

How to pass a user defined argument in scrapy spider

Creating a generic scrapy spider

Но я получаю сообщение об ошибке, что у переменная, которую я должен передавать, поскольку аргумент не определен. Я что-то пропустил в моем init метод?

Код:

from scrapy.spider import BaseSpider 
from scrapy.selector import HtmlXPathSelector 

from data.items import DataItem 

class companySpider(BaseSpider): 
    name = "woz" 

    def __init__(self, domains=""): 
     ''' 
     domains is a string 
     ''' 
     self.domains = domains 

    deny_domains = [""] 
    start_urls = [domains] 

    def parse(self, response): 
     hxs = HtmlXPathSelector(response) 
     sites = hxs.select('/html') 
     items = [] 
     for site in sites: 
      item = DataItem() 
      item['text'] = site.select('text()').extract() 
      items.append(item) 
     return items 

Вот моя командной строки:

scrapy crawl woz -a domains="http://www.dmoz.org/Computers/Programming/Languages/Python/Books/" 

А вот ошибка:

NameError: name 'domains' is not defined 
+0

Я забыл ссылаться на переменном в start_urls, как self.domains, но теперь ошибка говорит, что сам не определена. У меня есть ответ на мой вопрос, но я должен подождать 4 часа, прежде чем я смогу опубликовать. Продолжение следует... – jstaker7

ответ

4

вы должны вызвать super(companySpider, self).__init__(*args, **kwargs) в начале вашей __init__ ,

def __init__(self, domains="", *args, **kwargs): 
    super(companySpider, self).__init__(*args, **kwargs) 
    self.domains = domains 

В вашем случае, когда ваши первые запросы зависят от паутинного аргумента, что я обычно делаю только переопределить start_requests() метод не отменяя __init__(). Имя параметра из командной строки aleady доступно в качестве атрибута паука:

class companySpider(BaseSpider): 
    name = "woz" 
    deny_domains = [""] 

    def start_requests(self): 
     yield Request(self.domains) # for example if domains is a single URL 

    def parse(self, response): 
     ... 
Смежные вопросы