2016-04-02 4 views
0

Я столкнулся некоторые проблемы с методом parse_node в Scrapy:Scrapy parse_node() занимает ровно 3 аргумента (2 дано)

class s1(scrapy.spiders.XMLFeedSpider): 
name = "s1" 
handle_httpstatus_list = [400,401,403,404,408,410,500,502,503,504] 
allowed_domains = ["xxx"] 
start_urls = ["xxx"] 
main_url = start_urls[0] 
jobs_list = [] 
tracker = SummaryTracker() 
itertag = "miojob" 
counter = 0 


def parse_node(self, response, node): 
    if response.status in [400,401,403,404,408,410,500,502,503,504]: 
     time.sleep(60) 
     yield scrapy.Request(self.main_url, callback=self.parse_node, errback=self.err1, dont_filter = True) 
    else: 
    #Some Code # 
     yield scrapy.Request(self.main_url, callback=self.parse_node, errback=self.err1, dont_filter = True) 

Это часть Scrapy-бот, который рекурсивно скоблить ту же страницу извлеките последние десять предметов. Все работает за последний scrapy.Request за исключением, потому что он дает мне эту ошибку: «parse_node() принимает ровно 3 аргумента (2 дано)» Вместо если я использую простой Request(self.main_url) это работает, но я не могу использовать errback потому что ему нужен обратный вызов. Я попытался передать дополнительные аргументы parse_node как это:

yield scrapy.Request(self.main_url, callback=self.parse_node(arg1,arg2), errback=self.err1, dont_filter = True) 

, но это дает мне ошибку Assertion, вероятно, потому что аргументы неверны?

Есть ли у вас какие-либо идеи относительно того, как это решить? Передача правильных аргументов parse_node, в том, как я могу использовать также вызываемый вызов.

+0

метод обратного вызова должен содержать только два аргумента: 'self' и' response', поэтому удалите 'node' – eLRuLL

+0

@eLRuLL Если я удалю узел из parse_node, вы получите ошибку, аналогичную старой! – 0cN

ответ

0

попробовать

def parse_node(self, response): 
<yourcode> 
+0

Спасибо, но это не сработало! – 0cN

0

Я решен вопрос, прочитав исходный код здесь: https://github.com/scrapy/scrapy/blob/master/scrapy/spiders/feed.py

старый запрос сейчас:

yield scrapy.Request(self.main_url, callback=self.parse,errback=self.err1, dont_filter = True) 

твик здесь зовет parse, вместо parse_node, потому что «parse» передает селектор (узел) в parse_node.

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