Я просматриваю список страниц, где на каждой странице есть список URL-адресов, которые мне также нужно проанализировать. Я просматриваю эти первые страницы, но я априори не знаю, когда мне остановить сканирование. Например, этот еще предстоит проанализировать:
http://www.cmjornal.pt/opiniao/colunistas/acacio-pereira/MoreContent?firstContent=183
но не этот не потому, что он уже пуст:
http://www.cmjornal.pt/opiniao/colunistas/acacio-pereira/MoreContent?firstContent=200
Итак, мой вопрос: как я могу остановить поискового робота с условием, обнаруженным в результате синтаксического анализа URL-адреса? Я попытался использовать CloseSpider()
, но это не сработало, потому что он полностью закрыл паука до того, как будут проанализированы другие URL-адреса.
Я показываю код, который использую с CloseSpider()
:
class CmSpider(scrapy.Spider):
name = "historical"
start_urls = ['http://www.cmjornal.pt/opiniao/colunistas/acacio-pereira/MoreContent?firstContent=']
hostname = 'http://www.cmjornal.pt'
def parse(self, response):
for i in range(180,200,3):
url = response.url + str(i)
yield scrapy.Request(url,callback=self.parse_page,priority = 1)
def parse_page(self,response):
if len(response.xpath('/html/body//*')) <= 2:
raise CloseSpider('bandwidth_exceeded')
else:
pass
articles_url = response.xpath('//*[@class="lead"]/../h3/a/@href').extract()
for url in articles_url:
url = self.hostname+url
item = CmItem()
item['hostname'] = self.hostname
request = scrapy.Request(url,callback=self.parse_article)
request.meta['item'] = item
yield request
def parse_article(self,response):
item = response.meta['item']
(...)
Примечание: в этом конкретном случае я знаю, когда закончится контент, но мне нужно запустить это для многих других случаев, когда я не знаю такого ограничения.