« グラフィカルで分かりやすいnumpyとmatplotlibのチュートリアル | トップページ | デイビッド・ビーズリーのPythonコース(シカゴ5日間)のお知らせ »

2014年9月 7日 (日)

Pythonでココログのサイトマップから全文配信のRSS1.0を作ってみた。

256pxrssfeedsvg1

ココログの管理画面では全文でのRSS配信が出来そうなインターフェイスがある割には、トップページの記事数の制限(99まで)があったりして、実は出来なかったりします。

なんか、Yahoo pipeとかいろいろとサービスがあるようですが、当方が試したところ全滅でした。

というわけで、むりやりサイトマップから作ってしまったらどうだろうと思いPythonでちょこちょこやってみました。

feedformatter というATOMやRSS1.0、RSS2.0へのフォーマットが簡単に得られるライブラリがあったので、pip installして使ってみましたが、チュートリアルがあったのでとっても簡単に変換できました。

あとBeautifulSoupが本当に使いやすい。jQueryよりも好きだ。

まあ、簡単だった理由は自分のブログだけに特化してやっつけで作ったからなため、ココログ以外ではこのままでは動きませんし、ココログでもブログテーマが違うとダメかもしれません。

フォーループのところで、BeautifulSoupでメタデータを無理矢理拾っている部分はブログによって変更が必要です。ChromeならF12を押してHTML要素を解析できるので、メタデータを拾うのに使えそうなタグを自分でみつけて適当に変更してください。

また、サーバーに負荷がかかりますので、まずは記事を一つだけダウンロードして、そのhtmlファイルへのパスがfpとして、

soup = BeautifulSoup(open(fp).read())

として読み込んでメタデータの抽出が適性にできるまでオフラインで十分にテストして本番は一回で済むようにお願いします。

スクリプトで連続ダウンロードはあまり行儀が良くないですし、機械的なダウンロードが続くと強制で接続が切られます。

また、下のコードでは全文配信ではなく、800文字に制限しています。全文に変更するのは簡単だと思いますが、最終的に1MBを超えた場合、ファイルがココログにアップロードできませんので注意しましょう。

ここまでの説明がよくわからない人はココログのサーバーに迷惑になってしまう可能性があるので使用をお控えください。

Pythonコード

以下のコードの使用は自己責任で行ってくださいね。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import urllib2, time
from bs4 import BeautifulSoup
from feedformatter import Feed 

u'''
サイトマップからRSS1.0のフィードを作成します。
https://code.google.com/p/feedformatter/wiki/Tutorial
にココログ用にちょっと手を加えただけです。
'''

# サイトマップのURLからスープを作る。
SiteMmapURL = 'http://ブログのサブドメイン.cocolog-nifty.com/blog/sitemap.xml'
soup = BeautifulSoup(urllib2.urlopen(SiteMmapURL).read())
soup.findAll('loc')

# Create the feed
feed = Feed()

# Set the feed/channel level properties
feed.feed["title"] = "Python generated test RSS feed"
feed.feed["link"] = r"http://ブログのサブドメイン.cocolog-nifty.com"
feed.feed["author"] = u"名前"
feed.feed["description"] = u"サブタイトルなど"

n_char = []
FeedURLs = [s.contents for s in soup.findAll('loc')]
# 最初のURLはブログのURLなのでスキップ。
# 最後の一つもブログではなく、ウェブページだったのでスキップ。
for n, [url] in enumerate(FeedURLs[1:-1]): # ここの数字はサイトマップをよく見て変更する。
    soup = BeautifulSoup(urllib2.urlopen(url).read())
    print n, url

    # Create an item
    item = {}

    item["title"] = soup.find('h3').contents[0]
    item["link"] = guid = url
    description = soup.find(attrs={'class':'entry-body-text'}).text
    print len(description)
    n_char.append(len(description))
    item["description"] = description[:800] # 最初の800字のみ。
    #ココログでは1アップロードあたり1MBを超える容量のファイルをアップロードすることはできません。

    # フッダーの形式: 2014年8月31日 (日) パソコン・インターネット | 固定リンク 
    txt = soup.find('span', attrs={'class' : 'post-footers'}).text.split('(')[0]
    year, rest = txt.split(u'\u5e74') # 年
    month, rest = rest.split(u'\u6708') # 月 
    date = rest.split(u'\u65e5')[0] # 日
    buf = '%d/%d/%d' % (int(year), int(month), int(date))
    item["pubDate"] = time.strptime(buf, "%Y/%m/%d")

    # Add item to feed
    # You can do this as many times as you like with multiple items
    feed.items.append(item)

feed.format_rss1_file('all_feeds.xml')  # rdf can not be opened in browser.

« グラフィカルで分かりやすいnumpyとmatplotlibのチュートリアル | トップページ | デイビッド・ビーズリーのPythonコース(シカゴ5日間)のお知らせ »

Python」カテゴリの記事

ココログ」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック

« グラフィカルで分かりやすいnumpyとmatplotlibのチュートリアル | トップページ | デイビッド・ビーズリーのPythonコース(シカゴ5日間)のお知らせ »

しろののツイッタータイムライン

  • ツイッターは5つ目も凍結されました。6つ目での復活も不可能。なのでnoteに注力しています。

    と思ったら、イーロン・マスクの買収が公になってアカウントが復活できました。ありがとうマスク。

    トランプ関連記事の一覧リスト

オススメたち

2024年12月
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31        

はてブ

無料ブログはココログ