На ум приходят две вещи:
1) Ваш запрос «начать новый сеанс» может быть отклонен загрузчиком: По умолчанию он фильтрует URL-адреса, которые он уже видел , например, ваш базовый URL. Попробуйте yield scrapy.Request(callback=self.parse, url = self.base_url, dont_filter=True, headers='')
в своем "сбросе запроса сеанса"
2) Если это не работает (или, возможно, в дополнение к):
Я довольно новичок в Scrapy и Python, так что может быть более прямой метод "сбросить ваши куки", но указание свежего cookiejar должно сработать.
Cookiejar - это по существу диктованный объект, который отслеживает файлы cookie текущего сеанса. Вы можете указать ключ cookiejar, используя meta
.
# Set up a new session if bad news:
if (len(rows) < 50 and self.count != self.numberOfPages):
self.log('Deficient rows. Resubmitting')
yield scrapy.Request(
callback=self.parse,
url=self.base_url,
dont_filter=True,
meta={
# Since you are already tracking a counter,
# this might make for a reasonable "next cookiejar id"
'cookiejar': self.count
}
)
Теперь, когда вы указываете новый cookiejar, вы находитесь в новом сеансе. Вы должны учитывать это в других ваших запросах, проверяя, установлен ли cookiejar, и продолжая передавать это значение. В противном случае вы вернетесь в cookiejar по умолчанию. Возможно, проще всего управлять этим ожиданием с самого начала, определив start_requests :
def start_requests(self):
return [
scrapy.Request(
url,
dont_filter=True,
meta={'cookiejar': self.count}
) for url in self.start_urls
]
Теперь вашим другим объектам запроса нужно просто реализовать следующий шаблон для «пребывания в том же сеансе», например, в вашем методе синтаксического анализа:
yield scrapy.FormRequest(
url = self.base_url,
formdata = frmdata,
callback = self.parse_index,
meta={
'cookiejar': response.meta.get('cookiejar')
}
)