前書き

作成日 : 2008-12-23
最終更新日 :

なぜ Python なのか

いろいろ理由がある。 まず、スクリプト型、インタープリター型であることだ。 もう、コンパイルする元気が残っていない。

そしてライブラリが豊富にあり、資料も豊富にあること、これが第2の理由だ。

題材をどうしようか。 On to C++ では、有蓋貨車 ( box car ) の容積を計算するという題材だった。 俺は、まず自分用のクローラーを題材に進める。

クローラー

クローラーとは、Wikipedia によれば、ウェブ上の文書や画像などを周期的に取得し、自動的にデータベース化するプログラムである。 私が自分のブログを対象に作っているクローラーは、まだ周期的な取得にまで至っていない。以下、必要になったことを順不同で挙げる。

import sys, requests, os, bs4, time

if len(sys.argv) != 2 :
  print("usage : python asablo.py path ")
  sys.exit()
path = sys.argv[1] # path : /blog/2025/02/02/9751728

for i in range(32):
  url= 'https://marinkyo.asablo.jp' + path
  res = requests.get(url)
  res.raise_for_status()

  # beautiful soup 4 を利用して必要な場所を取る
  soup = bs4.BeautifulSoup(res.text, features='html.parser')

  # <span class="msg-date">で始まるエレメントをとる
	msg_date = soup.find('span', class_ ='msg-date')
	atime = mtime = time.mktime(time.strptime(msg_date.text, '%Y/%m/%d %H:%M:%S'))

  # 書き込み用のファイルの場所を作る
  target_dir = '/home' + os.path.dirname(path)
  # 書き込む
  if not os.path.exists(target_dir):
    os.makedirs(target_dir)
  filename = os.path.join(target_dir, os.path.basename(path))
  blog_file = open(filename, 'wb')
  for chunk in res.iter_content(100000):
    blog_file.write(chunk)
  blog_file.close()
  # タイムスタンプを変更する
  os.utime(filename, (atime, mtime))

  # 前のファイルを読む準備。<a class="navi-prev">で始まるエレメントをとる
	prev_url = soup.select('a.navi-prev')
	path = prev_url[0].attrs['href']
	

まりんきょ学問所Python の開墾 > 前書き


MARUYAMA Satosi