![使用 shell 脚本批量抓取部分 HTML 源代码](https://linux22.com/image/1423419/%E4%BD%BF%E7%94%A8%20shell%20%E8%84%9A%E6%9C%AC%E6%89%B9%E9%87%8F%E6%8A%93%E5%8F%96%E9%83%A8%E5%88%86%20HTML%20%E6%BA%90%E4%BB%A3%E7%A0%81.png)
从此页面开始,广播节目 http://www.ellinofreneianet.gr/sounds.php?s=0&p=10&o=l 我想下载所有录制的节目。
它们都是这种类型的页面http://www.ellinofreneianet.gr/sound.php?id=7101
并且我想从这 7 千页中抓取下载链接所在的源代码第 422 行。
也可以通过不抓取行来实现,正则表达式“。=播客/。“ 也有效。
如何使用 shell 脚本/命令抓取该类型的每个页面的第 422 行或获取“=podcast/****.mp3”部分?
答案1
像这样吗?
for i in {7101..7200} ; do wget -q -O - http://www.ellinofreneianet.gr/sound.php\?id\=$i | grep ".=podcast/." ; done
选项wget
包括-q
安静、不显示进度等,并将-O -
输出写入标准输出。
并非每个页面都有 mp3 链接;有些甚至显示可能是 404 错误页面。从 0 开始的页面也看起来是空的。
空页面的 URL 以 结尾podcast/"
,因此我们可以使用不带 的匹配字符串将其排除"
:
... | grep ".=podcast/[^\"]"
要仅获取.mp3
URL,请使用
... | grep -o 'bitsnbytesplayer.php.*\.mp3'
您自己发现了如何在每个 mp3 URL 之前输出页面 URL。以下是它的一个 optimiset 变体,每个页面仅使用一个 HTTP 请求:
for i in {7100..7200} ; 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'
&& echo ...
如果之前的 grep 找到 mp3 url,则打印 URL。该命令sed
会切换行对的顺序。