[英]How to get variable out of a yield callback function in Python
我一直在嘗試弄清楚范圍和變量在Python中是如何工作的。 我一直在嘗試解決此問題,但我找不到從回調中獲取變量的方法。
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
我嘗試使用全局變量,但是內部設置的變量不會變為全局變量。
如何從回調中獲取變量?
您要問的內容看起來非常特定於Scrapy而不是Python,並且在Scrapy Spider中,您想要的內容(阻止一個請求以等待另一個請求的響應)無法通過這種方式工作,這是由於底層的Scrapy機制所致。
雖然可以yield
一個Request,但返回的Request
對象及其回調僅在將其傳遞到基礎機器之后才得到處理,然后才能將Response結果傳遞到其他解析方法。
如果是OTOH,實際上您只是想從另一個方法中的一種方法獲得數據,並“弄清楚作用域和變量在Python中的工作方式”,只需調用它:
def parse1(self,response):
return 1
def parse2(self,response):
returned = self.parse1(response)
print str(returned)
但是我猜測這不是您的最終目標,您的榜樣很糟糕。
相反,您可能要等待的是等待對parse1
的阻止請求, parse1
將響應結果返回給parse2
,在該處您要繼續處理它。 在異步世界中,這是行不通的(它等於時光倒流),而您寧願重構代碼以不需要這種樣式。 或者,如果您發現自己依賴於同步,阻塞,編程模型,則可以使用Scrapy之外的其他工具。
話雖這么說,您可以看看scrapy-inline-requests ,它可以幫助您變得懶惰。 但是要成功使用它,您仍然需要了解更深入的Scrapy系統以及使用此系統可能出現的問題。 避免它可能會在將來為您省去頭痛。 考慮一下自己被警告。
( 一定要閱讀項目自述文件的“已知問題”,以及這里的自述文件: flake8-inline-requests 。)
使用此方法,您可以擁有內聯請求,並避免編寫多個解析方法,如下所示:
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}
也許嘗試將數據放入meta
? 像Request('https://www.example.com', callback=self.parse1, meta={'value': 0})
,然后使用response.meta
在parse1
獲取它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.