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
我正在使用 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