bash脚本学习(二)

端午这几天休息,好好琢磨了一下用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来读取处理过的正文,去掉了头尾大量没用的信息,另外将图片和附件链接替换成原始链接。

bash脚本学习(二)》有1个想法

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据