《LinuxShell脚本攻略》笔记,Chap-5: 一团乱麻?没这回事
入门
本章会研究一些用于解析网站内容、下载数据、发送数据表单以及网站颇为任务自动化之类的实例。我们可以仅用几行脚本就将很多原本需要通过浏览器交互进行的活动管理自动化。通过命令行工具利用HTTP协议所提供的功能,我们可以用脚本解决大部分Web自动化的问题。
网站下载
使用一些命令行下载工具,从给定的URL中下载文件或网页。
wget是一个用于文件下载的命令行工具,选项多且用法灵活。
#Wget - The non-interactive(非交互式) network downloader
wget URL1 URL2...
wget http://xxx.com/nginx-1.12.0.tag.gz
wget https://xxx/a.rpm http://xxxx/bb.rpm
#指定文件名,指定信息输出(wget默认是stdout)
wget http://mirrors.aliyun.com/repo/Centos-7.repo -O aliyun.repo -o ./wget.log
wget URL -t 5 #-t,重试次数
#下载限速
wget --limit-rate=10m URL #下载限速
wget -Q 100m URL #指定下载配额
#端点续传
#wget进行的下载在完成前被中断,从断点开始下载
wget -c URL
#用cURL下载
#cURL是一个比wget更强大的高级命令工具
#和wget不同,curl并不将下载数据写入文件,而是写入stdout,因此必须重定向到文件
#复制或镜像整个网站
#wget有一个选项可以使其像爬虫一样以递归方式手机网页上所有URL链接,并逐个下载
#这样一来就可以下载一个网站的所有页面
wget --mirror URL
#-m(--mirror) -N -r -l inf --no-remove-listing 的缩写形式。
或 wget -r -N -l DEPTH URL
#-r递归下载,-l指定递归深度,-N(timestamp)只获取比本地时间新的文件
#访问需要认证的HTTP或FTP页面
wget --user "username" --password "pass" URL
#如未在命令行内输入密码,则会由网页提示手动输入
以格式化纯文本下载网页
网页其实就是包含HTML标记和其他诸如Javascript,CSS等元素的HTML页面。HTML标记是网页的基础,也许需要解析网页来查找特定的内容。
links,是一个基于命令行的Web浏览器
#links - lynx-like alternative character mode WWW browser
#在命令行中浏览一个网页
links www.baidu.com
#以ASCII形式下载网页
links --dump URL > URL.txt
#打开本地html文件
links 1.html
cURL入门
cURL支持包括HTTP、HTTPS、FTP在内的众多协议。它还支持POST、cookie、认证、从指定偏移处下载部分文件、参照页(referer)、用户代理字符串、扩展头部(extra header)、限速、文件大小限制、进度条等特性。
#curl - transfer a URL
#cURL通常将下载文件输出到stdout,将进度信息输出到stderr
#要想避免显示进度信息,可使用--silent
#curl可用来下载、发送各种HTTP请求、指定HTTP头部等操作
curl URL --silent #输出到stdout
#-O写入文件,文件名从URL中解析
curl http://www.baidu.com/index.html -O --silent #创建index.html
#-o将数据写入指定文件
curl URL -o baidu.html --progress #--progress显示进度条
links baidu.html
#端点续传
#和wget不同,cURL包含更高级的下载恢复特性,能够从特定的文件偏移处继续下载
#curl可以通过指定一个偏移量来下载部分文件
手动:curl URL/file -C offset #偏移量以Byte为单位的整数
自动:curl -C -URL #自动续传
#用cURL设置参照页字符串, --referer
#参照页(referer)是位于HTTP头部中的一个字符串,用来标识用户从哪个页面到达当前页面的
#如果用户点击网页A中某个链接,转到了网页B。那么网页B头部的referer会包含网页A的URL
curl --referer Referer_URL target_URL
curl --referer http://www.baidu.com http://jianshu.com
#用cURL设置cookie, --cookie
#可以用curl来存储HTTP操作过程中使用到的cookie
#cookie用key=value形式,指定多个用 分号 分隔
curl URL --cookie "user=AAA;name=bbb"
curl URL --cookie-jar cookie.txt #将cookie另存为
#用cURL设置用户代理字符串, --user-agent
#如果不指定代理,一些需要用户代理的网页就无法显示
curl URL --user-agent(-A) "Mozilla"
#用-H "头部信息"传递多个头部信息
curl -H "Host:www.haha.com" -H "Accept-language: en" URL
#限定cURL可占用的带宽
curl URL --limit-rate 10m
#指定最大下载量
curl URL --max-filesize 大小(Bytes)
#用cURL进行认证,-u username:password指定用户名和密码
curl -u user:pass URL
curl -u user URL #手动输入密码
#只打印响应头部信息(无数据部分), -I
curl -I URL
从命令行访问163邮箱
curl -u user http://mail.163.com
#手动输入密码
制作图片抓取器及下载工具
可以用脚本解析图像文件并将图片自动下载下来。
curl -s URL | grep -o "<img src=[^>]*>" | sed 's/<img src=//g; s/>//g' > img.list
#匹配图片的URL,可能还需要细化修改
#不同的URL可能有不同的规则,根据实际情况取出img的URL
#下载图片
wget $URL 或 curl -s -O $URL
查找网站中的无效链接
将查找无效链接的工作自动化,那就比纯手动厉害多了!
lynx -traversal URL #会将URL中所有链接生成到reject.dat文件中
sort -u reject.dat | while read link
do
output=`curl -I $link -s | grep "HTTP/.*OK"`
if [[ -z $output ]]
then
echo $link
fi
done < links.txt
跟踪网站变更
可以编写一个定期运行的变更跟踪器(change tracker),一旦发生变更,跟踪器便会发出声音或发送提示信息。
在不同时间检索网站,然后利用 diff
命令进行比对。
curl URL --silent -o `date +%F`.html #第一次
curl URL --silent -o `date +%F`.html #第二次
diff -u 第一次 第二次
以POST方式发送网页并读取响应
POST 和 GET 是HTTP协议中用于发送或检索信息的两种请求类型。
在GET请求方式中,利用网页的URL来发送参数(“键-值”);而POST方式用于提交表单,如提交用户名、密码以及检索登录页面等。
curl URL -d “postarg=AABBCC” #-d,http post data
curl URL -d "post1=key1&post2=key2&post3..." #指定多个数据
wget URL -post-data "post1=key1"
网友评论