Pythonでココログのサイトマップから全文配信のRSS1.0を作ってみた。
ココログの管理画面では全文での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」カテゴリの記事
- Noteの記事をPythonでバックアップしといた。(2021.05.05)
- JupyterLabでも好きな外部エディターを使いたい!(2018.05.02)
- ローカルエリア内のJupyterLabサーバーにLAN経由で接続する。(2018.05.02)
- Juliaやってみよう。五日目。Pythonと速度比較。(2017.08.01)
- Juliaやってみよう。四日目。@timeでプロファイリング(2017.07.16)
「ココログ」カテゴリの記事
- Feedlyで自分のブログの登録人数を調べる(2016.05.30)
- Pythonでココログのサイトマップから全文配信のRSS1.0を作ってみた。(2014.09.07)
- ココログフリーの記事の下にZenbackつけてみた。(2013.12.08)
- ココログのアクセス解析ログのダウンロードお助けアプリ作ってみた。(2013.11.26)
- ココログでpygmentsを使ってコードのハイライト(2013.01.31)
« グラフィカルで分かりやすいnumpyとmatplotlibのチュートリアル | トップページ | デイビッド・ビーズリーのPythonコース(シカゴ5日間)のお知らせ »
コメント