Shell 命令行实现将一个站点页面全部下载到本地并替换其中链接的脚本

不知道为什么,我总想用 Shell 脚本来实现把一个站点内容给下载下来。但是下载什么站点我确不知道。今天尝试了一下利用 curl 实现了下载一个站点列表的 demo 算是小试牛刀。

当脚本成功之后,我知道,要把这个站点完全下载下来也是没有问题的。不过是需要更加复杂的循环和匹配而已。

接下来有工作要做,所以 shell 的学习暂时先告一段落。

实现代码

#!/bin/bash
echo '--开始下载首页--'
curl -s 'http://man.linuxde.net/par/5' > ./html/index.html
mh=./html/index.html
sl=$(nl $mh | grep '<div class="list_bd clearfix">' | head -1 | sed 's/^[    ]*//g' | cut -d ' ' -f1)
el=$(nl $mh | grep "<div class='paging'>" | head -1 | sed 's/^[  ]*//g' | cut -d ' ' -f1)
sed -n  "$sl","$el"'p' $mh > main.htm

echo '--开始下载内页--'
#<a href="
while read line; do
  url=$(echo $line | grep '<a href="' | sed 's/<div class="name"><a href="//g' | cut -d '"' -f1)
  if [[ -n $url ]]; then
    echo '--开始下载' $name '页面--'
    name=$(echo $url | cut -d '/' -f4)
    html='./html/'$name'.html'
    curl -s $url > $html
    # echo '--开始处理' $name '页面链接--'
    # sed -i 's/http:\/\/man\.linuxde\.net\//g' $html
  fi
done < main.htm

echo '--页面下载完成--'
echo '--处理页面链接--'

sed -i '' 's/http:\/\/man\.linuxde\.net\///g' $(grep -rl 'http://man.linuxde.net' ./html)
sed -i '' 's/" title="/\.html" title="/g' $(grep -rl '" title="' ./html)
echo '--链接处理完成--'

实现原理

  1. 先下载列表首页。我这里只是尝试,所以只下载了第一页。如果要下载多页,做好循环之后,自动下载就是。
  2. 截取页面的列表内容区域。
  3. 根据页面特点,拆解出页面链接。
  4. 循环下载链接并保存。
  5. 批量替换页面的链接不合适的地方。

然后就大功告成了。

不过 wgetcurl 可能更适合干这个工作。我目前还没有学到很深入。回头有时间再接着研究一下。

后续补充

看了下 wget 我气炸了。原来我要下载人家网站全站,用 wget 一句命令就可以搞定了 -_-|||

wget --mirror -p --convert-links -P ./ http://man.linuxde.net/

神奇的 shell

以上脚本均在 mac 下测试通过,在 Linux 下可能会有稍许不同。

本文由 FungLeo 原创,允许转载,但转载必须保留首发链接。

