Shell 命令行实现将一个站点页面全部下载到本地并替换其中链接的脚本
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 '--链接处理完成--'
实现原理
- 先下载列表首页。我这里只是尝试,所以只下载了第一页。如果要下载多页,做好循环之后,自动下载就是。
- 截取页面的列表内容区域。
- 根据页面特点,拆解出页面链接。
- 循环下载链接并保存。
- 批量替换页面的链接不合适的地方。
然后就大功告成了。
不过 wget 比 curl 可能更适合干这个工作。我目前还没有学到很深入。回头有时间再接着研究一下。
后续补充
看了下 wget 我气炸了。原来我要下载人家网站全站,用 wget 一句命令就可以搞定了 -_-|||
wget --mirror -p --convert-links -P ./ http://man.linuxde.net/
神奇的 shell !
以上脚本均在 mac 下测试通过,在 Linux 下可能会有稍许不同。
本文由 FungLeo 原创,允许转载,但转载必须保留首发链接。
Shell 命令行实现将一个站点页面全部下载到本地并替换其中链接的脚本的更多相关文章
- Shell 命令行批量处理图片文件名
Shell 命令行批量处理图片文件名 从网上下载了一堆图片,有的是*.jpg的,有的是*.jpeg的.并且文件名有长有短,很是糟心.因此,我想把这些文件给全部整理好,当然是用shell来处理啦! 说干 ...
- Shell 命令行统计 apache 网站日志访问IP以及IP归属地
Shell 命令行统计 apache 网站日志访问IP以及IP归属地 我的一个站点用 apache 服务跑着,积攒了很多的日志.我想用 shell 看看有哪些人访问过我的站点,并且他来自哪里. 因为日 ...
- 几种在shell命令行中过滤adb logcat输出的方法
我们在Android开发中总能看到程序的log日志内容充满了屏幕,而真正对开发者有意义的信息被淹没在洪流之中,让开发者无所适从,严重影响开发效率.本文就具体介绍几种在shell命令行中过滤adblog ...
- 自学Linux Shell2.1-进入shell命令行
点击返回 自学Linux命令行与Shell脚本之路 2.1-进入shell命令行 进入文本命令行界面(CLI)两种方法: 控制台终端 图形化终端 1. 通过Linux控制台终端访问CLI 按下Ctrl ...
- Hadoop HDFS的shell(命令行客户端)操作实例
HDFS的shell(命令行客户端)操作实例 3.2 常用命令参数介绍 -help 功能:输出这个命令参数手册 -ls 功能:显示目录信息 示例: hadoop fs ...
- Shell 命令行,写一个自动整理 ~/Downloads/ 文件夹下文件的脚本
Shell 命令行,写一个自动整理 ~/Downloads/ 文件夹下文件的脚本 在 mac 或者 linux 系统中,我们的浏览器或者其他下载软件下载的文件全部都下载再 ~/Downloads/ 文 ...
- HDFS shell命令行常见操作
hadoop学习及实践笔记—— HDFS shell命令行常见操作 附:HDFS shell guide文档地址 http://hadoop.apache.org/docs/r2.5.2/hadoop ...
- Shell 命令行,实现对若干网站状态批量查询是否正常的脚本
Shell 命令行,实现对若干网站状态批量查询是否正常的脚本 如果你有比较多的网站,这些网站的运行状态是否正常则是一件需要关心的事情.但是逐一打开检查那简直是一件太糟心的事情了.所以,我想写一个 sh ...
- Shell 命令行 从日志文件中根据将符合内容的日志输出到另一个文件
Shell 命令行 从日志文件中根据将符合内容的日志输出到另一个文件 前面我写了一篇博文Shell 从日志文件中选择时间段内的日志输出到另一个文件,利用循环实现了我想要实现的内容. 但是用这个脚本的同 ...
随机推荐
- WCF基本知识
1.开通WCF调试服务: 须在服务端的行为中作如下配置:includeExceptionDetailInFaults="true" 代码如下: <behaviors> ...
- 20145301Java课程总结
20145301 Java课程总结 每周读书笔记链接汇总 第一周读书笔记: http://www.cnblogs.com/5301z/p/5248888.html 第二周读书笔记: http://ww ...
- 20145303 实验一 Java开发环境的熟悉(Linux + Eclipse)
20145303 实验一 Java开发环境的熟悉(Linux + Eclipse) 实验题目(4):实现学生成绩管理功能,并进行测试 思路: 对于实现学生成绩管理(student performanc ...
- Kafka架构
一.Kafka介绍 Kafka是Linkin在2010年开源的分布式发布订阅消息系统,Kafka是高吞吐量的消息订阅系统. 二.Kafka结构 Kafka由三部分构成,producer.broker. ...
- 再也不学AJAX了!(三)跨域获取资源 ② - JSONP & CORS
浏览器的"同源策略"固然保障了互联网世界的数据隐私与数据安全,但是如果当我们需要使用AJAX跨域请求资源时,"同源策略"又会成为开发者的阻碍.在本文中,我们会简 ...
- Ubuntu 下安装Beyond Compare【转】
本文转载自:https://blog.csdn.net/bingyu9875/article/details/52856675 官网下载安装包:http://www.scootersoftware.c ...
- Caffe学习笔记(二):Caffe前传与反传、损失函数、调优
Caffe学习笔记(二):Caffe前传与反传.损失函数.调优 在caffe框架中,前传/反传(forward and backward)是一个网络中最重要的计算过程:损失函数(loss)是学习的驱动 ...
- LeetCode——Palindromic Substrings
Question Given a string, your task is to count how many palindromic substrings in this string. The s ...
- 【cs231n】线性分类笔记
前言 首先声明,以下内容绝大部分转自知乎智能单元,他们将官方学习笔记进行了很专业的翻译,在此我会直接copy他们翻译的笔记,有些地方会用红字写自己的笔记,本文只是作为自己的学习笔记.本文内容官网链接: ...
- js实现全选checkbox
js代码 function selectAllCheckBox(parentid) { var PID = document.getElementById(parentid); var cb = PI ...