エンジニアリングとお金の話

都内で働くエンジニアの日記です。

【技術】『テレビで紹介された人気の宿案内』と言うサイトを作ってみた

【SPONSORED LINK】

テレビを見ていると、色々なホテルや旅館が紹介されており自分もいつか泊まってみたいなと思っている。ただ、今は仕事やら何やらで忙しく実現できそうに無いので今後の役に立つ事を願って、『テレビで紹介された人気の宿案内』と言うサイトを作ってみた。

実際に作ったサイトはこちら
http://yadotv.com/
f:id:hatakazu93:20120819220910j:plain

内容はその名の通りで、テレビで紹介された宿やホテルを時系列で紹介していくサイトである。お盆休みで何もやる事が無かったので、ほぼ1日で完成させる事が出来た。ちなみに、テレビで紹介された宿やホテルに関する情報は、価格.com - テレビ番組で紹介されたホテル・温泉旅館 | テレビ紹介情報から引っ張ってくる事で解決した。ただ、価格.com - テレビ番組で紹介されたホテル・温泉旅館 | テレビ紹介情報から取得出来る情報はテレビ番組名と旅館名だけだったので、その他の旅館情報を取得する為に楽天トラベルのWebAPIを使用して情報を補足する事とした。

ちなみに、作成したPGはこんな感じである。開発言語はpython

#-*- coding:utf-8 -*-
import re
import os
import urllib
import json
import xmlrpclib
from pit import Pit
from BeautifulSoup import BeautifulSoup

userconf=Pit.get("userconf")

def main():
    if not newPageGet() == previousPageGet():
        travelInfoArray=travelInfo(newPageGet())
        for travelInfoTuple in travelInfoArray:
            rakutenHash=rakutenSearch(travelInfoTuple[0])
            if rakutenHash:
                blogNewPost(travelInfoTuple,rakutenHash)
        pageWrite(newPageGet())

def newPageGet():
    url="http://kakaku.com/tv/category=hotel/"
    bs=BeautifulSoup(urllib.urlopen(url).read().decode("sjis").encode("utf_8"))
    return str(int(bs.findAll("a",attrs={"href":re.compile("/tv/category=hotel/page=\d+?/$")})[0].text)+1)

def previousPageGet():
    fp=open(os.path.join(os.path.dirname(__file__),"save.txt"),"r")
    pageNumber=fp.read().rstrip()
    fp.close()
    return pageNumber

def pageWrite(pageNumber):
    fp=open(os.path.join(os.path.dirname(__file__),"save.txt"),"w")
    fp.write(pageNumber)
    fp.close()

def travelInfo(pageNumber):
    travelInfoArray=[]
    url="http://kakaku.com/tv/category=hotel/page=%s/" % pageNumber
    bs=BeautifulSoup(urllib.urlopen(url).read().decode("sjis").encode("utf_8"))
    for hotelName,tvName,tvInfo,tvDetail in zip(bs.findAll("div",attrs={"class":"tvnamebk"}),bs.findAll("a",{"href":re.compile("/tv/channel=\d+?/programID=\d+?/$")})[0:10],bs.findAll("a",{"href":re.compile("/tv/channel=\d+?/programID=\d+?/episodeID=\d+?/$")})[0:10],bs.findAll("a",attrs={"href":re.compile("/tv/channel=\d+?/$")})[10:19]):
        travelInfoArray.append((hotelName.text.encode("utf_8","ignore"),tvName.text.encode("utf_8","ignore"),tvInfo.text.encode("utf_8","ignore"),tvDetail.text.encode("utf_8","ignore")))
    return travelInfoArray
    
def rakutenSearch(hotelName):
    url="http://api.rakuten.co.jp/rws/3.0/json?affiliateId=%s&developerId=%s&operation=KeywordHotelSearch&version=2009-10-20&responseType=large&hotelThumbnailSize=3&keyword=%s"
    pyjson=json.loads(urllib.urlopen(url % (userconf["rakuten_af"],userconf["rakuten_dev"],urllib.quote(hotelName))).read())
    return pyjson["Body"]["KeywordHotelSearch"]["hotel"][0] if pyjson["Header"]["Status"] == "Success" else False

