Hatena::ブログ(Diary)

Soleil cou coupé

2012-11-05

Redditをスクレイピングする例題

[11/3/2012] Challenge #110 [Intermediate] Creepy Crawlies : dailyprogrammer

問題

問題文

Webは不気味なストーリーで溢れかえっています。Redditにおいては/r/nosleepに。あなたは熱烈な不眠愛好者ですから(我々は結局のところプログラマですからね)、それらの不気味なストーリーを簡単に読めるように一つのファイルに収集せざるを得ないでしょう! この問題では/r/nosleep上部の100ポストから投稿されたすべての文章をダウンロードして、シンプルなテキストファイルに放り込むWebクローラを作ってください。

入力 & 出力
  • 入力:なし
  • 出力形式:
    • ファイルに保存するか標準出力する。フォーマットは以下のとおり:
    • それぞれのストーリーはタイトルラインを引く。タイトルラインというのは[3つの等号記号, 投稿タイトル, 3つの等号記号]で引かれる。
    • 例:"=== People are Scary! ==="
    • それ以下の行にはストーリー本文を出力する。ただの平文でよい。HTMLフォーマットや箇条書き形式などなどは気にしなくてよい。
出力例

=== Can I use the bathroom? ===
Since tonight's Halloween, I couldn't... (your program should print the rest of the story, I omit that for example brevity)
=== She's a keeper. ===
I love this girl with all of my... (your program should print the rest of the story, I omit that for example brevity)


解答

RedditはRESTfulなjsonインターフェースを提供している。普通に解く場合(?)、Pythonはjsonエンコーダを標準搭載しているので適当なURLにアクセスしてごちゃごちゃすればいい。

API · reddit/reddit Wiki

またpraw(Python Reddit API Wrapper)を使うとひどく簡単になる。というかずるい。でもラッパーが提供されてるなら使わない手はない。

praw-dev/praw

# -*- coding: utf-8 -*-
import praw

r = praw.Reddit("no sleep")
submissions = r.get_subreddit("nosleep").get_hot(limit=100)
for post in submissions:
    print "===%s===" % post.title.encode("utf-8")
    print post.selftext.encode("utf-8")

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/xef/20121105/p1