Проблема заключается в том, что вы выдаете запрос на parse_user
одновременно с выдачей questions
, но Item и Request обрабатываются различными промежуточными программами, поэтому они не будут выполняться один за другим.
Лучше отправьте первую часть вопросов на parse_user
, используя мета, и получите только questions
в parse_user
def parse_questions(self, response):
questions = {}
questions["title"] = response.css('a.question-hyperlink::text').extract_first()
questions["user"] = response.css('.user-details a::text').extract_first()
yield scrapy.Request(url=response.urljoin(response.css('.user-details a::attr(href)').extract_first()),
callback=self.parse_user,
meta={'questions': questions})
def parse_user(self, response):
questions = response.meta.get('questions')
questions["user_reputation"] = response.css('div.reputation::text').extract_first().strip()
yield questions
Вам лучше создать новую переменную questions
на каждомвызов parse_questions
, как указано выше, поскольку он не должен быть глобальной переменной.
Более того, следует исправить parse
следующим образом
def parse(self, response):
for link in response.css('a.question-hyperlink::attr(href)').extract():
yield scrapy.Request(url=response.urljoin(link), callback=self.parse_questions)
yield scrapy.Request(url=response.urljoin(response.css('a[rel="next"]::attr(href)').extract_first()), callback=self.parse)
Поскольку вы выдаете запрос на следующую страницудля каждой ссылки на одной странице, что не так проблематично, потому что скрапирование, как дупфильтр, но, вероятно, будет более эффективным