如何解决如何在scrapy蜘蛛中每个http请求成功后才执行方法?
我有以下蜘蛛:
import scrapy
from twisted.internet import defer
class TestSpider(scrapy.Spider):
name = 'test'
allowed_domains = ['quotes.toscrape.com']
start_urls = ['https://quotes.toscrape.com/','https://quotes.toscrape.com/page/2/','https://quotes.toscrape.com/page/3/']
def parse(self,response):
# deferred = defer.Deferred()
# deferred.addCallback(self.parse_author)
# deferred.addCallback(self.process_engine)
self.logger.info("Parsing quote page!!")
data = {}
quotes = response.xpath('//div[@class="quote"]')
for i,quote in enumerate(quotes):
data['quote'] = quote.xpath('./span[@class="text"]/text()').get()
data['tags'] = quote.xpath('.//div[@class="tags"]/a[@class="tag"]/text()').getall()
data['author_url'] = response.urljoin(quote.xpath('.//a[starts-with(@href,"/author/")]/@href').get())
if data['author_url'] and i < 5:
yield scrapy.Request(data['author_url'],callback=self.parse_author,meta={'data': data})
# yield scrapy.Request(data['author_url'],callback=deferred.callback)
else:
self.logger.info("Author data not found!!")
yield data
if quotes:
self.process_engine()
def parse_author(self,response):
self.logger.info("Parsing author page!!")
data = response.meta.get('data')
data['author_name'] = response.xpath('//h3/text()').get()
data['author_dob'] = response.xpath('//span[@class="author-born-date"]/text()').get()
yield data
def process_engine(self,data=None):
self.logger.info("\n<<<<<<<<<<<<<<<<<<< process engine running >>>>>>>>>>>>>>>>>>>>>>>\n")
# some logic here
这里我想要的是仅在每个 start_urls 请求成功完成后才执行 process_engine 方法(即有 quotes 可能存储在数据库)。但是这里发生的事情是,当 spider 正在等待 fetch author_url 数据时,process_engine 方法被执行。 我也尝试使用 defer,但没有用,或者我没有正确使用。我们如何解决这个问题?任何帮助将不胜感激。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。