Вам действительно нужно хранить счетчик для номера истории?
Я думаю, вы можете просто открыть следующую страницу, если найдете ее, что-то вроде:
if response.xpath('//button[text()="Next >"]'):
next_link = response.xpath('//button[text()="Next >"]')[0].attrib['onclick'].replace('self.location=', '').replace("'", '')
yield response.follow('https://www.fanfiction.net' + next_link, self.fanfiction)
Как упоминалось в комментариях, вы должны использовать конвейер товаров, чтобы заботиться о «хранении» своих предметов в ваших документах.
Вот кое-что, чтобы дать вам идею, которая работает для меня, и которую вы должны адаптироватьна ваш случай использования:
import docx
import scrapy
class StoryPipeline:
def open_spider(self, spider):
self.doc = docx.Document()
def process_item(self, item, spider):
if 'title' in item:
self.title = item['title']
self.doc.add_paragraph(str(item))
else:
self.doc.add_paragraph('\n\n'.join(item['paragraphs']))
def close_spider(self, spider):
self.doc.save('./%s.docx' % (self.title))
class FanfictionDownloader(scrapy.Spider):
name = "fanfiction.net"
custom_settings = {
"ITEM_PIPELINES": {
"myspider.StoryPipeline": 300,
}
}
def start_requests(self):
start_url = 'https://www.fanfiction.net/s/11734723/1/This-Past-Storm'
yield scrapy.Request(url=start_url, callback=self.parse)
def parse(self, response):
title = response.xpath('//*[@id="profile_top"]/b/text()').get()
storyId = response.xpath('//*[@id="profile_top"]/span[4]/text()[5]').get().replace(' - id: ', '')
chapters = response.xpath('(//select[@id="chap_select"])[1]/option/text()').getall()
yield {
'title': title,
'storyId': storyId,
'chapters': chapters,
'totalChapters': len(chapters),
}
for x in self._parse_paragraphs(response):
yield x
def parse_next(self, response):
for x in self._parse_paragraphs(response):
yield x
def _parse_paragraphs(self, response):
paragraphs = response.xpath('//div[@id="storytext"]//text()').getall()
yield {'paragraphs': paragraphs}
next_button = response.xpath('(//button[text()="Next >"])[1]/@onclick').get()
if next_button:
next_url = next_button.replace('self.location=', '').replace("'", '')
yield scrapy.Request(url=response.urljoin(next_url), callback=self.parse_next)