如何在Python中从yield回调函数中获取变量
我一直在试图弄清楚作用域和变量在Python中是如何工作的。我一直在试图解决这个问题,但我找不到从回调中获取变量的方法如何在Python中从yield回调函数中获取变量,python,scrapy,Python,Scrapy,我一直在试图弄清楚作用域和变量在Python中是如何工作的。我一直在试图解决这个问题,但我找不到从回调中获取变量的方法 def parse1(self,response): return 1 def parse2(self,response): returned = yield Request( 'https://www.example.com', callback=self.parse1, dont_filter=True
def parse1(self,response):
return 1
def parse2(self,response):
returned = yield Request(
'https://www.example.com',
callback=self.parse1,
dont_filter=True
)
print str(returned)
返回
1
我曾尝试使用全局变量,但内部设置的变量不会变成全局变量
如何从回调中获取变量?可能尝试将数据放入
meta
?像请求('https://www.example.com“,callback=self.parse1,meta={'value':0})
然后使用response将其放入parse1
中。meta
您的请求看起来非常特定于Scrapy而不是Python,在Scrapy Spider中,您需要什么(阻止一个请求以等待另一个请求的响应)由于底层的刮擦机械,无法以这种方式工作。虽然您可以
生成
请求,但返回的请求
对象及其回调只会在传递到底层机器之后进行处理,然后才能获得传递给其他解析方法的响应结果
如果,OTOH,您实际上只需要从另一个方法中的一个方法获取数据,并且“了解Python中作用域和变量的工作方式”,只需调用它:
但我猜这不是你真正的目标,你的例子很糟糕
相反,您可能要寻找的是等待对parse1
的阻塞请求,以将响应结果返回到parse2
,您希望在那里继续处理它。这在异步世界中不起作用(它等于回到过去),您更希望重构代码,使其不需要这种样式;或者,如果您发现自己依赖于一个同步的、分块的编程模型,那么您可以使用Scrapy以外的东西
然而,尽管如此,你可以看看,这将帮助你懒惰;但要成功地使用它,您仍然需要了解更深层的Scrapy系统,以及使用它可能出现的问题。避免它可能会在将来帮你省去头痛。认为自己受到警告。
(请务必阅读项目自述文件中的“已知问题”,以及此处的自述文件:)
使用此方法,您可以拥有内联请求并避免编写多个解析方法,如下所示:
import scrapy
从内联\u请求导入内联\u请求
类MySpider(scrapy.Spider):
name='myspider'
起始URL=['http://httpbin.org/html']
@内联请求你试过了吗?我知道metas。但这并不能解决我的问题。我需要在parse 2中返回parse 1中的数据。因此,只需将数据放入meta并在parse 1()中得到响应,但我需要在parse 2中而不是在parse 1中得到打印。我不想在parse 1中得到它。我想在parse2中输出一些东西。这是一个非常简单的例子来解释我的问题。
def parse1(self,response):
return 1
def parse2(self,response):
returned = self.parse1(response)
print str(returned)
import scrapy
from inline_requests import inline_requests
class MySpider(scrapy.Spider):
name = 'myspider'
start_urls = ['http://httpbin.org/html']
@inline_requests ###<- using this
def parse(self, response):
urls = [response.url]
for i in range(10):
next_url = response.urljoin('?page=%d' % i)
try:
next_resp = yield scrapy.Request(next_url, meta={'handle_httpstatus_all': True})
### you can then do that ^^^^^^^
urls.append(next_resp.url)
except Exception:
self.logger.info("Failed request %s", i, exc_info=True)
yield {'urls': urls}