次へ: 7 全体のソースコード 上へ: 6 各部分の作成 前へ: 6.1 ページ数の取得 (PDF ファイル: awkwww4.pdf)


6.2 コマンドラインの作成

wget のコマンドラインを作るときは、 URL の共通する部分をあらかじめ
topurl = "http://headlines.yahoo.co.jp/hl"
のように定義しておいて、 使うところでそれに必要な文字列をつけたすようにすれば、 長い URL をたくさん書かなくて済みますし、 後で URL を変更する場合も楽です。 また、ニュース分野も容易に変えられるように
field = "soci"
のように定義しておくことにします。

作成するファイル名は、この分野名とページ番号を使って

soci-001.html, soci-002.html, ...
のような名前にしますが、このような文字列は、
fname = sprintf("%s-%03d.html",field,j)
のようにして生成できます。sprintf() は C 言語の printf() と同様の構文で書式化された文字列を生成でき、 のようになります。なお、%03d は、%d に さらに桁指定等がついているのですが、'3' は 3 桁で表示、 '0' は $j$ の値が 3 桁より少ない場合は上位の桁は 0 で埋めることを意味します。 よって、$j=1$ の場合は ``001'', $j=12$ の場合は ``012'', $j=123$ の場合は ``123'' のような文字列に置き換わることになります。

これにより、wget のコマンドラインは、

  topurl = "http://headlines.yahoo.co.jp/hl"
  field = "soci"
  fname = sprintf("%s-%03d.html",field,1)
  url = sprintf("%s?c=%s&t=l",topurl,field)
  cmd = sprintf("wget -O %s \"%s\"",fname,url)
とすれば $cmd$
wget -O soci-001.html "http://.../hl?c=soci&t=l"
(URL は長いので途中省略) という文字列になります。 なお、sprintf() 内の "" の中で " という文字自体を 使うときは \" と書きます。 2 ページ目以降の場合は、これに ``&p=1'' などをつけていけばいいわけです。

そしてこれらを

system(cmd)
として実行すれば wget が AWK の外で実行されます。

また、[5] にある加工を行う場合は、pages 個数の引数をつけて AWK を実行する必要がありますので、

  awk = "awk"
  cmd = sprintf("%s -f yahoo2.awk",awk)
  for(j=1;j<=pages;j++)
    cmd = sprintf("%s %s-%03d.html",cmd,field,j)
  cmd = sprintf("%s > %s-lst1.html",cmd,field)
のようにしてコマンドラインを追加しながら作成すればいいでしょう。

なお、awk="awk" としているのは、 AWK コマンド名が ``gawk'' などである場合に 容易に修正できるように、と考えてのことです。


次へ: 7 全体のソースコード 上へ: 6 各部分の作成 前へ: 6.1 ページ数の取得
竹野茂治@新潟工科大学
2006年9月29日