Shell 命令行实现将一个站点页面全部下载到本地并替换其中链接的脚本的更多相关文章

  1. Shell 命令行批量处理图片文件名

    Shell 命令行批量处理图片文件名 从网上下载了一堆图片,有的是*.jpg的,有的是*.jpeg的.并且文件名有长有短,很是糟心.因此,我想把这些文件给全部整理好,当然是用shell来处理啦! 说干 ...

  2. Shell 命令行统计 apache 网站日志访问IP以及IP归属地

    Shell 命令行统计 apache 网站日志访问IP以及IP归属地 我的一个站点用 apache 服务跑着,积攒了很多的日志.我想用 shell 看看有哪些人访问过我的站点,并且他来自哪里. 因为日 ...

  3. 几种在shell命令行中过滤adb logcat输出的方法

    我们在Android开发中总能看到程序的log日志内容充满了屏幕,而真正对开发者有意义的信息被淹没在洪流之中,让开发者无所适从,严重影响开发效率.本文就具体介绍几种在shell命令行中过滤adblog ...

  4. 自学Linux Shell2.1-进入shell命令行

    点击返回 自学Linux命令行与Shell脚本之路 2.1-进入shell命令行 进入文本命令行界面(CLI)两种方法: 控制台终端 图形化终端 1. 通过Linux控制台终端访问CLI 按下Ctrl ...

  5. Hadoop HDFS的shell(命令行客户端)操作实例

    HDFS的shell(命令行客户端)操作实例 3.2 常用命令参数介绍 -help 功能:输出这个命令参数手册 -ls                  功能:显示目录信息 示例: hadoop fs ...

  6. Shell 命令行,写一个自动整理 ~/Downloads/ 文件夹下文件的脚本

    Shell 命令行,写一个自动整理 ~/Downloads/ 文件夹下文件的脚本 在 mac 或者 linux 系统中,我们的浏览器或者其他下载软件下载的文件全部都下载再 ~/Downloads/ 文 ...

  7. HDFS shell命令行常见操作

    hadoop学习及实践笔记—— HDFS shell命令行常见操作 附:HDFS shell guide文档地址 http://hadoop.apache.org/docs/r2.5.2/hadoop ...

  8. Shell 命令行,实现对若干网站状态批量查询是否正常的脚本

    Shell 命令行,实现对若干网站状态批量查询是否正常的脚本 如果你有比较多的网站,这些网站的运行状态是否正常则是一件需要关心的事情.但是逐一打开检查那简直是一件太糟心的事情了.所以,我想写一个 sh ...

  9. Shell 命令行 从日志文件中根据将符合内容的日志输出到另一个文件

    Shell 命令行 从日志文件中根据将符合内容的日志输出到另一个文件 前面我写了一篇博文Shell 从日志文件中选择时间段内的日志输出到另一个文件,利用循环实现了我想要实现的内容. 但是用这个脚本的同 ...

随机推荐

  1. Jquery5 基础 DOM 和 CSS 操作

    学习要点: 1.DOM 简介 2.设置元素及内容 3.元素属性操作 4.元素样式操作 5.CSS 方法 DOM 是一种文档对象模型.方便开发者对HTML 结构元素内容进行展示和修改.在 JavaScr ...

  2. MySQL_解决ERROR 2006 (HY000) at line XX MySQL server has gone away问题

    参考:http://www.111cn.net/database/mysql/106911.htm 1.修改mysqld的配置文件my.cnf 调整max_allowed_packet的值,修改为5M ...

  3. 【bzoj2734】集合选数(有点思维的状压dp)

    题目传送门:bzoj2734 这题一个月前看的时候没什么头绪.现在一看,其实超简单. 我们对于每个在$ [1,n] $范围内的,没有因数2和3的数$ d $,将它的倍数$ 2^a 3^b d $一起处 ...

  4. 线程实现Runnable接口比继承Thread的优势

    1.适合多个相同程序代码的线程去处理同一资源,把虚拟CPU(线程)同程序的代码.数据有效分离,较好地体现了面向对象的设计思想.2.可以避免由于java单继承特性带来的局限.3.增强了程序的健壮性,代码 ...

  5. 2017 beijing icpc A - Euler theorem

    2017-09-22 21:59:43 writer:pprp HazelFan is given two positive integers a,ba,b, and he wants to calc ...

  6. harbor 管理Helm Chart包

    官方网站:https://github.com/goharbor/harbor官方用户手册:https://github.com/goharbor/harbor/blob/master/docs/us ...

  7. 配置了java环境变量后不起作用

    我的电脑上装了好几个版本的jdk,有jdk1.6.jdk1.8.但是我的环境变量是设置jdk1.6的.然而打开cmd,查看Java版本却显示的是1.8,这让我百思不得其解.后来发现了问题. 问题:在p ...

  8. mysql 索引相关问题

    mysql中key .primary key .unique key 与index区别 https://blog.csdn.net/nanamasuda/article/details/5254317 ...

  9. C++学习——C++复合类型

    1.引用 引用是为某一个变量起了另一个名字,定义方式为type &rval = val; 引用类型必须与引用的变量类型完全一致,引用后,rval和val将会被视为一个变量,只不过有两种调用方式 ...

  10. Python 的selenium使用

    一.Radio 判断radio是否已经被选中 driver.find_element_by_id().is_selected() 其返回值为bool类型,True or False 二.frame f ...