之前因为搜索Everything的使用技巧而碰到了一个牛人的blog:http://just-study.blogbus.com/ 不过当我找到这个blog的时候看到的已经是“博客迁移”的信息了,虽然博主已经不用Blogbus记录而是转向GitHub了,但是原始blog里面还是有很多值得一看的内容的,比如我现在想说的“博客迁移”这篇文章,内容大概就是用bash抓取自己blog的文章存为HTML文件,方便自己转移到GitHub上去,但是我第一次用的时候存在问题,而且里面用到了一些之前接触的比较少的Perl和sed用法,当时比较头疼,都不想再试了,不过下午睡了个好觉心情不错,觉得还是可以再弄弄,然后仔细的看脚本,同时搜索不懂的地方,把sed的用法顺便也熟悉了一遍,不好的一点就是时间花的有点多了,本想着1个小时以内把所有的工作做完,然后,又弄了几个小时o(╯□╰)o 水平太差了,对自己过于乐观自信了……
先放出我后来修改之后可用的脚本:
#!/bin/bash blog_url="http://just-study.blogbus.com"; for i in $(seq 1 2);do file=url_tag.$$ if test $i -eq 1;then url="$blog_url" else url="$blog_url/index_$i.html" fi curl -m 150 -s $url | grep "<a href='http://www.blogbus.com/just-study-logs/" | perl -pe 's/.*href..(.*html).*>(.*)..a>.*/$1/g' >> ${file} done iCount=1 awk '!a[$0]++' url_tag.* | wc -l # show counts cat url_tag.* | sort -u | while read url tag;do curl -m 150 -s $url | sed -n '/postHeader/,/relpost/p' | sed '$d' >tmp.file dos2unix tmp.file title=$(cat tmp.file | sed -n '3p' | perl -pe 's/s*<[^<]+>//g') dt=$(cat tmp.file | sed -n '2p' | perl -pe 's/..:..:..//g'| perl -pe 's/[年月日]//g') #filename="$dt-$tag-$title.html" filename="$dt--$iCount.html" #sed '/<body>/r' tmp.file > "$filename" cat tmp.file > "$filename" ((iCount++)) done #rm -rf tmp.file
还有一个版本(有版权信息的):
#!/bin/bash blog_url="http://just-study.blogbus.com"; for i in $(seq 1 12);do file=url_tag.$$ if test $i -eq 1;then url="$blog_url" else url="$blog_url/index_$i.html" fi curl -m 150 -s $url | grep "<a href='http://www.blogbus.com/just-study-logs/" | perl -pe 's/.*href..(.*html).*>(.*)..a>.*/$1 $2/g' >> ${file} done iCount=1 cat url_tag.* | sort -u cat url_tag.* | sort -u | while read url tag;do curl -m 150 -s $url | sed -n '/postHeader/,/Site Meter/p' | sed '$d' >tmp.file dos2unix tmp.file title=$(cat tmp.file | sed -n '3p'| perl -pe 's/s*<[^<]+>//g') dt=$(cat tmp.file | sed -n '2p' | perl -pe 's/..:..:..//g'| perl -pe 's/[年月日]//g') #filename="$dt-$tag-$title.html" filename="$dt--$iCount.html" cat tmp.file > "$filename" ((iCount++)) done rm -rf tmp.file
因为之前在抓取的时候碰到了几个问题:内容重复(我用的是awk的方法去重)、dos2unix命令执行出错(原来的文件命名虽然直观,但是因为文件名中含有斜线这种特殊字符,所以dos2unix命令再执行的时候会报错:No such file…),文件命名出错(bash循环中的变量值变化)等等,所以脚本最后改成了上面的模样,还没有在HTML文件中加上原作者的版权信息,实在抱歉,因为毕竟喜欢干净点的HTML代码,之前的sed命令没有把一些没用的HTML代码去除,所以我就改成这样了,其实也可以在每个文件的最后用cat/echo添加一段作者信息,待会自己加上去。
《 “批量下载Blogbus的文章” 》 有 2 条评论
curate – 抓取指定域名在 VirusTotal/Archive 等网站上存储的 URL 的工具(用Bash写的)
https://github.com/EdOverflow/curate
用shell写的基于xpath命令解析xml文件的一个样例
https://github.com/mattieb/download-windows-esd/blob/main/download-windows-esd
`
query() {
xpath -q -n -e “$1” “${xml}”
}
languages() {
query “//LanguageCode/text()” | sort | uniq
}
editions() {
query “//File[LanguageCode=’$1′]/Edition/text()” | sort | uniq
}
architectures() {
query “//File[LanguageCode=’$1′][Edition=’$2′]/Architecture/text()” | sort
}
file_xml() {
query “//File[LanguageCode=’$1′][Edition=’$2′][Architecture=’$3′]”
}
subquery() {
echo “$2” | xpath -q -n -e “$1”
}
filename() {
subquery “//FileName/text()” “$1”
}
url() {
subquery “//FilePath/text()” “$1”
}
sha1() {
subquery “//Sha1/text()” “$1”
}
`