自动抓取WordPress博客文章链接并自动生成Sitemap.xml的Shell脚本代码

2018年02月10日

原创内容,转载请注明出处:http://www.myzhenai.com.cn/post/2994.html http://www.myzhenai.com/thread-18082-1-1.html
做为一个个人站长,经常要为博客或网站的收录头疼,我也是经常发现我的博客百度并没有收录,于是我依照百度站长上的sitemap.xml的格式,自己写了一个Shell脚本来抓取博客文章地址并自动生成一个sitemap.xml文件,只要将这个文件提交给百度站长,并修改这个脚本把这个脚本放在服务器上的crontab里就可以自动生成了。这个脚本的思路很简单,通过读取Archives里的页面地址进行分析和抓取这些页面上的文章链接。并将这些链接通这脚本写入到sitemap.xml文件里边去。

执行脚本的方法

bash baidu-sitemap.sh http://blog.com
OR
sh baidu-sitemap.sh http://blog.com
OR
chmod 777 baidu-sitemap.sh
./baidu-sitemap.sh http://blog.com
#脚本后边必须跟随着您要抓取的网站,不能以/结尾

完整脚本代码

#! /bin/bash
#This WordPress baidu Sitemap tools
#autor:RucLinux
#web: http://www.myzhenai.com.cn http://jiayu.mybabya.com

url="${1}"
phat="/home/RucLinux/sitemap.xml"
xml="\< ?xml version=\"1.0\" encoding=\"utf-8\"?\>"
st="\<urlset \>"
ul="    \<url \>"
lo="        \<loc \>${url}"
lc="\</loc>"
mod="        \<lastmod \>"
tmod="\</lastmod>"
req="        \<changefreq \>"
dai="daily"
freq="\</changefreq>"
pri="        \<priority \>0.8\</priority>"
ur="    \</url>"
se="\</urlset>"
ni=$(date +20%y-%m-%d)
if [ ! -f "${phat}" ]; then
  echo -e "${xml}\n${st}" > ${phat}
fi
if [ ! -n "${1}" ]; then
  echo "error! Please enter the domain name you want to enumerate"
else
  sed -i "/< \/urlset>/d" ${phat}
  page=$(curl -s ${1}|grep \/post\/date\/|awk -F "'" '{ print $2 }'|awk -F "'" '{ print $1 }')
  arr=(${page})
    for i in ${arr[@]}
    do
        loc=$(curl -s ${i}|grep -Eo \/post\/'[0-9]+'.html)
  uarr=(${loc})
        for ii in ${uarr[@]}
        do
            pan=$(cat ${phat}|grep "${ii}")
            if [[ ${pan} == "" ]]; then
                echo -e "${ul}\n${lo}${ii}${lc}\n${mod}${ni}${tmod}\n${req}${dai}${freq}\n${pri}\n${ur}" >> ${phat}
            fi
        done
    done
  echo "${se}" >> ${phat}
fi

脚本代码解释

#! /bin/bash
#This WordPress baidu Sitemap tools
#autor:RucLinux
#web: http://www.myzhenai.com.cn http://jiayu.mybabya.com
#以上这些是解释器和脚本作用、版权信息注释

url="${1}"
#将运行脚本时输入的网址传参给url变量
phat="/home/RucLinux/sitemap.xml"
#指定sitemap.xml的路径和文件名
ni=$(date +20%y-%m-%d)
#获取当前时间,年-月-日
if [ ! -f "${phat}" ]; then
  echo -e "${xml}\n${st}" > ${phat}
fi
#以上这个判断是识别sitemap.xml文件是否存在,如果不存在这创建一个。
if [ ! -n "${1}" ]; then
  echo "error! Please enter the domain name you want to enumerate"
   #上边这一行是用户在执行脚本的时候没有输入网址会提示的错误信息。
else
  sed -i "/< \/urlset>/d" ${phat}
    #如果sitemap.xml文件存在,并且有内容的时候,先把文件尾的标签删除。
  page=$(curl -s ${1}|grep \/post\/date\/|awk -F "'" '{ print $2 }'|awk -F "'" '{ print $1 }')
    #读取用户执行脚本时输入的网址源代码,用/post/date/做为搜索关键词,将所有月份的文章存档页面地址读取出来,如果要修改抓取其他地址的话,将这一行的关键词修改就可以了。
  arr=(${page})
    将所有内容存入一个数组里
    for i in ${arr[@]}
    do
        #进入数组循环
        loc=$(curl -s ${i}|grep -Eo \/post\/'[0-9]+'.html)
                #读取文章存档日期页面并以/post/xxx(xxx为纯数字).html为关键词进行搜索,抓取并返回所有匹配的链接。
    uarr=(${loc})
        #第二次进入数组,第一个数组循环的是所有文章存档日期页面,这个数组保存的是单独一个页面里所有符合条件的文章链接。
        for ii in ${uarr[@]}
        do
                #第二次循环,这次是将在单独页面里抓取到的文章链接与sitemap.xml里的比照判断。
            pan=$(cat ${phat}|grep "${ii}")
                        #用$ii这个变量内容去sitemap.xml里边查找看有没有符合的,$ii的内容即是不同的/post/xxx.html,如果查找后没找到说明还没有写入,就执行下一步,否则跳过这个关键词
            if [[ ${pan} == "" ]]; then
                echo -e "${ul}\n${lo}${ii}${lc}\n${mod}${ni}${tmod}\n${req}${dai}${freq}\n${pri}\n${ur}" >> ${phat}
            fi
                        #这个判断条件是在sitemap.xml里没有找到与$ii相同内容的链接地址,存在的话就会自动跳过。
        done
    done
  echo "${se}" >> ${phat}
    #前边我们的代码删除了一个标签,脚本执行到这里是已经完成所有操作了,所以我们要让脚本在sitemap.xml文件尾端添加一个标签。
fi




sicnature ---------------------------------------------------------------------
Your current IP address is: 54.144.73.205
Your IP address location: 美国
Your IP address country and region: 美国 美国
Your current browser is:
Your current system is:
Original content, please indicate the source:
同福客栈论坛 | 海南仙岛海南乡情论坛 | JiaYu Blog
sicnature ---------------------------------------------------------------------
Welcome to reprint. Please indicate the source http://www.myzhenai.com.cn/post/2994.html

没有评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注