唯物是真 @Scaled_Wurm

プログラミング(主にPython2.7)とか機械学習とか

電撃文庫の新刊情報を取ってくる

最近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)