def blogNewPost(travelInfoArray,rakutenHash):
    server_url="http://yadotv.com/xmlrpc.php"
    blog_id="myblog"
    username=userconf["login"]
    password=userconf["passwd"]
    server=xmlrpclib.ServerProxy(server_url)
    entry_id=server.metaWeblog.newPost( 
            blog_id, 
            username, 
            password, { 
                'title':"%s(%s)" % (rakutenHash["hotelBasicInfo"]["hotelName"].encode("utf_8","ignore"),travelInfoArray[1]), 
                'description':postDataCreate(travelInfoArray,rakutenHash),
                'categories':blogCategoryCreate(travelInfoArray[1],rakutenHash["hotelBasicInfo"]["address1"].encode("utf_8","ignore"))
            },xmlrpclib.True
    )
    return entry_id

def postDataCreate(travelInfoArray,rakutenHash):
    print rakutenHash["hotelRatingInfo"]["serviceAverage"]
    postdata="""
            <div id="coment">%s %s%sにて紹介されました。</div></br>
            <div id="topTitle">【宿泊地情報】</div>
                <div id="middleTitle"><施設名></div>
                  %s
                <div id="middleTitle"><住所></div>
                  %s %s
                <div id="middleTitle"><電話番号></div>
                  %s
                <div id="middleTitle"><アクセス></div>
                  %s
                <div id="middleTitle"><最寄り駅></div>
                  %s
                <div id="middleTitle"><駐車場情報></div>
                  %s
                <a href='%s' target='_blank'><img src ='%s' border='0'></a></br></br><a href='%s' target='_blank'><img src ='%s' border='0'></a></br>
            <div id="topTitle">【お客様の評価】</div>
                <div id="middleTitle">サービス    :%s</div>
                <div id="middleTitle">立地      :%s</div>
                <div id="middleTitle">部屋      :%s</div>
                <div id="middleTitle">設備      :%s</div>
                <div id="middleTitle">風呂      :%s</div>
                <div id="middleTitle">食事      :%s</div>
                <div id="middleTitle">総合      :%s</div>
                <div id="middleTitle"><お客様の声></div>
                  %s
                <a href='%s' target='_blank'>その他のお客様の声はこちら</a></br>
            <div id="topTitle">【施設特徴】</div>
                <div id="middleTitle"><特色></div>
                  %s
                <div id="middleTitle"><設備></div>
              %s
                <div id="middleTitle"><お風呂種類></div>
                  %s
                <div id="middleTitle"><お風呂泉質></div>
                  %s
                <div id="middleTitle"><お風呂効能></div>
                  %s
                <div id="middleTitle"><周辺レジャー></div>
                  %s
                <a href='%s' target='_blank'>詳細な施設情報はこちら</a></br></br>
                
                <div id="underTitle"><a href='%s' target='_blank'>>>【数量限定】お得な宿泊プランはこちらをクリック<<</a></div>
            """
    return postdata % (
                        travelInfoArray[3],
                        travelInfoArray[1],
                        travelInfoArray[2],
                        rakutenHash["hotelBasicInfo"]["hotelName"].encode("utf_8","ignore"),
                        rakutenHash["hotelBasicInfo"]["address1"].encode("utf_8","ignore"),
                        rakutenHash["hotelBasicInfo"]["address2"].encode("utf_8","ignore"),
                        rakutenHash["hotelBasicInfo"]["telephoneNo"].encode("utf_8","ignore"),
                        rakutenHash["hotelBasicInfo"]["access"].encode("utf_8","ignore"),
                        rakutenHash["hotelBasicInfo"]["nearestStation"].encode("utf_8","ignore"),
                        rakutenHash["hotelBasicInfo"]["parkingInformation"].encode("utf_8","ignore"),
                        rakutenHash["hotelBasicInfo"]["hotelInformationUrl"].encode("utf_8","ignore"),
                        rakutenHash["hotelBasicInfo"]["hotelImageUrl"].encode("utf_8","ignore"),
                        rakutenHash["hotelBasicInfo"]["hotelInformationUrl"].encode("utf_8","ignore"),
                        rakutenHash["hotelBasicInfo"]["roomImageUrl"].encode("utf_8","ignore"),
                        str(rakutenHash["hotelRatingInfo"]["serviceAverage"]).encode("utf_8","ignore"),
                        str(rakutenHash["hotelRatingInfo"]["locationAverage"]),
                        str(rakutenHash["hotelRatingInfo"]["roomAverage"]),
                        str(rakutenHash["hotelRatingInfo"]["equipmentAverage"]),
                        str(rakutenHash["hotelRatingInfo"]["bathAverage"]),
                        str(rakutenHash["hotelRatingInfo"]["mealAverage"]),
                        str(rakutenHash["hotelBasicInfo"]["reviewAverage"]),
                        rakutenHash["hotelBasicInfo"]["userReview"].encode("utf_8","ignore"),
                        rakutenHash["hotelBasicInfo"]["reviewUrl"].encode("utf_8","ignore"),
                        rakutenHash["hotelBasicInfo"]["hotelSpecial"].encode("utf_8","ignore"),
                        ",".join([line.values()[0] for line in rakutenHash["hotelFacilitiesInfo"]["roomFacilities"]]).encode("utf_8","ignore"),
                        ",".join([line.values()[0] for line in rakutenHash["hotelFacilitiesInfo"]["aboutBath"] if line.get("bathType")]).encode("utf_8","ignore"),
                        ",".join([line.values()[0] for line in rakutenHash["hotelFacilitiesInfo"]["aboutBath"] if line.get("bathQuality")]).encode("utf_8","ignore"),
                        ",".join([line.values()[0] for line in rakutenHash["hotelFacilitiesInfo"]["aboutBath"] if line.get("bathBenefits")]).encode("utf_8","ignore"),
                        rakutenHash["hotelFacilitiesInfo"]["aboutLeisure"].encode("utf_8","ignore"),
                        rakutenHash["hotelBasicInfo"]["hotelInformationUrl"].encode("utf_8","ignore"),
                        rakutenHash["hotelBasicInfo"]["planListUrl"].encode("utf_8","ignore")
                    )

