WWW::Mechanize::FirefoxとWeb::QueryでAjaxのサイトをスクレイピングする

第1回 静岡ITPro勉強会 インフラ部で発表してきた。デモが動かなかったのは、名前がダサいという理由で電車の中でhtmlのファイル名を変えたせいでした、アホ過ぎる。

ま、こんな感じのファイルを用意します。AjaxでATNDのAPIにアクセスして今日の参加者を表示するっていうやつです。

<!DOCTYPE html>
<html>
<head>
<title>ajaxtest</title>
<script type="text/javascript" src="jquery-1.6.1.min.js"></script>
</head>

<body>
<button id=ajax name="atnd">クリックするとユーザー一覧を表示します</button>
<div class=users></div>
<script>

$("button#ajax").click(function(){
$.getJSON('http://api.atnd.org/events/users/?event_id=16076&format=jsonp&callback=?',
function(data){
 var items = [];

 $.each(data.events[0].users, function() {
   items.push('<li>' + this.nickname + '</li>');
 });

 $('<ul/>', {
   'class': 'userlist',
   html: items.join('')
 }).appendTo('div.users');
});
});
</script>
</body>
</html>

これをスクレイピングするにはWWW::Mechanize::Firefoxを使って

use WWW::Mechanize::Firefox;
use Web::Query;
use Encode;

my $mech = WWW::Mechanize::Firefox->new();
$mech->get('http://localhost:8000/');
$mech->click({ xpath => '//button[@name="atnd"]', synchronize => 0 });
sleep(2);
#print $mech->content;

my $q = Web::Query->new_from_html($mech->content);
$q->find('li')->each(sub {
                my $i = shift;
                printf "(%d) %s\n", $i+1, encode('utf-8', $_->text);
              });

実行するとこんな風に出力されるはずです。

(1) secondarykey
(2) ando_ando_ando
(3) となか
(4) yukio.47
(5) Kaz110
(6) tatsuya.ueda
(7) taji_314159265
(8) kzfm
(9) non

凡ミスでここまでは行かなかった。カナシス

名言集兼良いビジネス本の紹介

あまり名言集は読まないのだけど、これは面白かったというより必読。普段あまりビジネス本を読まない人にとっても良書紹介としても良いかも。

知識労働者たるものは、自らの組織よりも長く生きる。したがって、他の仕事を準備しておかなければならない。キャリアを変えられなければならない。自らをマネジメントすることができなければならない

ProductName 本田直之「人を動かすアフォリズム」90
本田 直之
小学館 / 1050円 ( 2010-01-05 )


本書の中で、あとで読もうかなと思っている本をメモっておく

ニューノーマル

リーマン・ショック後の世界経済は金融危機を脱したとしても低い経済成長率が恒常化し、投資、雇用、生産性といったすべての成長が危機前より弱くなる状態が当たり前となる

ニューノーマルの勝者と敗者を分けるのは時間への取り組み方である。

ProductName ニューノーマル―リスク社会の勝者の法則
ロジャー マクナミー
東洋経済新報社 / 1995円 ( 2008-09 )


マインドセット

これは読んだけどあとで読みなおす。

ProductName マインドセット ものを考える力
ジョン・ネスビッツ
ダイヤモンド社 / 1680円 ( 2008-05-16 )


チャンスの追求者は、変化をともなう未来はチャンスをもたらすことを知っているが、問題解決者はどうしても過去を相手にしがちだ

自分ブランドの教科書

いちばんつまらないのは、会社が何をめざしているのか、自分が何をしたいのかが曖昧のまま、ただ飼われるように働くことである

ProductName 自分ブランドの教科書
藤巻 幸夫
インデックス・コミュニケーションズ / 1575円 ( 2007-12-14 )


脳が教える!1つの習慣

脳は、命令を嫌い、質問を好む傾向があります

ProductName 脳が教える! 1つの習慣
ロバート・マウラー
講談社 / 1365円 ( 2008-07-05 )


野村再生工場

  • マネジメントの極意は気づきの誘発
  • 失敗と書いて「せいちょう」と読む

ProductName 野村再生工場 ――叱り方、褒め方、教え方 (角川oneテーマ21 A 86)
野村 克也
角川グループパブリッシング / 740円 ( 2008-08-10 )


致命的なミスを犯さずに、如何に小さなミスを繰り返せるかが重要なことだと書いてたひとがいたけど、そうだよなと思う。

高校生が感動した論語

ProductName 高校生が感動した「論語」 (祥伝社新書)
佐久 協
祥伝社 / 840円 ( 2006-06-27 )


「人を動かす」と「勝てば官軍」

ProductName 人を動かす 新装版
デール カーネギー
創元社 / 1575円 ( 1999-10-31 )


ProductName 勝てば官軍―成功の法則
藤田 田
ベストセラーズ / 1544円 ( 1996-10 )


人生は60%確実だと思ったことは成功するのである、100%の確率まで持っていったらチャンスは逃げてしまう

「経営者の条件」と「ネクスト・ソサエティ」

