Advertisement
tokarevms

Shop-script

Jul 28th, 2017
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.76 KB | None | 0 0
  1. # coding: cp1251
  2. import requests
  3. from lxml import html
  4.  
  5.  
  6. class Searcher(object):  # Класс для поиска информации и ее вывода в консоль и файл
  7.  
  8.     def __init__(self, product=''):
  9.         self.market = self.url = 'http://www.top-shop.ru/'  # Магазин к рассмотрению
  10.         self.product = product.decode('cp1251')  # Записывается искомый товар, если тот передан аргументом при создании класса
  11.         self.success = None  # Начальные значения
  12.         self.page = None
  13.  
  14.     def start(self):    # Контроль вводимых значений
  15.         if not self.product:  # Если искомый товар не передан в аргументе, то требуется ввод через консоль
  16.             while True:
  17.                 control = (raw_input('Product (type "exit" to exit): ')).decode('utf-8')  # Команда для выхода из поиска
  18.                 if control:
  19.                     self.product = control
  20.                     break
  21.  
  22.     def found(self):  # Функция, определяющая, был ли поиск успешным
  23.         respond = requests.get(self.market + 'search/', params={'find': self.product})   # Формирует запрос
  24.         parsed = html.fromstring(respond.text)
  25.         result = ''.join(parsed.xpath('//div[@class="result_text"]/text()'))  # Строка результата запроса
  26.         if 'мы не нашли товаров'.decode('cp1251') in result:  # Проверяется наличие ключевых слов
  27.             print 'Nothing found'
  28.             self.success = None  # Вывод сообщения неудачного поиска
  29.         else:
  30.             self.success = parsed  # Поиск успешен, сохраняем полезные параметры
  31.             self.url = respond.url
  32.  
  33.     def pages(self):  # Проверяем количество страниц в запросе
  34.         if self.success is not None:  # Выясняем, был ли запрос успешным
  35.             try:
  36.                 self.page = max(map(int, self.success.xpath('//li[@class=" js_page"]/@data-num')))
  37.             except ValueError:  # Находим на сайте наибольший номер страницы, а если страниц не обнаружено,
  38.                 self.page = 1   # то только одна страница
  39.  
  40.     def output(self):  # Вывод в документ и консоль
  41.         if self.success is not None:  # Проверка успешности запроса
  42.             document = open('Result %s.txt' % self.product, 'w')  # Открываем файл для записи и формируем заголовок
  43.             document.write(('%-100s\t%s\n' % ('Name', 'Price [rub]') + '=' * 120 + '\n'))
  44.             if '/product/' in self.url:  # Если в адресе содержится product, то запрос точный, в выводе только один товар
  45.                 res1 = self.success.xpath('//body/div[6]/div[2]/div/div/div/div/h1/text()')[0].strip('\t\n')
  46.                 res2 = self.success.xpath('//body/div[6]/div[3]/div[3]/div/div[2]/div/div[1]/text()')[0]
  47.                 document.write(('%-100s\t%s\n' % (res1, res2)).encode('cp1251'))
  48.                 print res1, res2
  49.             else:  # Если адрес без product, то несколько позиций товара
  50.                 for num in xrange(1, self.page + 1):  # Проход по всем страницам
  51.                     respond = requests.get(self.market + 'search/', params={'find': self.product, 'page': num})
  52.                     parsed = html.fromstring(respond.text)  # Запросы по страницам
  53.                     result = zip(parsed.xpath('//span[@class="hidden js_ectrack"]/@data-name'),  # Извлечение результатов
  54.                                  parsed.xpath('//span[@class="hidden js_ectrack"]/@data-price'))
  55.                     for y in result:  # И их вывод
  56.                         document.write(('%-100s\t%s\n' % (y[0], y[1])).encode('cp1251'))
  57.                         print y[0], y[1]
  58.             document.close()
  59.  
  60.     def doit(self):  # Очередность. Запускает поиск, который отменяется командой exit
  61.         while True:
  62.             self.start()
  63.             if self.product != 'exit':
  64.                 self.found()
  65.                 self.pages()
  66.                 self.output()
  67.                 self.product = ''
  68.             else:
  69.                 break
  70.  
  71.  
  72. if __name__ == '__main__':
  73.     first = Searcher('redmond')
  74.     first.doit()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement