Scrapy实例方法神秘地拒绝调用另一个实例方法

Scrapy instance method mysteriously refusing to call another instance method

我正在使用 Scrapy 抓取一个网站,该网站有一个登录页面,后跟一组具有连续整数 ID 的内容页面,作为 URL 参数提取。这已经成功 运行 一段时间了,但前几天我决定将产生 Requests 的代码移到一个单独的方法中,这样我就可以在初始加载之外的其他地方调用它(基本上,动态添加要获取更多页面)。

它...只是不会调用那个单独的方法。它到达我调用 self.issue_requests() 的位置,然后继续执行它,就好像指令不存在一样。

所以这个(蜘蛛 class 定义的一部分,没有单独的方法)有效:

    # ...final bit of start_requests():
    yield scrapy.FormRequest(url=LOGIN_URL + '/login', method='POST', formdata=LOGIN_PARAMS, callback=self.parse_login)

def parse_login(self, response):
    self.logger.debug("Logged in successfully!")
    global next_priority, input_reqno, REQUEST_RANGE, badreqs

    # go through our desired page numbers
    while len(REQUEST_RANGE) > 0:
        input_reqno = int(REQUEST_RANGE.pop(0))

        if input_reqno not in badreqs:
            yield scrapy.Request(url=REQUEST_BASE_URL + str(input_reqno), method='GET', meta={'input_reqno': input_reqno,'dont_retry': True}, callback=self.parse_page, priority = next_priority)
            next_priority -= 1

def parse_page(self, response):
    # ...

...但是,这种轻微的重构不会:

    # ...final bit of start_requests():
    yield scrapy.FormRequest(url=LOGIN_URL + '/login', method='POST', formdata=LOGIN_PARAMS, callback=self.parse_login)

def issue_requests(self):
    self.logger.debug("Inside issue_requests()!")
    global next_priority, input_reqno, REQUEST_RANGE, badreqs

    # go through our desired page numbers
    while len(REQUEST_RANGE) > 0:
        input_reqno = int(REQUEST_RANGE.pop(0))

        if input_reqno not in badreqs:
            yield scrapy.Request(url=REQUEST_BASE_URL + str(input_reqno), method='GET', meta={'input_reqno': input_reqno,'dont_retry': True}, callback=self.parse_page, priority = next_priority)
            next_priority -= 1
    return

def parse_login(self, response):
    self.logger.debug("Logged in successfully!")
    self.issue_requests()

def parse_page(self, response):
    # ...

查看日志,到了“登录成功!”部分,但是随后 never 进入“issue_requests() 内部”,并且因为生成器没有产生任何 scrapy Request 对象,它的下一步是关闭蜘蛛,有什么都没做。

我从未见过对象实例拒绝调用方法的情况。如果它不能将控制权传递给方法,或者如果(比如说)方法中的变量作用域存在问题,您会期望出现一些失败消息。但它默默地继续前进并假装我从未告诉它去 issue_requests(),对我来说,这很奇怪。求助!

(这是 Python 2.7.18,顺便说一句)

您还必须从 parse_login 中获得物品:

def parse_login(self, response):
    self.logger.debug("Logged in successfully!")
    for req in self.issue_requests():
        yield req