def main(): print('\n-- Парсинг афиши Тетра оперы и балета - ' + str(datetime.datetime.now())) opera = Grab(document_charset='utf-8', timeout=20, connect_timeout=20) opera.go('http://komiopera.ru/index.php?option=com_content&view=article&id=95&Itemid=134') #opera.response.body = clean_text(opera.response.body, 'normal') dates = opera.doc.select('//table//table//tr/td[1]/div/b') titles = opera.doc.select('//table//table//tr/td[2]/div/b') contents1 = opera.doc.select('//table//table//tr/td[2]/div/i') contents2 = opera.doc.select('//table//table//tr/td[3]/div/b') times = opera.doc.select('//table//table//tr/td[3]/div') date_for_db = data_change(dates[0].text(), 'komiopera') exist_date_event = last_date_event('komiopera', date_for_db) for date, title, content1, content2, time in zip(dates, titles,contents1, contents2, times): if exist_date_event.count(data_change(date.text(), 'komiopera')): print(data_change(date.text(), 'komiopera') + ' уже есть') else: event = { 'name': title.text().strip(), 'date': data_change(date.text(), 'komiopera'), 'time': time.text()[-5:], 'type_event': 'teatr', 'type_film': '', 'price': 0, 'source_id': 6, #коми опера 'description': content1.text().strip() + ', ' + content2.text().strip(), 'poster': '' } write_event_to_db(event)
def main(): print('\n-- Парсинг афиши Рублика - ' + str(datetime.datetime.now())) rub = Grab(timeout=20, connect_timeout=20) date_now = datetime.date.today() exist_date_event = last_date_event('rublic', date_now.strftime("%Y-%m-%d")) #выгружаем последни даты из базы for i in range(14): #перебираем даты event = {} delta = datetime.timedelta(days=i) next_date = (date_now + delta) if exist_date_event.count(next_date.strftime("%Y-%m-%d")): print(next_date.strftime("%Y-%m-%d") + ' уже есть') else: #http://rubliongroup.ru/include/schedule.php?AJAX_SCHEDULE=Y&SES=06-05-2015&THEATRE_ID=5345 next_link = 'http://rubliongroup.ru/include/schedule.php?AJAX_SCHEDULE=Y&SES=' + next_date.strftime("%m-%d-%Y") + '&THEATRE_ID=5345'#формируем ссылку rub.go(next_link) allpage = rub.doc.select('//div').html() allpage = pur.feed(clean_text(allpage, 'normal')) if allpage.find('Расписание готовится') == -1: names = rub.doc.select('//table//table//tr/td[@class="name"]') times = rub.doc.select('//table//table//tr/td[@class="time"]') prices = rub.doc.select('//table//table//tr/td[@class="price"]') for time, name, price in zip(times, names, prices): type_film = None if name.text().find('3D') != -1: type_film = '3D' name = name.text()[:name.text().find('(')].strip() price = clean_text(price.text(),'normal').replace('/','').strip() event = { 'name': name, 'date': next_date.strftime("%Y-%m-%d"), 'time': time.text(), 'type_event': 'film', 'type_film': str(type_film), 'price': price, 'source_id': 1, #рублик 'description': '', 'poster': '' } print(next_link) write_event_to_db(event)
def main(): filename = 'raduga.csv' f = open(filename, "r", encoding="cp1251") lines = f.readlines() for line in lines: if not line.find("#") > -1: # извлекаем данные из строки file_name, file_type, file_date, file_time, file_price = unpack_line( line) #определяем дату начала показа и разницу между началом и концом startdate = file_date.split('-')[0].strip().split('.') enddate = file_date.split('-')[1].strip().split('.') count_day = int(enddate[0]) - int(startdate[0]) startdate = datetime.date(int(startdate[2]), int(startdate[1]), int(startdate[0])) exist_date_event = last_date_event( 'raduga', startdate.strftime( "%Y-%m-%d")) #выгружаем последни даты из базы for day in range(count_day + 1): event = {} delta = datetime.timedelta(days=day) next_date = (startdate + delta) if exist_date_event.count(next_date.strftime("%Y-%m-%d")): print(next_date.strftime("%Y-%m-%d") + ' уже есть') else: if file_type == '': file_type = '2D' event = { 'name': file_name, 'date': next_date.strftime("%Y-%m-%d"), 'time': file_time, 'type_event': 'film', 'type_film': file_type, 'price': int(file_price), 'source_id': 4 #радуга } write_event_to_db(event) f.close() os.remove(filename) #удаляем файлик
def main(): filename = 'autofilm.csv' f = open(filename, "r", encoding="cp1251") lines = f.readlines() for i, line in enumerate(lines): if not line.find("#") > -1: # извлекаем данные из строки file_name, file_type, file_date, file_time, file_price = unpack_line( line) #определяем дату начала показа и разницу между началом и концом date = file_date.strip().split('.') date = datetime.date(int(date[2]), int(date[1]), int(date[0])) if i == 1: #функцию вызываем только один раз exist_date_event = last_date_event( 'autofilm', date.strftime( "%Y-%m-%d")) #выгружаем последни даты из базы event = {} if exist_date_event.count(date.strftime("%Y-%m-%d")): print(date.strftime("%Y-%m-%d") + ' уже есть') else: if file_type == '': file_type = '2D' event = { 'name': file_name, 'date': date.strftime("%Y-%m-%d"), 'time': file_time, 'type_event': 'film', 'type_film': file_type, 'price': int(file_price), 'source_id': 6 #автокинотеа } write_event_to_db(event) f.close() os.remove(filename) #удаляем файлик
def main(): print('\n-- Парсинг афиши Кронверк синема Макси - ' + str(datetime.datetime.now())) maxi = Grab(timeout=20, connect_timeout=20) date_now = datetime.date.today() exist_date_event = last_date_event( 'maxi', date_now.strftime("%Y-%m-%d")) #выгружаем последни даты из базы for i in range(3): #перебираем даты - 6 дней, больше на киноходе нет event = {} delta = datetime.timedelta(days=i) next_date = (date_now + delta) if exist_date_event.count(next_date.strftime("%Y-%m-%d")): print(next_date.strftime("%Y-%m-%d") + ' уже есть') else: next_link = 'http://kinohod.ru/syktyvkar/cinema/508/?date=' + next_date.strftime( "%Y-%m-%d") #формируем ссылку maxi.go(next_link) count = maxi.doc.select('//div[@class="mblock"]') for x in range(len(count)): name = maxi.doc.select('//div[@class="mblock"][' + str(x + 1) + ']//h1[@class="lnk"]') countli = maxi.doc.select('//div[@class="mblock"][' + str(x + 1) + ']//ul/li') for i in range(len(countli)): times = maxi.doc.select('//div[@class="mblock"][' + str(x + 1) + ']//ul/li[' + str(i + 1) + ']//h1') type_films = maxi.doc.select('//div[@class="mblock"][' + str(x + 1) + ']//ul/li[' + str(i + 1) + ']//div[@class="first"]') price_films = maxi.doc.select('//div[@class="mblock"][' + str(x + 1) + ']//ul/li[' + str(i + 1) + ']//div[@class="second"]') if not type_films.text(): type_films = '(NULL)' else: type_films = type_films.text().strip() price_films = int(price_films.text().replace('р.', '').strip()) event = { 'name': name.text(), 'date': next_date.strftime("%Y-%m-%d"), 'time': times.text(), 'type_event': 'film', 'type_film': type_films, 'price': price_films, 'source_id': 2, #кронверк синема макси 'description': '', 'poster': '' } print(next_link) write_event_to_db(event)
def main(): print('\n-- Парсинг афиши Драмтеатра - ' + str(datetime.now())) month = { 'января': '01', 'февраля': '02', 'марта': '03', 'апреля': '04', 'мая': '05', 'июня': '06', 'июля': '07', 'августа': '08', 'сентября': '09', 'октября': '10', 'ноября': '11', 'декабря': '12' } drama = Grab(timeout=20, connect_timeout=20) drama.go('http://quicktickets.ru/teatr-dramy-viktora-savina') titles = drama.doc.select( '//div[@id="events-list"]//div[@class="item"]//div[@class="c"]/h3') descriptions = drama.doc.select( '//div[@id="events-list"]//div[@class="item"]//div[@class="c"]/div[@class="d"]' ) seanses = drama.doc.select( '//div[@id="events-list"]//div[@class="item"]//div[@class="c"]/div[@class="row sessions sessions-near"]' ) now_month = date.today().month now_year = date.today().year next_year = now_year + 1 #вычисляем первую дату для выборки из базы - проверка на уже загруженные даты start_date = drama.doc.select( '//div[@id="events-list"]//div[@class="item"]//div[@class="c"]/div[@class="row sessions sessions-near"]//a' ).text() start_date = start_date.replace(',', '').split(' ') if now_month in (10, 11, 12) and int(month[start_date[1]]) in (1, 2): start_date = date(next_year, int(month[start_date[1]]), int(start_date[0])) else: start_date = date(now_year, int(month[start_date[1]]), int(start_date[0])) exist_date_event = last_date_event('dramakomi', start_date) #отрабатываем события for title, desc, seans in zip(titles, descriptions, seanses): for date_time in seans.select('.//a'): date_time = date_time.text().replace(',', '').split(' ') time = date_time[2] if now_month in (10, 11, 12) and int( month[date_time[1]]) in (1, 2): date_time = date(next_year, int(month[date_time[1]]), int(date_time[0])) else: date_time = date(now_year, int(month[date_time[1]]), int(date_time[0])) if exist_date_event.count(date_time.strftime("%Y-%m-%d")): print(date_time.strftime("%Y-%m-%d") + ' уже есть') else: event = { 'name': title.text(), 'date': date_time.strftime("%Y-%m-%d"), 'time': time, 'type_event': 'teatr', 'type_film': '', 'price': 0, 'source_id': 5, #драмтеатр 'description': desc.text(), 'poster': '' } write_event_to_db(event)
def task_page(self, grab, task): print(task.url) #task.event['title'] titles = grab.doc.select( '//ul[@id="afisha"]/li/p/span[@class="title"]') dates_event = grab.doc.select( '//ul[@id="afisha"]/li/p/span[@class="date"]') images = grab.doc.select('//ul[@id="afisha"]/li/img') contents = grab.doc.select('//ul[@id="afisha"]/li/a') for title, date_event, img, content in zip(titles, dates_event, images, contents): title = clean_text(title.text(), 'normal') try: month_test = clean_text(date_event.text(), 'normal').split(' ')[1] month_test = month_list[month_test] except: month_test = False date = clean_text(date_event.text(), 'normal')[:-6] time = clean_text(date_event.text(), 'normal')[-5:].replace('.', ':') content = clean_text(content.text(), 'normal') year = task.url.split('/')[-3] date = date.split(' ')[0].split('-') try: int(date[0]) integ = True except: integ = False if integ and month_test: startdata = datetime.date(int(year), int(month_test), int(date[0])) if img.attr('src'): path_to_img_folder = create_img_folder( date=startdata.strftime("%Y-%m-%d"), type='event') img_name = md5( img.attr('src').split("/")[-1].encode( 'utf-8')).hexdigest()[:15] + '.' + img.attr( 'src').split(".")[-1].lower() new_link_to_img = path_to_img_folder + '/' + img_name if not os.path.exists(new_link_to_img): fix_link = urllib.parse.quote(img.attr('src')) yield Task('image', url=fix_link, priority=task.priority, path=path_to_img_folder, name_img=img_name) if exist_date_event.count(startdata.strftime("%Y-%m-%d")): print(startdata.strftime("%Y-%m-%d") + ' уже есть') else: if len(date) == 2: for i in range(int(date[1]) - int(date[0]) + 1): startdata = datetime.date(int(year), int(month_test), int(date[0]) + i) event = { 'name': title, 'date': startdata.strftime("%Y-%m-%d"), 'time': time, 'type_event': 'koncert', 'type_film': '', 'price': 0, 'source_id': 7, #филармония 'description': content, 'poster': new_link_to_img[new_link_to_img.find('/media/' ) + 7:] } write_event_to_db(event) else: startdata = datetime.date(int(year), int(month_test), int(date[0])) event = { 'name': title, 'date': startdata.strftime("%Y-%m-%d"), 'time': time, 'type_event': 'koncert', 'type_film': '', 'price': 0, 'source_id': 7, #филармония 'description': content, 'poster': new_link_to_img[new_link_to_img.find('/media/') + 7:] } write_event_to_db(event)
def main(): print('\n-- Парсинг афиши Мори синема - Июнь - ' + str(datetime.datetime.now())) mori = Grab(timeout=20, connect_timeout=20) ticket = Grab(timeout=20, connect_timeout=20) #берем данные только с дней с точной датой, либо корректируемся под проверку - какой день - его за основу и вперед date_now = datetime.date.today() exist_date_event = last_date_event( 'mori', date_now.strftime("%Y-%m-%d")) #выгружаем последни даты из базы mori.go('http://www.mori-cinema.ru/cinema_detail/4768_syktyvkar/') #ебучие верстальщики сайта сломали дом дерево - приходится изъебываться mori.response.body = mori.response.body.replace(b'</div> */ --!>', b'*/ --></div>') count_day = mori.doc.select( '//div[@class="dDatas width"]/div[@class="tbl_timetable hidden"]//table' ) #считаем количесво вкладок с сеансами, вкладка - день, начинаем со второй вкладки, либо с раннего утра сегодняшней влкадки #проверяем, что даты верно указаны, начиная с третьей таблицы указана дата - с ней и сверяемся if (date_now + datetime.timedelta(days=2) ).strftime("%d.%m.%Y") == mori.doc.select( '//div[@class="dDatas width"]/div[@class="tbl_timetable hidden"]//table[1]//th' ).text(): for day in range(len(count_day)): event = {} delta = datetime.timedelta(days=day + 2) #дата на два дня вперед next_date = (date_now + delta) if exist_date_event.count(next_date.strftime("%Y-%m-%d")): print(next_date.strftime("%Y-%m-%d") + ' уже есть') else: #определяем количество фильмов в дне print('Текущая дата ' + str(next_date)) count_films = mori.doc.select( '//div[@class="dDatas width"]/div[@class="tbl_timetable hidden"]//table[' + str(day + 1) + ']//tr') temp_name = '' for film in range(len(count_films) - 2): #проврка на пустые строки без информации о фильмах try: mori.doc.select( '//div[@class="dDatas width"]/div[@class="tbl_timetable hidden"]//table[' + str(day + 1) + ']//tr[' + str(film + 3) + ']/td').text() next = True except: next = False if next: name = mori.doc.select( '//div[@class="dDatas width"]/div[@class="tbl_timetable hidden"]//table[' + str(day + 1) + ']//tr[' + str(film + 3) + ']/td[@rowspan]') #проверка на фильмы с двойными стркоами. у фильма два вида - 2д и 3д, во второй строке нет названия correct = 0 try: rowattr = name.attr('rowspan') name = name.text() if rowattr == '2': temp_name = name except: rowattr = '77' correct = 1 name = temp_name print(name) type_film = mori.doc.select( '//div[@class="dDatas width"]/div[@class="tbl_timetable hidden"]//table[' + str(day + 1) + ']//tr[' + str(film + 3) + ']/td[' + str(2 - correct) + ']') times = mori.doc.select( '//div[@class="dDatas width"]/div[@class="tbl_timetable hidden"]//table[' + str(day + 1) + ']//tr[' + str(film + 3) + ']/td[' + str(3 - correct) + ']/a') for time in times: #вычленяем из ссылки атрибут для передачи в кассу рамблера для поиска ценника argument = time.attr( 'href')[time.attr('href').rfind(',') + 1:time.attr('href').rfind(');')] #делаем запрос к кассе и узнаем цену на конкретный сеанс ticket.go( 'https://widget.kassa.rambler.ru/place/hallplanajax/xxxxxxxxxx?widgetid=19484&clusterradius=61' .replace('xxxxxxxxxx', argument)) check = ticket.doc.select('//div').text() if check.count('нельзя') > 0: price = 0 else: price = ticket.doc.select( '//ul[@class="seats-icon-details"]/li[1]/span' ).text() price = int(price[price.rfind('(') + 1:price.rfind('руб') - 1]) event = { 'name': name, 'date': next_date.strftime("%Y-%m-%d"), 'time': time.text(), 'type_event': 'film', 'type_film': type_film.text(), 'price': price, 'source_id': 3, #Кинотеатр MORI CINEMA Сыктывкар 'description': '', 'poster': '' } write_event_to_db(event)