批量下载Blogbus的文章


之前因为搜索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 条评论

  1. 用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”
    }
    `

发表回复

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