いろいろ理由がある。 まず、スクリプト型、インタープリター型であることだ。 もう、コンパイルする元気が残っていない。
そしてライブラリが豊富にあり、資料も豊富にあること、これが第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 の開墾 > 前書き