Массовое получение части исходного кода HTML с использованием сценариев оболочки

361
NoName

С этой страницы радиопередачи http://www.ellinofreneianet.gr/sounds.php?s=0&p=10&o=l Я хочу загрузить все записанные передачи.

Это все страницы этого типа http://www.ellinofreneianet.gr/sound.php?id=7101,
и я хочу извлечь из всех этих 7 тысяч страниц строку 422 исходного кода, где находится ссылка для скачивания.
Этого также можно добиться, не захватывая строки, также работает регулярное выражение ". = Podcast /. ".

Как получить строку 422 каждой страницы этого типа ИЛИ получить часть "= podcast / ****. Mp3", используя сценарии / команды оболочки?

0
Так в чем же вопрос? hayavuk 10 лет назад 2
Я отредактировал это для лучшего понимания NoName 10 лет назад 0

1 ответ на вопрос

0
Volker Siegel

Something like this?

for i in ; do wget -q -O - http://www.ellinofreneianet.gr/sound.php\?id\=$i | grep ".=podcast/." ; done 

The wget options are -q quiet, show no progress etc, and -O - write output to stdout.

Not every page has a mp3 link there; Some even ones show a page which could be the 404 error page. The pages starting from 0 also seem empty.

The empty pages have URLs ending in podcast/", so we can exclude them with matching strings which don't have a " there:

... | grep ".=podcast/[^\"]" 

To get only the .mp3 urls, use

... | grep -o 'bitsnbytesplayer.php.*\.mp3' 

You found out yourself how to output the page URL before each mp3 URL. Here's an optimiset variant of that, using only one HTTP request per page:

for i in ; do \ wget -q -O - http://www.ellinofreneianet.gr/sound.php\?id\=$i | \ grep -o 'bitsnbytesplayer.php.*\.mp3' && \ echo http://www.ellinofreneianet.gr/sound.php\?id\=$i ; done | sed -n 'h;n;p;g;p' 

The && echo ... prints the URL if the grep before found an mp3 url. The sed command switches the order of the line pairs.

Я получаю "синтаксическую ошибку рядом с неожиданным токеном" wget "" Извините, но у меня нет опыта работы с Linux. NoName 10 лет назад 0
Ой, извините, я виноват, я использую `zsh`, вы, вероятно, используете` bash` - я его поменяю. Volker Siegel 10 лет назад 0
Можно ли во втором случае напечатать также URL-адрес? Например, http://www.ellinofreneianet.gr/sound.php?id=7101 bitsnbytesplayer.php? ш = 728 & ч = 30 & s = 1 & е = подкаста / 209TRITi.mp3` NoName 10 лет назад 0
Какой второй случай? Последняя строка не работает? Volker Siegel 10 лет назад 0
Во втором случае я имею в виду «Чтобы получить только URL-адреса .mp3, используйте». Это работает, но я хочу, чтобы это была одна строка URL, с которой была захвачена ссылка mp3, а вторая строка - ссылка mp3. NoName 10 лет назад 0
Я нашел, как это сделать, `для меня в ; do wget -q -O - http://www.ellinofreneianet.gr/sound.php\?id\=$i | grep -o -q 'bitsnbytesplayer.php. * \. mp3' && echo http://www.ellinofreneianet.gr/sound.php\?id\=$i; wget -q -O - http://www.ellinofreneianet.gr/sound.php\?id\=$i | grep -o 'bitsnbytesplayer.php. * \. mp3'; done` Спасибо за ответ мой друг. NoName 10 лет назад 0
Ницца! Это можно упростить до `for i в ; do wget -q -O - http://www.ellinofreneianet.gr/sound.php\?id\=$i | grep -o 'bitsnbytesplayer.php. * \. mp3' && echo http://www.ellinofreneianet.gr/sound.php\?id\=$i; готово, если вы можете согласиться с тем, что mp3-URL стоит первым. Volker Siegel 10 лет назад 0
Ха, мы можем переключить линии назад, чтобы mp3 снова занял второе место. Имейте в виду, мы сохраняем 7000 HTTP-запросов с этим. :) Я добавлю к ответу. Volker Siegel 10 лет назад 0