22
15分で情シスに怒られる方法 株式会社アシスト 山田 @DENZOWILL みんなのPYTHON勉強会#7 LT(2015/12/9)

15分で情シスに怒られる方法

Embed Size (px)

Citation preview

Page 1: 15分で情シスに怒られる方法

15分で情シスに怒られる方法株式会社アシスト 山田 聡@DENZOWILL

みんなのPYTHON勉強会#7 LT(2015/12/9)

Page 2: 15分で情シスに怒られる方法

注意※本当に怒られても責任は取れません。ジョークですmechanizeとかbottleとか触るちょっとしたきっかけになれば...

Page 3: 15分で情シスに怒られる方法

お題イントラの社員検索で怒られる

名前とか社員番号でしか検索できなくて不便内線番号とかでも検索できるようにして改善して怒られたい

Page 5: 15分で情シスに怒られる方法

レシピ1. 社員検索にアクセスします2. 結果のHTMLを解析します3. 検索条件に該当する社員を取得します4. 結果をJSONで戻します

Page 6: 15分で情シスに怒られる方法

1. 社員検索にアクセスします

Page 7: 15分で情シスに怒られる方法

検索用のクラスを作成import mechanizefrom BeautifulSoup import BeautifulSoup

class EmpWorker(object): """ 社員検索を改善したい """ def __init__(self): self.browser = mechanize.Browser() # proxyはいらない self.browser.set_proxies() self.browser.set_handle_robots(False) # POSTパラメータをGETにして全社員が戻るURL self.target_url = "http://xxxxxxxx.do?p_kensaku=_&p_kensaku2=&p_kensaku3="

Page 8: 15分で情シスに怒られる方法

2. 結果のHTMLを解析します

Page 9: 15分で情シスに怒られる方法

検索用のメソッド追加 # 検索キーワードを取る def get_emp(self, search_key=None, search_value=None): res = self.browser.open(self.target_url) # 割と文字コード判定ミスる # BeautifulSoup大好き soup = BeautifulSoup(res, fromEncoding="sjis")

Page 10: 15分で情シスに怒られる方法

3. 検索条件に該当する社員を取得します

Page 11: 15分で情シスに怒られる方法

(get_empの続き)

# 結果用のリスト ret_list = [] # うちの社員検索はtableタグ for i, tr_node in enumerate(soup.findAll("tr")): tds = [x.text for x in tr_node.findAll("td")] if len(tds) > 7: tmp_dict = u"社員番号": tds[0], u"社員名": tds[1], u"読み": tds[2], u"地区": tds[3], u"所属部署": tds[4], u"内線": tds[6], # 有効な検索条件があるときだけ働く if search_key and search_value and search_key in tmp_dict: if search_value in tmp_dict[search_key]: ret_list.append(tmp_dict) else: ret_list.append(tmp_dict) return ret_list

Page 12: 15分で情シスに怒られる方法

使ってみる社員名 == 山田 聡

In [1]: import EmpWalker

In [6]: EmpWalker.EmpWalker().get_emp(search_key=u"社員名", search_value=u"山田 聡"Out[6]: [u'\u5185\u7dda': u'"sayamada', u'\u5730\u533a': u'\u5e02\u30f6\u8c37', u'\u6240\u5c5e\u90e8\u7f72': u'23131', u'\u793e\u54e1\u540d': u'\u5c71\u7530 \u8061', u'\u793e\u54e1\u756a\u53f7': u'2409', u'\u8aad\u307f': u'SATOSHI YAMADA']

Page 13: 15分で情シスに怒られる方法

見づらかったのでIn [14]: result = EmpWalker.EmpWalker().get_emp(search_key=u"社員名", search_value=

In [15]: for k, v in result[0].items():print k,v所属部署 99999社員番号 999999地区 xxxx内線 12345読み SATOSHI YAMADA社員名 山田 聡

Page 14: 15分で情シスに怒られる方法

4. 結果をJSONで戻します

Page 15: 15分で情シスに怒られる方法

JSONモジュール使うだけIn [16]: import json

In [17]: result = EmpWalker.EmpWalker().get_emp(search_key=u"社員名", search_value=

In [18]: print json.dumps(result, indent=4)[ "\u6240\u5c5e\u90e8\u7f72": "99999", "\u793e\u54e1\u756a\u53f7": "99999", "\u5730\u533a": "xxxxxxx", "\u5185\u7dda": "12345", "\u8aad\u307f": "SATOSHI YAMADA", "\u793e\u54e1\u540d": "\u5c71\u7530 \u8061" ]

Page 16: 15分で情シスに怒られる方法

怒られポイント一人しらべるだけでも社員全員取得している

select * from emp where hoge=foo;

↓select * from emp;

Page 17: 15分で情シスに怒られる方法

モット怒られるために\5. WEB サービスとして公開する

Page 18: 15分で情シスに怒られる方法

BOTTLEのREADMEからfrom bottle import route, run, template

@route('/hello/<name>')def index(name): return template('<b>Hello name</b>!', name=name)

run(host='localhost', port=8080)

これだけでとりあえずAPサーバとして動いてる

http://localhost:8080/hello/foo

Hello foo!

Page 19: 15分で情シスに怒られる方法

EMPWALKERを組み込むだけ# coding:utf­8from bottle import route, run, responseimport jsonimport EmpWalker

@route('/')@route('/<search_key>/<search_value>')def index(search_key=None, search_value=None): # routeで取れるのはstr # print type(search_key) result = EmpWalker.EmpWalker().get_emp( search_key=search_key.decode("utf­8"), search_value=search_value.decode("utf­8") ) # JSONを戻すと明示 response.content_type = 'application/json' return json.dumps(result, indent=4)

run(host='localhost', port=8080)

Page 20: 15分で情シスに怒られる方法

こんな感じで使える

-> 全員戻る

-> 内線番号が1234なデータが戻る

http://localhost:8080/

http://localhost:8080/内線番号/1234

Page 21: 15分で情シスに怒られる方法

後はこれを社内でばらまくだけで情シスから処分されます

Page 22: 15分で情シスに怒られる方法

LET'S TRY !