端午这几天休息,好好琢磨了一下用bash脚本抓取网页、mysql入库等东西,也算小有所成,把区教育局的2010年以来的4000多条最新公告和学校快讯全部抓下来(没抓图片和附件,太占地方了),并且导入到了mysql数据库中,结合php小程序,可以方便的查询了。
一、从列表页面中抓取所有新闻的链接,存储为一个列表文件
#定义列表文件链接 url="http://***.***.***/node_116" #由于列表文件分成三种情况,分别抓取 #抓取列表首页 curl $url".htm" | grep '' | sed "s/<a href="/n/g;s/" target/n/g;s/<[^>]+>//g" | grep ".htm" | head -20 | sed 's/^//xxzq/&/g' > newslist #上面的20是每页的新闻条数,以下相同 #抓取2-5页列表 for (( i = 2 ; i < 6 ; i ++)) do curl $url"_"$i".htm" | grep '' | sed "s/<a href="/n/g;s/" target=/n/g;s/<[^>]+>//g" | grep ".htm" | sed 's/^//xxzq/&/g' >> newslist done #抓取6-153页 pageid=154 for (( i = 6 ; i < $pageid ; i ++)) do curl $url"_"$i".htm" | grep '' | sed "s/<a href="/n/g;s/">/n/g;s/<[^>]+>//g" | grep ".htm" | head -20 | sed 's/^//xxzq/&/g' >> newslist done
好了,打开newslist文件看看吧,全部链接抓取完成!
二、从列表文件中读取所有链接,抓取新闻
#定义抓取到的目录及链接根目录 dir='news/' url="http://***.***.***" #建立抓取到的目录 if [ ! -d $dir ];then mkdir $dir fi #从列表文件中读取链接并抓取新闻 for i in `cat newslist` do filename=$dir2${i:25} curl $url$i > $filename done
三、生成sql文件并导入mysql数据库
#定义抓取到的页面目录 dir="news/" #读取列表文件,将抓取到的htm文件处理成sql,并导入数据库(数据库字段下面有,自己看吧) for i in `cat newslist` do url="http://***.***.***"$i filename=${i:25} filenum=${filename%.*} sql=$dir$filenum".sql" txt=$dir$filenum".txt" filename=$dir$filename #获取文件前面的新闻标题、发布人、发布时间等信息 cat $filename | head -1 | sed "s//n/;s/.0/n/;s/</author>/n/;s/</title>/n/;s/<[^>]+>//g;s/ $//g;s/ //g;s/^[ t]*//g;s/[ t]*$//g;" > $sql title=`cat $sql | head -4 | tail -1 | sed 's/"/\"/g'` post=`cat $sql | head -3 | tail -1 | sed 's/"/\"/g'` posttime=`cat $sql | head -2 | tail -1` #sql语句写入临时文件 echo "INSERT INTO `news_article` (`news_id`,`news_web`,`news_type`,`news_url`,`news_title`,`news_post`,`news_posttime`,`news_content`) VALUES("","教育网","学校快讯","" | iconv -f gbk -t utf8 > tmpfile #继续向临时文件写 echo "$url","$title","$post","$posttime","" >> tmpfile #新闻正文各种处理后,写入临时文件 cat $filename | sed 's//n/g' | sed '1,2d' | sed "s/<[^>]+>//g;s/ $//g;s/ //g" | tr 'n' ' ' | sed 's/^[ t]*//g;s/[ t]*$//g' | sed 's/"/\"/g' >> tmpfile echo "");" >> tmpfile #去掉回车 cat tmpfile | tr -d 'n' > $sql #将新闻正文处理成一个文件,方便php调用 cat $filename | sed 's//n/g' | sed '1,2d' | sed 's/</div>//;s/../../attachement/http://***.***.***/xxzq/attachement/g;s/../../site2/http://***.***.***/xzbg/site2/g' > $txt #写入数据库 mysql -uroot -ppassword dbname < $sql done #删除临时文件 rm tmpfile
从上面也应该可以看到,写入到数据库中的正文去掉了所有html标签,并且将段落回车替换成了空格,方便查询,而真正显示页面时,用file_get_contents来读取处理过的正文,去掉了头尾大量没用的信息,另外将图片和附件链接替换成原始链接。
不错,很好的学习分享,期待再更新哦