ProductName ドラッカー名著集1 経営者の条件
P.F.ドラッカー
ダイヤモンド社 / 1890円 ( 2006-11-10 )


ProductName ネクスト・ソサエティ ― 歴史が見たことのない未来がはじまる
P・F・ドラッカー
ダイヤモンド社 / 2310円 ( 2002-05-24 )


ドラッカー

客家大富豪

  • 何を始めるかに最も時間を費やすべし
  • 安売りには必ず終りがやって来る

ProductName 客家大富豪 18の金言
甘粕 正
講談社 / ?円 ( 2007-10-25 )


話し方入門

ProductName 話し方入門 新装版
D. カーネギー
創元社 / 1575円 ( 2000-09 )


ProductName ブライアン・トレーシーの 話し方入門 ー人生を劇的に変える言葉の魔力
ブライアン・トレーシー
日本実業出版社 / 1365円 ( 2008-07-17 )


ProductName 誰とでも 15分以上 会話がとぎれない!話し方 66のルール
野口 敏
すばる舎 / 1470円 ( 2009-07-21 )


フォーカルポイント

ProductName フォーカル・ポイント
ブライアン・トレーシー
ディスカヴァー・トゥエンティワン / 1575円 ( 2009-10-03 )


まるい虹(暈)

というらしい

1307138115

ProductName 虹の風景 (青菁社フォトグラフィックシリーズ)
高橋 真澄
青菁社 / 1680円 ( 2009-03 )


スマートフォンサイトの入門書

先週末のjavascriptの読書会の懇親会で、スマートフォン用のサイトの話を聞いて、ネイティブアプリもwebアプリも作れるようになっとかなアカンなぁと勉強してみた。

本書はスマートフォンサイトを製作するには3つのアプローチがあって、本書では最初の二つを取り扱ってます。

  • 専用サイトをフルスクラッチで
  • PCサイトをCSS/Javascriptでスマートフォン用に見やすく
  • 携帯向けサイトを流用

全ページカラーで見やすいし、説明も丁寧なので入門書としてはオススメかと思う。小さい画面に対応するためにはというよりは、タッチパネルのような指で触るデバイスのインターフェースをどう設計するか、はまりどころはどこか?PC用のサイトとはどう違ってどういうところに気をつけるべきなのか?というあたりが知りたかったので本書は良かったですね。

ProductName iPhone+Android スマートフォンサイト制作入門 (WEB PROFESSIONAL)
たにぐちまこと
アスキー・メディアワークス / 2499円 ( 2011-02-19 )


個人的には1章は必要なくて、2章のCacooを利用した設計フローと4章の実践テクニックが役に立った。

  • HTML5用のリセットCSS
  • webclipアイコンは57x57px

基本的なところを押さえたらjQuery Mobileを使っていけばいいのかな。

今日の畑(110531)

トマト苗を追加した。リコピン多めの黒っぽいミニトマトが成るらしいで楽しみ。

1306877134

ズッキーニも本葉が4,5毎出てきたので定植してみた。こっちは初めてなのでちょっとドキドキ。

1306877137

6次産業化推進セミナーに行ってきた

別に6次産業化に興味が有るわけじゃないけど、参加してみたら今回は超良かった。刺激を受けまくった2時間だった。パネラーの全てが強いメッセージを発していて熱かったですね。

長坂養蜂場

地域ブランドを大切にしている感がある。ラスクとはちみつマーガリン美味しそう。今度通販で買ってみようってことになった。

なかじま園

受け取ったヒトがどう捉えるかという観点からの徹底的に顧客目線な戦略。この方はほんとすごいなぁと思った。うちの実家は栃木で毎年苺が送られてくるけど、運送の過程でやっぱ傷んでることが多いので、ユリカーゴ使った発送ってそれだけでうれしいっすね。

それから、パンフの改良前後の違いの説明が分かりやすかった。

あとは、はなの舞のちょびっと乾杯の苺に使われている。

ちゃの生

f-bizもblogもずっと見てるので、改めて志が高いなぁと思った。三人の中では一番チャレンジャーっぽいですね。ブルーベリードレッシングもバーニャカウダソースも気になる。

TODO

あとで試す

  • なかじま園の苺
  • 長坂養蜂場のはちみつラスク
  • 長坂養蜂場のはちみつマーガリン
  • ちゃの生のブルーベリードレッシング
  • ちゃの生のバーニャカウダソース

ProductName 農はショーバイ!
松木 一浩
アールズ出版 / 1365円 ( 2010-09-15 )


ホットケーキミックス

ちょっと前からホットケーキを作りたいとずーっと言っていた。 で、最初から最後までやりたがるので、分量だけ量って好きなようにやらせた。

1306877200 1306877202

火傷するから気をつけるようにと何度も言っていたのに、やっぱりプレートの端の方に手首が触れて火傷した。ま、ちょっとは痛い思いしないと気をつけるようにならないからしょうがないな。

1306877204 1306877206

Shipwrecked

body & soulはヤバイ

part1part2もよい

