Hatena::Groupbugrammer

蟲!虫!蟲!

Esehara Profile Site (by Heroku) / Github / bookable.jp (My Service)
過去の記事一覧はこちら

なにかあったら「えせはら あっと Gmail」まで送って頂ければ幸いです。
株式会社マリーチでは、Pythonやdjango、また自然言語処理を使ったお仕事を探しています

 | 

2011-10-30

[]自分でブックマークするのもだるくなってきたので、ロボットブックマークの選別を頼んだ 14:11

 ROBOT_KUNのはてなブックマーク

 f:id:nisemono_san:20111030135632p:image

 はてなの規約というか、半分くらいspamになってしまうので、微妙なところですけど、怒られたら停止するくらいで。

 方法としては、自分で記事を読むのもだるくなってきたので、コンピューターに記事を読ませることにした。 - 蟲!虫!蟲! - #!/usr/bin/bugrammer とおなじく、形態素解析Mecabで、自分のここ最近ブックマークしたページのタイトルの単語帳を作って、それにマッチしている度合いでブックマークしている。ブックマークを読むきっかけというのは、基本的にタイトルくらいだと思うし、自分が興味ありそうなタイトルというのは自然と傾向が出てくるはずなので、そういう風にした。さすがに変な挙動をしたらまずいよなーと思って、一回Deliciousで試したところ、意外に「多くの人がブックマークしているもの」を選んでくるので、それくらいだったらいいだろう、という見切り発射でスタートさせた。DeliciousAPIに関しては、下のモジュールが使いやすかった。

 Google Code Archive - Long-term storage for Google Code Project Hosting.

 で、まずはどんなタイトルのものをブックマークする傾向にあるか、という分析。

import MeCab
import urllib2
import BeautifulSoup as BeautifulSoup
# --- Define

mecab = MeCab.Tagger("mecabrc")
words = {}

# --- Read Page
def MecabRead(url):
    page_data = urllib2.urlopen(url).read()
    soup = BeautifulSoup.BeautifulSoup(page_data)
    links = soup("a",{"class":"entry-link"})
    for li in links:
        node = mecab.parseToNode(li.renderContents())
        while node:
            word = node.surface
            if node.posid >= 36 and node.posid <= 67:
                if not words.has_key(word):
                    words[word] = 0
                words[word] += 1
            node = node.next

def main():
    for p in range(1,120):
        url = "http://b.hatena.ne.jp/nisemono_san/?&of=" + str(p * 20)
        MecabRead(url)
    for word,count in sorted(words.items(),key = lambda x:x[1]):
        print word,count

if __name__ == "__main__":
    main()

 はてなブックマークに投稿することに関しては、2011-02-19を見ながら、「ああ、Mechanizeでいいよね」ということでちゃっちゃと作る。Robots.txtはちゃんと弾いているみたいなので、そこのあたりは解除する必要があるので、解除して投稿。あとはインスタンスを作ると同時にログイン処理をやっている。ソースを見ると、はてなブックマーク上記の「追加」から「エントリの詳細」を移行するときは"get"で指定されていたので、これだったら1ページで行けるだろう、ということでそのままページに飛んでいる。

 あと、ちょっと下のソースには反映させていないけど、基本的に「最初にブックマークされた日時」によって、注目のブックマークに表示されるか否かが決定されるので、過去5000エントリくらいから掘り出せば、邪魔にならなくて済む可能性が高いということと、ブックマークは20000件くらいまでなら遡れるので、そういう方針にした。

# -*- coding:utf-8 -*-
import urllib2
import BeautifulSoup
import re
import mechanize
from pydelicious import DeliciousAPI 

dicto = {}

class Hatena:
    def __init__(self,name,password):
        self.br = mechanize.Browser()
        self.br.open("http://www.hatena.ne.jp/login")
        self.br.select_form(nr=0)
        self.br["name"] = name
        self.br["password"] = password
        res = self.br.submit()
        self.name = name
    
    def post(self,entry_url):
        self.br.open("http://b.hatena.ne.jp/" + self.name + "/add.confirm?url=" + entry_url)
        self.br.select_form(nr=1)
        self.br.submit()

def DictoRead():
    lines = open("dicto.txt","r")
    for line in lines:
        line = line.rstrip()
        key,value = line.split(" ")
        dicto[key] = value
    lines.close()

def HateBu(i):
    Robot = Hatena("FIXME:id","FIXME:pass")
    page_data = urllib2.urlopen("http://b.hatena.ne.jp/entrylist?of=" + str(i * 20)).read()
    soup = BeautifulSoup.BeautifulSoup(page_data)
    links = soup("a",{"class":"entry-link"})
    for link in links:
        score = 0
        if re.match(".*2ch.*",link["href"]) != None:continue
        if re.match(".*soku.*",link["href"]) != None:continue
        if re.match(".*速報.*",link.text) != None:continue
        if link.text == u'続きを読む':continue
        for key,value in dicto.items():
            try:
                if re.compile(".*" + key + ".*").match(link.text) != None:
                    score += + 1
            except KeyboardInterrupt:
                    exit()
            except:
                    continue
        if score > 3:
                print link.text
                print score
                #try:
                Robot.post(link["href"])
                    #save_post = DeliciousAPI("FIXME:id","FIXME:pass")
                    #save_post.posts_add(link["href"],link.text)
                #except:
                #    print "It post Exist!1"
                #    continue

def main():
    DictoRead()
    for i in range(0,100):HateBu(i)

if __name__ == "__main__" : main()

 これだけ簡単に作れちゃうと、そりゃ、はてなブックマークspam業者が減らないよなーとか考えたりしていた。

vxznowkwbzvxznowkwbz2014/12/04 00:22cvzthcvhsbnnfs, <a href="http://www.bsaarfkwux.com/">fomigcmceh</a> , [url=http://www.pisaipccdk.com/]dtbqigqgab[/url], http://www.gnkdcloawg.com/ fomigcmceh

 |