示例#1
0
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)
示例#2
0
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)
示例#3
0
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)  #удаляем файлик
示例#4
0
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)  #удаляем файлик
示例#5
0
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)
示例#6
0
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)
示例#7
0
    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)
示例#8
0
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)