我试图通过调用sys.exit()
来退出python程序,但它似乎没有工作。
程序结构类似于:
def func2():
*does some scraping operations using scrapy*
def func1():
Request(urls, callbakc=func2)
所以,在这里,func1正在请求一个URL列表和回调方法,正在调用func2。如果func2
在func1
中检查对象类型时,我找到了它和http.Request
对象。
此外,由于我使用scrapy
,每当我在sys.exit()
中调用func2
时,都会调用列表中的下一个url并继续执行程序。
我也尝试使用全局变量来停止执行但无济于事。
我哪里错了?
答案 0 :(得分:1)
根据How can I instruct a spider to stop itself?,您需要提出CloseSpider
exception:
raise CloseSpider('Done web-scraping for now')
另见:
由于Scrapy基于sys.exit()
。,因此 twisted
无效
答案 1 :(得分:0)
即使我们不知道如何完全停止,Python的mutable-object default binding "gotcha"也可以帮助我们从某个角落跳过所有回调。
以下是您可以做的事情:
首先,创建一个函数,生成包含其他带条件的回调函数。它的第二个参数cont
将绑定到可变对象(list
),因此我们可以在创建后影响所有回调它们。
def callback_gen(f, cont=[True]):
def c(response):
if cont[0]:
f(response, cont=cont)
else:
print "skipping" # possibly replace with pass
return c
现在制作一些测试功能:
def func2(response, cont=None):
print response
print cont
# this should prevent any following callback from running
cont[0]=False
def func3(response, cont=None):
print response
print cont
现在创建两个回调,第一个回调是func2
,这会阻止以下回调运行。
f2 = callback_gen(func2)
f3 = callback_gen(func3)
f2("func2")
f3("func3")
我喜欢它:)