最近Pythonに触り始めました.
練習も兼ねて,誰得ですが,電撃文庫の新刊情報を取ってくるスクリプトを書きました.
外部ライブラリのBeautifulSoupがないと動きません.
公式サイトのソースを見てると時期によってHTMLの構造が違うので,他の年月日でもちゃんと取れるか不安.
出力
嘘つきみーくんと壊れたまーちゃん10, 入間人間, 左 ブギーポップ・アンノウン, 上遠野浩平, 緒方剛志 オオカミさんと亮士くんとたくさんの仲間たち, 沖田 雅, うなじ レイヤード・サマー, 上月 司, さくらねこ ほうかご百物語あんこーる, 峰守ひろかず, 京極しん 煉獄姫 二幕, 藤原 祐, kaya8 輪環の魔導師8, 渡瀬草一郎, 碧 風羽 なれる!SE3, 夏海公司, Ixy 竜と勇者(あいつ)と可愛げのない私3, 志村一矢, ぎん太 Baby Princess(6), 公野櫻子, みぶなつき 〜覚醒遺伝子〜, 中村 一, refeia 神と奴隷の誕生構文III, 宇野朴人, きくらげ おまえなんぞに娘はやれん, 丸山英人, 月神るな
ソースコード(インデントがタブ文字なので注意)
# -*- coding: utf-8 -*- import BeautifulSoup import urllib2 import collections import urlparse import datetime import re class OutOfRangeError(ValueError): pass class DengekiNovels(object): def __init__(self, year, month): soup = self.load(year, month) self.parse(soup) def load(self, year, month): if(year <= 2008 and month <= 4): raise OutOfRangeError("Not found.") self.year = year self.month = month self.len = 0 self.url = "http://dengekibunko.dengeki.com/new/bunko{0:02d}{1:02d}.php".format(year % 100, month) r = urllib2.urlopen(self.url) if(r.geturl() != self.url): raise OutOfRangeError("Out of range or not found.") return BeautifulSoup.BeautifulSoup(r) def parse(self, soup): novel = collections.namedtuple("DengekiNovel", "img title subtitle author illust price descShort descLong") temp = [] for t in soup.findAll("div", "main_box"): if(t.find("div", id="dm_owab")): continue img = urlparse.urljoin(self.url, t.find("div", "picture").find("img")["src"]) container = t.find("div", {"class" : re.compile("^container")}) title = container.contents[1].contents[-1].replace(" ", "").replace("\n", "") subtitle = container.contents[3].text te = container.find("div", "a_data").text start = te.index(u"/") + 1 sep = te.find(u"イラスト/") start2 = sep + 5 if sep != -1: author = te[start:sep] illust = te[start2:] else: author = te[start:] illust = "" price = int(container.find("div", "p_data").text.split()[1][:-1]) descShort = container.find("div", "text_read").text descLong = container.p.text.replace(" ", "") temp.append(novel(img, title, subtitle, author, illust, price, descShort, descLong)) self.len = len(temp) self.books = temp def __iter__(self): return iter(self.books) if __name__ == "__main__": today = datetime.date.today() for t in DengekiNovels(today.year, today.month): print u"{0}, {1}, {2}".format(t.title, t.author, t.illust)