def blogCategoryCreate(*categories):
    categoryArray=[]
    prefDict={"北海道":"01北海道","青森県":"02青森県","岩手県":"03岩手県","宮城県":"04宮城県","秋田県":"05秋田県","山形県":"06山形県","福島県":"07福島県","茨城県":"08茨城県","栃木県":"09栃木県","群馬県":"10群馬県","埼玉県":"11埼玉県","千葉県":"12千葉県","東京都":"13東京都","神奈川県":"14神奈川県","新潟県":"15新潟県","富山県":"16富山県","石川県":"17石川県","福井県":"18福井県","山梨県":"19山梨県","長野県":"20長野県","岐阜県":"21岐阜県","静岡県":"22静岡県","愛知県":"23愛知県","三重県":"24三重県","滋賀県":"25滋賀県","京都府":"26京都府","大阪府":"27大阪府","兵庫県":"28兵庫県","奈良県":"29奈良県","和歌山県":"30和歌山県","鳥取県":"31鳥取県","島根県":"32島根県","岡山県":"33岡山県","広島県":"34広島県","山口県":"35山口県","徳島県":"36徳島県","香川県":"37香川県","愛媛県":"38愛媛県","高知県":"39高知県","福岡県":"40福岡県","佐賀県":"41佐賀県","長崎県":"42長崎県","熊本県":"43熊本県","大分県":"44大分県","宮崎県":"45宮崎県","鹿児島県":"46鹿児島県","沖縄県":"47沖縄県"}
    server_url="http://yadotv.com/xmlrpc.php"
    blog_id="myblog"
    username=userconf["login"]
    password=userconf["passwd"]
    server=xmlrpclib.ServerProxy(server_url)
    for count,category in enumerate(categories):
        name = category if count == 0 else prefDict.get(category)
        categoryArray.append(name)
        try:
            entry_id=server.wp.newTerm(
                blog_id,
                username,
                password,{
                    'name':name,
                    'taxonomy':'category',
                }
            )
        except:
            pass
    return categoryArray

if __name__ == '__main__':
    main()

wordpress3.4からXML-RPC WordPress APIがバージョンアップしており、カテゴリの投稿や記事の投稿が出来ようになった為、全ての作業をPGにて行う事が出来た。XML-RPCを活用する事で、pythonwordpressを連携させる事が容易に出来るので活用次第で色々な事が出来そうである。

ちなみに、今回作成したテレビで紹介された人気の宿案内は公開して5日程経つが最近は30~40人程のユニークユーザーが毎日訪れている。
f:id:hatakazu93:20120820061717j:plain
自分で使用する事を目的に作成したサイトであった為、全くSEO等を意識していなかったけど徐々に人が集まって来ており、自分以外にも需要があるコンテンツだったんだと思った。検索エンジンからこのサイトに到達するワードも大半が『テレビ番組名+宿名』なので、多分テレビを見てうる覚えで検索して訪れる人が多いのだろう。

今のところ毎日新しい宿・ホテルが追加されているので今後更にサイトが充実していく事が想定される。人がもっと集まるようであれば、新しいコンテンツを追加する等し訪れた人に更に役立つ情報を提供して行く様にしたい。何かいいアイディアがあれば是非コメント頂ければ幸いです。