Scrapy parse_node()只需3个参数(给定2个)

时间:2016-04-02 02:20:20

标签: python scrapy scrapy-spider

我在Scrapy中面临parse_node方法的一些问题:

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-bot的一部分,它以递归方式抓取同一页面以提取最后十个项目。一切都有效,除了最后一个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)

但它给我一个断言错误,可能是因为参数错误了?

你知道如何解决这个问题吗?将正确的args传递给parse_node,以我可以使用的方式调用errback。

2 个答案:

答案 0 :(得分:0)

尝试

def parse_node(self, response):
<yourcode>

答案 1 :(得分: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”会将Selector(节点)传递给parse_node。