Форум русскоязычного сообщества Ubuntu


За новостями русскоязычного сообщества и Ubuntu в целом можно следить на нашей страничке в Google+

Автор Тема: Парсинг и сбор тв программ Яндекса  (Прочитано 767 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Cxms

  • Автор темы
  • Активист
  • *
  • Сообщений: 407
    • Просмотр профиля
Сделал:
Get_tv_progs.sh
Код: Bash
  1. #!/bin/bash
  2. IFS=$'\n'
  3.  
  4. # id региона (номер в ссылке на канал после "tv.yandex.ru/")
  5. # узнать нужный id можно изменив регион на tune.yandex.ru/region
  6. REG_ID=213
  7.  
  8. # Список каналов (ссылки на каналы и их номера см. на tv.yandex.ru)
  9. # номер канала см. в ссылке на канал после "channels/"
  10. CHANNELS="146
  11. 18
  12. 79
  13. 162
  14. 711
  15. 1003
  16. 743"
  17.  
  18. # Разделитель между программами каналов в файле
  19. SEP='****************************************************************************************'
  20.  
  21. # имя временного файла для обработки программ каналов на один день
  22. PROG_FILE=".tmp_programm"
  23. # имя временного файла для загрузки веб-страницы прграммы передач одного канала
  24. TMP_FILE=".tmp_web_page"
  25.  
  26. # число всех каналов
  27. ALL_CHNLS_N=$(echo "$CHANNELS" | wc -l)
  28.  
  29. # обрабатываем список дат формата ГГГГ-ММ-ДД (сегодня, +семь дней вперед)
  30. for DAY in $(for DN in {0..7}; do date -d "+$DN day" +"%F"; done); do
  31.         # счетчик номера файла программы
  32.         let PR_N+=1
  33.  
  34.         echo "Загрузка прогрммы на ${DAY}... "
  35.  
  36.         # обрабатываем список каналов
  37.         for CHANNEL in $CHANNELS; do
  38.                 # счетчик обработанных каналов
  39.                 let CH_N+=1
  40.  
  41.                 echo -e "\tКанал $CH_N из ${ALL_CHNLS_N}... "
  42.  
  43.                 # формирование ссылки на программу канала
  44.                 CHANNEL_LINK="https://tv.yandex.ru/${REG_ID}/channels/${CHANNEL}?date=${DAY}&period=all-day"
  45.  
  46.                 # загрузка веб-страницы прграммы передач одного канала
  47.                 wget -q -O - "$CHANNEL_LINK" | sed 's/></>\n</g' > "$TMP_FILE"
  48.  
  49.                 # проверка статуса завершения загрузки веб-страницы
  50.                 [ "$?" != 0 ] && { echo "Ошибка загрузки страницы $CHANNEL_LINK"; rm "$TMP_FILE"; continue; }
  51.  
  52.                 # получаем и выводим имя канала
  53.                 CHANNEL_NAME=$(grep '<h1 class="b-content__title b-content__title_page_channels">' "$TMP_FILE" \
  54.                 | grep -o ">.*<" | tr -d ">|<")
  55.                 echo -e "${SEP}\n${CHANNEL_NAME}\n" >> "$PROG_FILE"
  56.  
  57.                 # получаем и сохраняем в массив названия передач
  58.                 for PER_NAME in $(grep '<div class="tv-event__title-inner">' "$TMP_FILE" | grep -o ">.*<" | tr -d ">|<")
  59.                 do PER_NAMES_AR[N]="$PER_NAME"; let N+=1
  60.                 done
  61.  
  62.                 # получаем время передач и записываем в файл время и названия передач
  63.                 for PER_TIME in $(grep '<span class="tv-event__time-text">' "$TMP_FILE" | grep -o ">.*<" | tr -d ">|<")
  64.                 do echo -e "\t$PER_TIME\t${PER_NAMES_AR[NN]}" >> "$PROG_FILE"; let NN+=1
  65.                 done
  66.  
  67.                 # добавляем пустую строку в конец
  68.                 echo >> "$PROG_FILE"
  69.                 # удаляем временный файл
  70.                 rm "$TMP_FILE"
  71.                 # удаляем переменные и массив
  72.                 unset N NN PER_NAMES_AR
  73.         done
  74.         CH_N=0
  75.         # добавляем разделитель между программами каналов
  76.         echo "$SEP" >> "$PROG_FILE"
  77.         # Получаем дату формата: "День_недели_дд_мес.", и перемиеновываем файл программ каналов на день
  78.         DATE_R=$(date -d "$DAY" +"%A_%-e_%b")
  79.         mv "$PROG_FILE" "${PR_N}_Программа_на_${DATE_R}txt"
  80. done
  81.  
  82.  
Скрипт сохраняет программы передач списка каналов в файлах с именами:
"N_Программа_на_(день_недели)_(дд)_(мес).txt"для текущего дня +на неделю вперед.
Формат программ для каналов:
**********************************
Имя_канала1

    ЧЧ:ММ   Название передачи1
    ЧЧ:ММ   Название передачи2
     ...

**********************************
Имя_канала2

    ЧЧ:ММ   Название передачи1
    ЧЧ:ММ   Название передачи2
     ...

**********************************
Запуск:
bash Get_tv_progs.sh
Размер загружаемой веб-страницы прграммы передач для одного канала 40-50 KB.
« Последнее редактирование: 10 Январь 2016, 11:07:20 от Cxms »

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 5664
  • elementaryOS 0.4 Loki, i3wm on Debian9
    • Просмотр профиля
Re: Парсинг тв программы Яндекса
« Ответ #1 : 07 Январь 2016, 14:44:28 »
Есть специализированные программы для парсинга html|xml с синтаксисом подобным sed. Ну или python(request + lxml2)
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн Cxms

  • Автор темы
  • Активист
  • *
  • Сообщений: 407
    • Просмотр профиля
Re: Парсинг тв программы Яндекса
« Ответ #2 : 07 Январь 2016, 14:54:15 »
Я и обычный sed с трудом понимаю..  :-[ а html|xml, python вообще не знаю. :(

Оффлайн alsoijw

  • Старожил
  • *
  • Сообщений: 4073
  • Fedora 25 GNOME 3 amd64
    • Просмотр профиля
Re: Парсинг тв программы Яндекса
« Ответ #3 : 07 Январь 2016, 15:06:12 »
Cxms, пообъединять логическим или, а потом повырезать теги.
Мало видеть нам начало - надо видеть и конец. Если видишь ты создание - значит где-то есть ТВОРЕЦ
Многие жалуются: геометрия в жизни не пригодилась. Ямб от хорея им приходится отличать ежедневно?

Оффлайн Heider

  • Старожил
  • *
  • Сообщений: 1037
    • Просмотр профиля
Re: Парсинг тв программы Яндекса
« Ответ #4 : 07 Январь 2016, 15:14:25 »
Я и обычный sed с трудом понимаю..  :-[ а html|xml, python вообще не знаю. :(
Без регулярных выражений (sed, perl, pyton) задача слишком сложна. Проще протратить пару вечеров на изучение хотя бы sed, чем пытаться кромсать текст другими средствами.

Оффлайн Cxms

  • Автор темы
  • Активист
  • *
  • Сообщений: 407
    • Просмотр профиля
Re: Парсинг тв программы Яндекса
« Ответ #5 : 07 Январь 2016, 15:18:54 »
alsoijw,
Зачем логическое или? непонял.
Мне бы получить хотябы время (список), делаю по аналогии:
sed -rn 's/.*Начало_тега(.*).Конец_тега*/\1/p'но после первого совпадения выдает все подряд.

Оффлайн alsoijw

  • Старожил
  • *
  • Сообщений: 4073
  • Fedora 25 GNOME 3 amd64
    • Просмотр профиля
Re: Парсинг тв программы Яндекса
« Ответ #6 : 07 Январь 2016, 15:55:30 »
Cxms, доктор сказал в морг, значит в морг :)
sed или grep(по дефолту)  будут выдавать абзац в котором что-то найдено. По этому берём grep -o. Ключ E нужен чтобы заставить его искать по регулярке. Применяется конвеер. Что имеем? Яндекс выдаёт не только что идёт по этому каналу, но и передачи канала(дубликаты). Первый grep вырезает только программу. Именно по этому в текущем виде не выводит название канала. Его нужно выводить отдельно. И убрать поиск из второго grep. Почему логическое или? Grep "пропускает" только то что соответствует регулярке. Если искать только название, то мы потеряем время. Далее я немного правлю sed чтобы цифры не прилипали к названию передачи. Далее я удаляю теги.
Недостатки:
* не выводится название канала
(решение отдельная команда)
* несколько табуляций подряд
(замена нескольких табуляций на одну и если перед этим не идёт время, то замена на перенос строки)
Черновой вариант
Код: Bash
  1. grep -oE '<div class="b-tv-channel-schedule b-tv-channel-schedule_size_l">(.*)</div>' text | grep -oE '<h1 class="b-content__title b-content__title_page_channels">(.*)<div class="b-tv-channel-content__buttons">|<span class="tv-event__time-text">[0-9]{2}:[0-9]{2}</span>|<div class="tv-event__title"><div class="tv-event__title-inner">(.*)</div></div>' | sed 's/>/>\t/g' | sed -e :a -e 's/<[^>]*>//g;/</N;//ba'
Мало видеть нам начало - надо видеть и конец. Если видишь ты создание - значит где-то есть ТВОРЕЦ
Многие жалуются: геометрия в жизни не пригодилась. Ямб от хорея им приходится отличать ежедневно?

shura1

  • Гость
Re: Парсинг тв программы Яндекса
« Ответ #7 : 07 Январь 2016, 16:15:57 »
Молодежь  ;)

lynx -dump -width 1024 'https://tv.yandex.ru/213/channels/146?period=all-day' |
grep -A1 '\[[0-9][0-9]\][0-9][0-9]:[0-9][0-9]'  |
sed 's/^ *//; s/\[[0-9][0-9]\]//g; N; s/\n/\t/'
« Последнее редактирование: 07 Январь 2016, 21:50:18 от Jshura »

 

Страница сгенерирована за 0.082 секунд. Запросов: 24.