ジャケもよい。

関係ないけどハウスの方のbody & soulも好きです。

ProductName Body & Soul 5
Various Artists
Wave Music / 1646円 ( 2007-09-04 )


これからスマートフォンが起こすこと

職場のLAN環境はセキュリティがどうのこうのという理由で有線ですが、これは色々致命的な差となって効いてくるような気がしますね。有線でつながるスマートフォンなんて想像できないように、インフラが無線化しないとその先に意識がすすまないので、未来がどうなりそうかなんて理解できっこないし、議論すらおこらないですね。

個人的には、そもそも研究所の研究員のパソコンなんか必要なくてタブレット端末のほうがあってると思っているし、そういう制約与えたほうがシステム全体として余計な入力を必要としない方向に進むから、結果としてタイポが減ったり、余分な文書作成作業が減って効率化するんじゃないかなぁと。あと、マウスでお絵描きのように化合物の構造ちまちま描いてるのだって結構頭悪いよねとか思うけど、そういう部分も効率的に進めようという意識が働くんじゃないかなぁと。

本書は「これからスマートフォンが起こすであろう社会の変化」を記述しています。それは自分の生活にどういう影響を与えるのかを考える機会になるので良書だと思いますね。スマートフォンを使ってないヒトが読んでもわかんないような気がするので、スマホ持ちが対象読者ですね。

本書はスマートフォンが市場の中に投入されたことで実際に起こっている化学反応を捉え、その化学反応がもたらす次のステップを示唆している

ProductName これからスマートフォンが起こすこと。
本田 雅一
東洋経済新報社 / 1575円 ( 2011-05-20 )


  • コンパニオンデバイス
  • 個人が自分の為に道具として使うコンピューターとは、クラウド型のウェブサービスの利用に特化した製品
  • タイムラインの共有こそが、スマートネイティブたちが相互に交流する上で、もっとも重要なこと
  • デジタル配信のコンテンツはオーナーシップが低い
  • ソーシャルメディアは生活の一部になっていく

読めばなるほどと思うが、じゃぁどういうユーザーインターフェースが来るのかとかには殆ど触れられていない。でも、読み終えたらまぁわかる。

doiからアブストラクトを取ってくる

今、職場で使っている文献管理システムはpubmedのXMLサービスを使ってpubmedのIDで管理しているので、合成反応系の雑誌が収録されてなくてケミストには不評だったり、ASAPとpubmedのタイムラグがあってちょっと待たないと登録できなかったりと製薬系の研究所内では使いにくさが目立ってきている。(自分も量子化学系の論文とか管理できなくて困ったりしたのだけど、3年以上放置してきた)

ふと、やる気を出した。

from pyquery import PyQuery as pq
import re

r = re.compile('10.(\d+)/')

def get_contents(doi):
    DX_DOI = "http://dx.doi.org/"
    doi_url = DX_DOI + doi
    d = None
    try:
        d = pq(doi_url)
    except:
        pass

    return _extract(d,doi)

def _extract(d,doi):
    registrant_prefix = r.search(doi).group(1)    
    if registrant_prefix == '1021':
        return _extractACS(d,doi)
    else:
        return "no extractor"

#    SQLAlchemy
#    title            = Column(String(256), unique=True)
#    pubmed_id        = Column(Integer, unique=True)
#    doi              = Column(String(128), unique=True)
#    abstract         = Column(Text())

def _extractACS(d,doi):
    title = d("h1.articleTitle").text()
    abstract = d("p.articleBody_abstractText").text()
    return {'doi': doi, 'title': title, 'abstract': abstract}

これでACS系はいけるはず。

J.C.I.Mはもちろん

>>> doi.get_contents('10.1021/ci900416a')
{'abstract': u'We introduce SARANEA, ... freely available under the GNU \
General Public License.', 'doi': '10.1021/ci900416a', 'title': u'SARANEA:\
A Freely Available Program To Mine Structure\u2212Activity and \
Structure\u2212Selectivity Relationship Information in Compound Data Sets'}

J.O.Cもいけるで。

>>> doi.get_contents('10.1021/jo1025157')
{'abstract': u'The stereoselectivity of glycosylation reactions is affected \
by many factors. Synthesis of 1,2- cis glycosidic ... effects of the acetyl \
groups.', 'doi': '10.1021/jo1025157', 'title': 'Study of the \
Stereoselectivity of 2-Azido-2-deoxygalactosyl Donors: Remote Protecting \
Group Effects and Temperature Dependency'}

あとはスクレイプできる出版社を増やしていけばpubmedのXMLサービス使わんでもいいね。

  • ASAPも大丈夫
  • doiからたどれる出版社の文献を管理できる

あとちっと頑張れば一通り動くようなものが出来上がる予定。

pyqueryも、Web::QueryもjQueryっぽくスクレイピング出来て便利なので、結局jQueryを覚えておけば色々使い回しが効いて良いと思う。

ProductName jQueryクックブック
jQuery Community Experts
オライリージャパン / 3780円 ( 2010-08-18 )