Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # coding: cp1251
- import requests
- from lxml import html
- class Searcher(object): # Класс для поиска информации и ее вывода в консоль и файл
- def __init__(self, product=''):
- self.market = self.url = 'http://www.top-shop.ru/' # Магазин к рассмотрению
- self.product = product.decode('cp1251') # Записывается искомый товар, если тот передан аргументом при создании класса
- self.success = None # Начальные значения
- self.page = None
- def start(self): # Контроль вводимых значений
- if not self.product: # Если искомый товар не передан в аргументе, то требуется ввод через консоль
- while True:
- control = (raw_input('Product (type "exit" to exit): ')).decode('utf-8') # Команда для выхода из поиска
- if control:
- self.product = control
- break
- def found(self): # Функция, определяющая, был ли поиск успешным
- respond = requests.get(self.market + 'search/', params={'find': self.product}) # Формирует запрос
- parsed = html.fromstring(respond.text)
- result = ''.join(parsed.xpath('//div[@class="result_text"]/text()')) # Строка результата запроса
- if 'мы не нашли товаров'.decode('cp1251') in result: # Проверяется наличие ключевых слов
- print 'Nothing found'
- self.success = None # Вывод сообщения неудачного поиска
- else:
- self.success = parsed # Поиск успешен, сохраняем полезные параметры
- self.url = respond.url
- def pages(self): # Проверяем количество страниц в запросе
- if self.success is not None: # Выясняем, был ли запрос успешным
- try:
- self.page = max(map(int, self.success.xpath('//li[@class=" js_page"]/@data-num')))
- except ValueError: # Находим на сайте наибольший номер страницы, а если страниц не обнаружено,
- self.page = 1 # то только одна страница
- def output(self): # Вывод в документ и консоль
- if self.success is not None: # Проверка успешности запроса
- document = open('Result %s.txt' % self.product, 'w') # Открываем файл для записи и формируем заголовок
- document.write(('%-100s\t%s\n' % ('Name', 'Price [rub]') + '=' * 120 + '\n'))
- if '/product/' in self.url: # Если в адресе содержится product, то запрос точный, в выводе только один товар
- res1 = self.success.xpath('//body/div[6]/div[2]/div/div/div/div/h1/text()')[0].strip('\t\n')
- res2 = self.success.xpath('//body/div[6]/div[3]/div[3]/div/div[2]/div/div[1]/text()')[0]
- document.write(('%-100s\t%s\n' % (res1, res2)).encode('cp1251'))
- print res1, res2
- else: # Если адрес без product, то несколько позиций товара
- for num in xrange(1, self.page + 1): # Проход по всем страницам
- respond = requests.get(self.market + 'search/', params={'find': self.product, 'page': num})
- parsed = html.fromstring(respond.text) # Запросы по страницам
- result = zip(parsed.xpath('//span[@class="hidden js_ectrack"]/@data-name'), # Извлечение результатов
- parsed.xpath('//span[@class="hidden js_ectrack"]/@data-price'))
- for y in result: # И их вывод
- document.write(('%-100s\t%s\n' % (y[0], y[1])).encode('cp1251'))
- print y[0], y[1]
- document.close()
- def doit(self): # Очередность. Запускает поиск, который отменяется командой exit
- while True:
- self.start()
- if self.product != 'exit':
- self.found()
- self.pages()
- self.output()
- self.product = ''
- else:
- break
- if __name__ == '__main__':
- first = Searcher('redmond')
- first.doit()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement