[2014年6月3日更新]
这两天突然对bash感兴趣了,写了个抓取学校内网通知的小脚本,就当学习吧。两个脚本,一个是内网抓取网页,另外一个是服务器上更新的。
脚本一,本地内网执行:get.sh
#!/bin/bash #定义抓取链接及目录 dir="news/" url="http://192.168.1.102/news/liulan2.aspx" #创建文件夹 if [ ! -d $dir ];then mkdir $dir lastid='1' fi #获取上次更新id len=`echo ${#dir}` lastid=`find $dir | sort | tail -1 | sed 's/.txt//g'` lastid=`echo ${lastid:$len}` #抓取新闻列表,获取最后更新的id id=`curl $url | grep liulan1.aspx?newsid= | head -n 1 | sed 's/<a href=liulan1.aspx?newsid=//g' | sed 's/ target=_blank>//g' | sed 's/t//g' | sed 's/r//g'` #抓取页面 for (( i = $id ; i > $lastid ; i --)) do filename=$dir$i".htm" #如果文件不存在,则抓取为文件,将文件转码,方便linux下处理 if [ ! -f $filename ];then curl "http://192.168.1.102/news/liulan1.aspx?newsid="$i | iconv -c -f gbk -t utf8 | sed "s/charset=gb2312/charset=UTF-8/g" > $filename else echo $filename" exist,skip!" fi #删除不存在的新闻 error=`cat $filename | grep 'web.config'` if [ !$error ];then #如果新闻存在,则上传至服务器 scp $filename root@***.***.***:/xxnw/news/ else rm $filename echo "del unexisted file!" fi done #远程执行更新 ssh root@***.***.*** "/xxnw/addnews.sh"
脚本二,服务器上运行:addnews.sh
#/bin/bash dir="/xxnw/news/" if [ ! -d $dir ];then echo '没有那个文件夹!' exit fi for file in `ls $dir | grep 'htm'` do filenum=${file%.*} newfile1=$dir$filenum".sql" newfile2=$dir$filenum".txt" if [ ! -f $newfile2 ];then url="http://192.168.1.102/news/liulan1.aspx?newsid="$filenum echo "INSERT INTO `news_article` (`news_id`,`news_web`,`news_type`,`news_url`,`news_title`,`news_post`,`news_posttime`,`news_content`) VALUES("","学校内网","校园新闻","$url","" | iconv -f gbk -t utf8 > $newfile2 cat $dir$file | head -35 | sed "s/<[^>]+>//g;s/ $//g;s/ //g;s/^[ t]*//g;s/[ t]*$//g;" | sed '2,30d' | sed '3,5d' | sed '4,6d' | sed -e '/^$/d' | sed -e '1a","' | sed '3a","' | sed '5a","' >> $newfile2 tail -n +39 $dir$file | sed "s/<[^>]+>//g;s/ $//g;s/ //g" | tr 'n' ' ' | sed 's/^[ t]*//g;s/[ t]*$//g' | sed 's/"/\"/g' >> $newfile2 echo "");" >> $newfile2 cat $newfile2 | tr -d 'n' > $newfile1 tail -n +39 $dir$file | sed -e '$d' | sed -e '$d' | sed -e '$d' | sed -e '$d' > $newfile2 echo $file mysql -uroot -ppassword dbname < $newfile1 rm $newfile1 fi done
一下子就把从2008年以来的800多条通知全部抓下来了,呵呵!没网络权限,不然直接拖库了。
脚本还有些小问题,回头再研究。
续:现在基本上完善了,我只需在局域网的linux笔记本上运行一下:./get.sh,服务器上的数据就更新了,太方便了^-^
既然是抓取,为什么不用 python 或者 node 呢,总感觉 bash 太弱了点啊。或者直接 PHP 也行啊
bash足够了,简单。