(この記事では、 Linux Mint 22.1 にインストールした GNU Wget 1.21.4 built on linux-gnu. を端末エミュレーターで使っています。)
goo ブログが今年 2025/11/18 に終了すると発表されました。
前に書いた記事では、 wget のスパイダー機能を使う事で、自動でエントリーをダウンロードするようにしてみました。
ですが、同じエントリーが最後の ?(文字列) の有無で別ページと認識されて重複ダウンロードされたりと、効率が悪いのが、やってみてわかりました。
goo ブログの個別のブログの表紙のURLは、
https://blog.goo.ne.jp/(ブログID)
となっていて、最後に / は付きませんが、ブログは、
https://blog.goo.ne.jp/(ブログID)/(内容)
という構造になっています。
エントリーは、 https://blog.goo.ne.jp/(ブログID)/e/ 以下にあります。
ページのリストは、 https://blog.goo.ne.jp/(ブログID)/arcv が https://blog.goo.ne.jp/(ブログID)/arcv?page=1 と同じで、自然数が無限大まで続いていって、個数を超えると、
<aside>該当する記事はありません。<br />
とでます。
そこで、
#!/usr/local/bin/perl
use utf8;
use open IO => ":encoding(utf-8)";
use strict;
use vars qw/$baseuri $blogid $i $listfile/;
use LWP::Simple;
$baseuri = $ARGV[0];
$baseuri =~ m{^https://blog\.goo\.ne\.jp/([^/]+)/?$} || die "goo blog URI is not correct\n";
$blogid = $1;
$baseuri =~ s#/$##;
$i = 1;
!-f 'list.txt' || die "list.txt already exists.\n";
open my $fh,'>','list.txt';
while(1){
my $downloaduri = "$baseuri/arcv/?page=$i";
local $_ = get($downloaduri);
if(m{<aside>該当する記事はありません。<br />}){
close $fh;
last;
}
{
open my $fh2,'>',sprintf('%04d.html',$i);
print $fh2 $_;
close $fh2;
}
foreach my $line(split /\n/){
$line =~ /<section><span class="mod-arcv-tit">/ || next;
$line =~ m{<a href="(https://blog\.goo\.ne\.jp/[^/]+/e/\w+)">} && print $fh "$1\n";
}
$i++;
}
というスクリプト arcv.pl を作って(修正BSDライセンスで公開します。)、ブログのエントリーが載っているリストのページをダウンロードして、エントリーの URI のリストである list.txt を生成するようにしてみました。
cd ~/site-rips/blog.goo.ne.jp/(ブログID)/arcv
perl ../../arcv.pl https://blog.goo.ne.jp/(ブログID)
cd ../e/
wget -i ../arcv/list.txt
という感じで、リップしたいブログの全エントリーをダウンロードできました。
以下で、画像ファイルもダウンロードしています。
cd ~/site-rips/blog.goo.ne.jp/(ブログID)/
perl -nle 'my @l = split /\"/;foreach my $line(@l){if($line =~ m{^https://blogimg.goo.ne.jp/}){$line =~ s/\?.*//;print $line}}' e/* | sort -u | perl -nle 'my $line = $_;s#^https://##;print $line if(!-f $_ && ! m{/$});' | wget -x -i - -c