ふにゃるんv2

もとは、http://d.hatena.ne.jp/Wacky/

mechanizeで、DLsite.comのManiaxサイトの新着情報をゲットする

最初は、Plaggerでも使って、DLsite.comのManiaxサイトの一覧を取ってみようかと思ったんですね。


で紹介されているコードの、homeをmaniaxに変えればOKだろ〜と思ったら、うまく行かない。
どうやら、認証ページ(よくある、あなたは18歳以上ですか?って確認を求めるページ)に飛ばされているっぽいんですね。
まぁ、18禁なんだから、しょうがないです。


そこで、CustomFeed::Scriptを使えば何とかなるかな?と思ったんですが、id:charsbar さんから提供していただいているリポジトリ内のPlaggerバージョンでは、どうも入って無さげ。
クッキーを保存する処理でも加えれば、何とかなるのかな?とか思いつつ、小一時間。
…というか、弄っている途中で、自分のやりたい事は「とりあえず http://maniax.dlsite.com/ の新着一覧をゲットしたいだけ」なんだという事を思い出しました。


でまぁ、この程度だったら、Pythonでやっても何とかできるかな?と思い返しまして、Python版のMechanizeを ちょっくら弄ってみました。

#!/bin/env python
# -*- encoding: shift-jis -*-
"""
    http://maniax.dlsite.com/new 18禁のDLsite.comにアクセスし、
    Plaggerのテキスト形式で結果を出力する。
"""
import mechanize
import re
import sys

g_os = sys.stdout

def msg_print(url, s):
    """ ページのデータ(s)を解析し、title,link,summary形式で出力する
    """
    print "parse...", url
    m = re.search('<TD valign="top" align="left" class="works_name1">(.*?)</TD>', s)
    print >>g_os, "title:", m.group(1)
    print "  ", m.group(1)
    
    print >>g_os, "link:", url

    m = re.search('::作品内容.*?align="left">(.*?)</TD>.*?</TR>', s, re.S)
    print >>g_os, "summary:", m.group(1).replace("<br />", "").replace("\r", "")
    print >>g_os, ""

def open_web(br, url):
    """指定されたURL(url)にアクセスし、製品毎のデータを取得する"""
    res = br.open(url)
    s = res.read()
    msg_print(url, s)

def main():
    # 出力方向を、ファイルに変更
    global g_os
    g_os = file("DLsite.txt", "w")
    
    # ブラウザオブジェクトで URL を開く
    br = mechanize.Browser()
    res = br.open('http://maniax.dlsite.com/new')

    # 18禁ボタンを押す
    br.select_form(name="adult_check")
    res = br.submit()
    assert res.geturl() == "http://maniax.dlsite.com/new"

    # リンクを列挙
    urls = {}
    for l in br.links(url_regex="work/=/product_id"):
        print l.url
        urls[l.url] = ""

    # リンクを重複排除&ソート
    ll = urls.keys()
    ll.sort()
    for l in ll:
        print l
        open_web(br, l)

if __name__ == "__main__":
    ret = main()

こんな作業を何度も繰り返すと、どうしてもPlaggerで省略化したくなりますが、mechanizeの練習にもなったから OKという事で。