누구나 scrapy 호출을 호출하고 요청의 콜백 함수 결과를 처리하는 방법을 설명 할 수 있습니까?요청의 콜백 함수가 어떻게 처리됩니까?
본인은 치료가 Object (Request, BaseItem, None) 또는 Iterable의 결과를 허용 할 수 있음을 이해합니다. 예를 들면 :
1. 객체 반환 (요청 또는 BASEITEM 또는 없음) 객체의
def parse(self, response):
...
return scrapy.Request(...)
2. 반환의 Iterable
def parse(self, response):
...
for url in self.urls:
yield scrapy.Request(...)
나는 그들이 같이 처리됩니다 생각하고 있어요 이것은 치료의 코드 어딘가에 있습니다.
# Assumed process_callback_result is a function that called after
# a Request's callback function has been executed.
# The "result" parameter is the callback's returned value
def process_callback_result(self, result):
if isinstance(result, scrapy.Request):
self.process_request(result)
elif isinstance(result, scrapy.BaseItem):
self.process_item(result)
elif result is None:
pass
elif isinstance(result, collections.Iterable):
for obj in result:
self.process_callback_result(obj)
else:
# show error message
# ...
나는 _process_spidermw_output
기능에 <PYTHON_HOME>/Lib/site-packages/scrapy/core/scraper.py
에서 해당 코드를 발견 :
def _process_spidermw_output(self, output, request, response, spider):
"""Process each Request/Item (given in the output parameter) returned
from the given spider
"""
if isinstance(output, Request):
self.crawler.engine.crawl(request=output, spider=spider)
elif isinstance(output, BaseItem):
self.slot.itemproc_size += 1
dfd = self.itemproc.process_item(output, spider)
dfd.addBoth(self._itemproc_finished, output, response, spider)
return dfd
elif output is None:
pass
else:
typename = type(output).__name__
log.msg(format='Spider must return Request, BaseItem or None, '
'got %(typename)r in %(request)s',
level=log.ERROR, spider=spider, request=request, typename=typename)
하지만 elif isinstance(result, collections.Iterable):
로직의 일부를 찾을 수 없습니다.
그래서 의미 다음
scrapy.utils.misc.arg_to_iter()
은? Request/BaseItem을 Iterable로 변환하는 코드는 어디에 있습니까? 'handle_spider_output'에서'_scrape' 함수를 추적 할 수만 있었지만 내부의 코드는 실제로 이해할 수 없습니다. – null내 대답을 더 자세히 업데이트했습니다. – bosnjak
놀라운! 놀라운 대답! 내가 2 번 upvote 할 수 있으면 좋겠다. – null