maya000

ブログ小説「白衣の英雄」をまとめてダウンロードし、青空文庫形式で保存するスクリプト

Jun 28th, 2017
505
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Perl 5.10 KB | None | 0 0
  1. #!/usr/bin/perl
  2. # last updated : 2017/06/19 11:40:16 JST
  3. #
  4. # 白衣の英雄を 取得して青空文庫形式に変換する。
  5. # 512kbごとにファイルを分割して保存します。
  6. # Copyright (c) 2017 ◆.nITGbUipI
  7. # license GPLv2
  8. #
  9. # Usage
  10. # ./siroieiyu2aozora.pl
  11. # or
  12. # ./siroieiyu2aozora.pl 個別URL
  13. #
  14. # Changelog
  15. # 2017年06月12日(月曜日) 17:29:22 JST
  16. # ・個別ページのダウンロードに対応しました。
  17. #   コマンドラインからURLを指定すれば標準出力に出るので適当にリダイレクトしてください。
  18. # ・本編と番外編を別々のファイルに出力するようにしました。
  19. #   これで追記も楽になるでしょう。
  20. # ・番外編の小節に小見出しタグを付けるようにしました。
  21. # ・番外編の小節の全角数字を半角数字にするようにしました。
  22. #
  23.  
  24. use strict;
  25. use warnings;
  26. use LWP::UserAgent;
  27. use utf8;
  28. binmode STDOUT, ":utf8";
  29. binmode STDERR, ":utf8";
  30.  
  31. my $bunkatu = 1; # 512kbごとに分割する。1ファイルで標準出力に出したい場合は 0 にする。
  32.  
  33. my $url = "http://nemuiyon.blog72.fc2.com/blog-category-2.html"; #index
  34. my $separator = "▲▼▲▼▲▼▲▼▲▼▲▼▲▼▲▼▲▼▲▼▲▼▲▼▲▼\n";
  35. my $kaipage = "[#改ページ]\n";
  36. my $main_title= "白衣の英雄";
  37. my $author = "九重十造";
  38. my $header =  $main_title . "\n" . $author . "\n\n\n";
  39. my $base_name = 'hakui-';
  40. my $bangai_name = "hakui_bangaihen-";
  41. my $title;
  42.  
  43. sub get_contents {
  44.   my $address = shift;
  45.   my $http = LWP::UserAgent->new;
  46.   my $res = $http->get($address);
  47.   my $content = $res->content;
  48.   return $content;
  49. }
  50.  
  51. # urlリストを作成
  52. sub get_index {
  53.   my $address = shift;
  54.   my $index = &get_contents( $address );
  55.   utf8::decode($index);
  56.   $index =~ s|^.+第一部</span>|第一部|s;
  57.   $index =~ s|<div class=\"fc2_footer.+$||s;
  58.  $index =~ s|<a href|\n<a href|g;
  59.  $index =~ s|第一部.+\n||;
  60.  $index =~ s|<a href=\"([^\"]*)\".*|$1|g;
  61.  return $index;
  62. }
  63.  
  64. # タイトルを取得して整形
  65. sub get_title {
  66.  my $item = shift;
  67.  $item =~  m|.*entry_title\">(.+)</td>.*|;
  68.  $item = $1;
  69.  $item =~ tr/0-9/0-9/;
  70.  return $item;
  71. }
  72.  
  73. #本文を取得して整形
  74. sub get_honbun {
  75.  my $item = shift;
  76.  $item =~  m|.+main_txt\">(.+)<div class.+|;
  77.  $item =   $1;
  78.  $item =~  s|<br />|\n|g;
  79.  $item =~  s|\t\t\t<br>\t\t\t\t<a name=\"more\" id=\"more\"></a>||g;
  80.  $item =~  s|、\n|、|g; #読点での余計な改行を削除
  81.  $item =~  s|《|<<|g; #青空用に置換
  82.  $item =~  s|》|>>|g; #青空用に置換
  83.  $item =~  s|!!|!!|g;
  84.  $item =~  s|!?|!\?|g;
  85.  return $item;
  86. }
  87.  
  88. # 番外編の本文を整形
  89. sub replace_bangai {
  90.  my $item = shift;
  91.  my @ban;
  92.  foreach my $x (split("\n", $item)) {
  93.     if ($x =~ /^ 番外編/) {
  94.       $x =~ tr/0-9/0-9/;
  95.       $x =~  s/^( 番外編.+)$/[#小見出し]$1[#小見出し終わり]/;
  96.     }
  97.     push(@ban, $x);
  98.  }
  99.  return join("\n", @ban);
  100. }
  101.  
  102. # 1ページ取得する
  103. sub get_book {
  104.  my $i = shift;
  105.  my $base = &get_contents($i);
  106.  utf8::decode($base);
  107.  $title = &get_title($base);
  108.  my $honbun = &get_honbun($base);
  109.  if ($title =~ /番外編.*/) {
  110.     $honbun = &replace_bangai($honbun);
  111.  }
  112.  my $midasi = "\n[#中見出し]" . $title . "[#中見出し終わり]\n\n\n";
  113.  my $item = $kaipage . $separator . $midasi . $honbun . $separator;
  114.  print STDERR $title . " ::取得完了\n";
  115.  return $item ;
  116. }
  117.  
  118. #すべてのページを取得する
  119. sub get_all {
  120.  my @index = split('\n', &get_index($url));
  121.  my $count = $#index;
  122. #  my $count = 4; # debug
  123.  for ( my $i = 0; $i < $count; $i++) {
  124.     my $x = &get_book( $index[$i]);
  125.     print $x;
  126.     &split_write( $i, $x);
  127.     sleep 2;
  128.  }
  129. }
  130.  
  131. # すべてのページをファイルに書き込む
  132. sub get_write_all {
  133.  my @index = split('\n', &get_index($url));
  134.  my $count = $#index;
  135.  my $fcount = 1;
  136.  my $bcount = 1;
  137.  my ($FILE, $fh);
  138.  for ( my $i = 0; $i < $count; $i++) {
  139.     my $x = &get_book( $index[$i]);
  140.     if ($title =~ /白衣の英雄.*/) {
  141.       my $fname = $base_name . sprintf("%03d", $fcount) . ".txt";
  142.       if ( defined($FILE) ) {
  143.         print $FILE $x;
  144.       } else {
  145.         open ( $FILE, ">>:utf8" ,"$fname") or die "$!";
  146.         if ($i == 0) { print $FILE $header;}
  147.         print $FILE $x;
  148.       }
  149.       my $size = (-s $FILE);
  150.       if ($size > 512000) {
  151.         close( $FILE );
  152.         $FILE = undef;
  153.         $fcount++;
  154.       }
  155.     } else { # 番外編は別ファイルに書き込む。
  156.       my $fname = $bangai_name . sprintf("%03d", $bcount) . ".txt";
  157.       if ( defined($fh) ) {
  158.         print $fh $x;
  159.       } else{
  160.         open ( $fh, ">>:utf8" ,"$fname") or die "$!";
  161.         print $fh $x;
  162.       }
  163.       my $size = (-s $fh);
  164.       if ($size > 512000) {
  165.         close( $fh );
  166.         $fh = undef;
  167.         $bcount++;
  168.       }
  169.     }
  170.     sleep 2;
  171.  }
  172.  close( $FILE );
  173.  close( $fh );
  174. }
  175.  
  176. # main
  177. {
  178.  if ( @ARGV == 1 ) {
  179.     if ($ARGV[0] =~ m|https?://nemuiyon.blog72.fc2.com/|){
  180.       print &get_book( $ARGV[0]);
  181.       exit 0;
  182.     } else {
  183.       print "URLが違います\n";
  184.     }
  185.  } else {
  186.     if ( $bunkatu == 0 ){
  187.       print $header;
  188.       &get_all;
  189.     } else {
  190.       &get_write_all;
  191.     }
  192.  }
  193. }
Advertisement
Add Comment
Please, Sign In to add comment