@vante_scribaxxi

Как перезапустить таск в grab:spider?

Иногда бывает так, что когда только запущу паука, он видимо использовав тухлый прокси, получает неправильное содержание страницы. То-есть в заголовке ответа написано 200, это точно, но неверно само содержание. Т.к. я могу определить это в коде, то я подумал почему-бы мне не повторить запрос. Только как это сделать я не знаю. Код:
class ExampleSpider(Spider):
	initial_urls = ['http://www.supertrike.ru/shop/']
	
	def create_grab_instance(self):
		g = Grab(
			connect_timeout=6,
            timeout=8
            )
		g.proxylist.load_url('http://127.0.0.1:7777/proxy.txt')
		return g
	
	# Функция prepare вызываетя один раз перед началом
	def prepare(self):
		self.result_file = csv.writer(open('result.txt', 'w'))
		
	def task_initial(self, grab, task):
		print('Собераю ссылки на категории')
		cats=[a.text() for a in grab.doc.select('//ul[@class="menu vmLinkMenu"]//li//@href').selector_list][:-1]
		print('КАТЕГОРИИ: %s' % '\n'.join(cats))
		if not cats:
			Task('initials', url=self.initial_urls[0]) #Тут я сделал глупую попытку решить проблему, которая почему-то не сработала((
		for cat_url in cats:
			print('-%s' % cat_url)
			yield Task('category', url='http://www.supertrike.ru%s?limitstart=0&limit=65535s' % cat_url)
	
	def task_category(self, grab, task):
		#print('Собераю ссылки на товары')
		for prod_url in [a.text() for a in grab.doc.select('//div[@class="bp_product_details"]/a/@href').selector_list]:
			yield Task('product', url='http://www.supertrike.ru%s' % prod_url)
		
	def task_product(self, grab, task):
		ims = [a.text() for a in grab.doc.select("//div[@class='contentp left_top_box']//*//a/./img/../@href").selector_list]
		images = []
		for i, im in enumerate(ims):#Удаляем повторы (костыль, нужен из-за несовершенного xpath'а)
			if im in images[:i]:
				continue
			else:
				images.append(im)
		i=0
		while i < len(images):
			if not 'supertrike.ru' in images[i]:
				images[i] = 'http://supertrike.ru%s' % images[i]
			i+=1
		
		price = None
		try:
			price = grab.doc.select('//div[@class="product_price_box"]//span[@class="productPrice"]').text()
		except:
			pass
		
		images_fnames = []
		
		category=''
		try:
			category=grab.doc.select('//div[@class="cbwrap"]//*//span[2]//a').text()
		except:
			category=''
		descr=grab.doc.select('//div[@class="contentp right_top_box"]/div')
		title=grab.doc.select('//h1')
		product = [
			task.url, #Ссылка на товар
			category, #Категория
			descr.text() if descr else '', #Описание
			title.text() if title else '', #Заголовок
			re.search('([ 0987654321]*)', price).group(0).replace(' ', '') if price else None, #Цена
			','.join(images) if images else ''#Картинки
		]
		i = 0
		while i < len(product):
			product[i] = product[i]
			i += 1
		self.result_file.writerow(product)
		print('Saved %s' % product[1])
		

if __name__ == '__main__':
	bot = ExampleSpider(
			thread_number=2,
			network_try_limit=10
		)
	bot.run()


Вот что пишет
5a1aaf406ff8a124712011.jpeg
  • Вопрос задан
  • 153 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы