

<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>“南船北馬” &#187; Beautifulsoup</title>
	<atom:link href="http://aoshiman.net/weblog/category/python/beautifulsoup/feed/" rel="self" type="application/rss+xml" />
	<link>http://aoshiman.net/weblog</link>
	<description>不定期更新且つ、最新情報に対して常に周回遅れ気味に追っかけているブログです</description>
	<lastBuildDate>Tue, 20 Oct 2009 11:07:15 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.3</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>がんばれ！ アドミンくん の新作情報を知らせるTwitterBotを作った</title>
		<link>http://aoshiman.net/weblog/2009/01/07/adminkun-twitter/</link>
		<comments>http://aoshiman.net/weblog/2009/01/07/adminkun-twitter/#comments</comments>
		<pubDate>Wed, 07 Jan 2009 14:12:09 +0000</pubDate>
		<dc:creator>aoshiman</dc:creator>
				<category><![CDATA[Beautifulsoup]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://aoshiman.net/weblog/?p=120</guid>
		<description><![CDATA[				@ITで連載中の４コマ漫画がんばれ！ アドミンくんは、システム管理者のありがちネタをユーモラスに描いており、とっても面白く、一服の清涼剤という感じで、第一話から欠かさず読んでいます。
				今回、がんばれ！ アドミンくんの新着を見逃さないように、新着情報を知らせるTwitterBotを作成しました。
				http://twitter.com/ad_min_kun
				アカウントがadmin_kunでなく、ad_min_kunと細切れになっているのは、下のようにadminという文字は使えないようなので。
				
				がんばれ！アドミンくん はRSSを吐き出していない為（YahooPipes等の外部サービスでRSS化しているものは見かけます）、スクレイピングで対応しました。例によってコードを晒します。
				Python2.4と2.5で動作確認をしています。スクレイピングにBeautifulSoupを、Twitter投稿にpython-twitter（依存関係でsimplejsonも必要）を使用しています。
				
# coding: utf-8
import urllib2
from twitter import Api as TwitterApi
from BeautifulSoup import BeautifulSoup

def file_open(f):
    r = open(f,'r')
    latest_number = r.readline()
    r.close()
    return latest_number

def parse_html(u):
    soup = BeautifulSoup(urllib2.urlopen(u))
    data = []
    for node [...]]]></description>
			<content:encoded><![CDATA[				<p>@ITで連載中の４コマ漫画<a href="http://www.atmarkit.co.jp/fwin2k/itpropower/admin-kun/index/index.html">がんばれ！ アドミンくん</a>は、システム管理者のありがちネタをユーモラスに描いており、とっても面白く、一服の清涼剤という感じで、第一話から欠かさず読んでいます。<br />
				今回、がんばれ！ アドミンくんの新着を見逃さないように、新着情報を知らせるTwitterBotを作成しました。<span id="more-120"></span><br />
				<a href="http://twitter.com/ad_min_kun">http://twitter.com/ad_min_kun</a><br />
				アカウントがadmin_kunでなく、ad_min_kunと細切れになっているのは、下のようにadminという文字は使えないようなので。</p>
				<p><img src="http://aoshiman.net/weblog/wp-admin/user-images/20090106_01.png" alt="image01" /></p>
				<p>がんばれ！アドミンくん はRSSを吐き出していない為（YahooPipes等の外部サービスでRSS化しているものは見かけます）、スクレイピングで対応しました。例によってコードを晒します。<br />
				Python2.4と2.5で動作確認をしています。スクレイピングにBeautifulSoupを、Twitter投稿にpython-twitter（依存関係でsimplejsonも必要）を使用しています。</p>
				<pre class="brush: python;">
# coding: utf-8
import urllib2
from twitter import Api as TwitterApi
from BeautifulSoup import BeautifulSoup

def file_open(f):
    r = open(f,'r')
    latest_number = r.readline()
    r.close()
    return latest_number

def parse_html(u):
    soup = BeautifulSoup(urllib2.urlopen(u))
    data = []
    for node in soup.findAll('td', {'colspan': '3'}):
        for tag in node('table', {'width': '100%', 'cellpadding': '3', 'border': '0'}):
            for atag in tag('a'):
                data.append([atag['href'], atag.string])
    data.reverse()
    return data

def main(data, latest_number):
    for i in data:
        entry_link, entry_title = i[0], i[1]
        e = entry_link.split('/')
        entry_number = e[4]
        if latest_number &lt; entry_number:
            api = TwitterApi(TWITTER_USERNAME, TWITTER_PASSWORD)
            post = u'%s %s%s' % (entry_title, DOMAIN, entry_link)
            api.PostUpdate(post)
            latest_number = entry_number
    return latest_number

def file_close(f, l):
    w = open(f, 'w')
    w.write(str(l))
    w.close()

if __name__ == '__main__':
    FILE = 'adminkun_status.txt'
    TWITTER_USERNAME = 'TWITTER_ACCOUNT'
    TWITTER_PASSWORD = 'PASSWORD'
    URL = 'http://www.atmarkit.co.jp/fwin2k/itpropower/admin-kun/index/index.html'
    DOMAIN = 'http://www.atmarkit.co.jp'
    latest_number = file_open(FILE)
    data = parse_html(URL)
    latest_number = main(data, latest_number)
    file_close(FILE, latest_number)
</pre>
				<p>実は<a href="http://aoshiman.net/weblog/2009/01/04/radinikkei-twitterbot/">前回のBot</a>はこれの副産物でした。自分にとってTwitterは、すっかり情報ハブになっているので、有益になりうるTwitterBot候補があれば、ちょくちょく作っていこうかと思います。</p>
]]></content:encoded>
			<wfw:commentRss>http://aoshiman.net/weblog/2009/01/07/adminkun-twitter/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

