Python Scrapy が便利

スクレイピングって requests で HTTP GET して BeautifulSoup でパースするだけっしょ」って思ってたので 、
あまり scrapy 使う便利さがわかってなかったんだけど、やってみたらただの食わず嫌いだったことがわかった。

Scrapy | A Fast and Powerful Scraping and Web Crawling Framework

公式サイトによると pip でインストールして project 作成する感じ。
何より面倒そうだなーと思ってたのはパースの部分。
ipython みたいな環境でインタラクティブに response のパースするコードを書きたかった。

実はそれ、 shell でできます。

$ scrapy shell <url> 

すれば IPython ベースのシェル上で xpath, css select も試せます。

Scrapy でのスクレイピング開発の流れは大きくこんな感じ。

  1. scrapy shell で response を取得
  2. スクレイピングしたい要素を Chrome デベロッパーツールで表示し copy xpath する
  3. shell 環境で xpath 等を使ってパース処理をスパイク実装
  4. genspider で spider を自動生成
  5. item, spider の実装

詳細は以下の本に丁寧に書いてありました。
6 章: Scrapy を使った重量スクレイピングを参照。

PythonとJavaScriptではじめるデータビジュアライゼーション

PythonとJavaScriptではじめるデータビジュアライゼーション

スクレイピングの定型的な部分はほぼ自動生成してくれて、
やるべきこと(⇔ パーサー)に集中できるのは楽。
今後とも Scrapy にはお世話になりそうです。

Python Pandas で最寄り駅ごとの坪単価平均ランキングを計算してみた

最近マンション買おうかと思いいろいろと物件を見学させてもらってます。
高い買い物なので情報を集めては迷い、集めては迷いを繰り返しています。。

どのエリアの不動産に価値があるのかを知るため、 不動産取引価格情報から坪単価を Python + Pandas でざっくり分析してみたのでまとめます。

データの取得

国土交通省では不動産の取引価格情報を公開しています。

地価公示・地価調査・取引価格情報 | 土地総合情報システム | 国土交通省

以下のパラメータを突っ込んでデータをダウンロードします。

  • 取引時期From:
  • 取引時期To:
  • 都道府県:
  • 市区町村:

解析

順次確認しつつ作業したかったので jupyter notebook で作業しました。 以下にコードの切れ端を貼っておきます。

import math
import pandas as pd

# ダウンロードしてきた csv ファイル
file = "../26_Kyoto Prefecture_20053_20173.csv"

# csv ファイルのロード。
# encoding 指定しないと文字化けするので注意。
df = pd.read_csv(file, encoding="Shift_JISx0213")

# テーブルの確認
df[["最寄駅:名称", "取引価格(総額)", "坪単価"]].head(3)

# (不正なデータを弾きつつ) 駅名を取得。
stations = df['最寄駅:名称'].dropna().unique()

# 各最寄駅ごとの坪単価の平均を取得。
# 中央値を使いたかったが件数が少ないのでとりあえず平均
# 駅から外れすぎると不動産価値が落ちて結果がおかしくなるので 30-60分は弾く
price_dict = {}
for station in stations:
    price_dict[station] = df[(df['最寄駅:名称'] == station) & ~(df['最寄駅:距離(分)'] == '30分?60分')]["坪単価"].mean() / 10000

# 坪単価が nan なものを弾く
temp = price_dict.copy()
for key in temp:
    if math.isnan(temp[key]):
        del price_dict[key]

# 出力
sorted_list= sorted(price_dict.items(), key=lambda x: x[1], reverse=True)
for k, v in enumerate(sorted_list):
    print("{0}位 {1}駅, {2:.1f}万円".format(k + 1, v[0], v[1]))

参考

Pythonによるデータ分析入門 ―NumPy、pandasを使ったデータ処理

Pythonによるデータ分析入門 ―NumPy、pandasを使ったデータ処理

結果発表

京都府の平成17年第三四半期から平成29年第三四半期までの取引データから、坪単価平均ランキングを出すとこんな感じになりました。

結果にすごく違和感が出るので、駅から遠い物件は外しています。

なんとなく感覚にフィットするのでそれっぽいと思います。

あくまで昔からの平均値なので、違和感を感じるポイントがあれば、それは坪単価が上がってる or 下がってると解釈できそうに思います。 平均だと外れ値に引っ張られるので、一件でもバカ高い物件があれば変な結果になりますが。。 本当は中央値を使いたかったですが、標本数があまりに少ないので止めました。

現状の計算では、坪単価データが掲載されているものに対してしかやっていないですし、物件の種類とか地域によっても区別していないので改善点は多々あります。

やはり中心地は高い。。

1位 河原町(京都)駅, 341.5万円
2位 京都市役所前駅, 298.8万円
3位 烏丸駅, 290.0万円
4位 烏丸御池駅, 248.0万円
5位 四条(京都市営)駅, 211.7万円
6位 三条(京都)駅, 186.2万円
7位 祇園四条駅, 185.8万円
8位 五条(京都市営)駅, 157.5万円
9位 清水五条駅, 156.2万円
10位 丸太町(京都市営)駅, 152.4万円
11位 三条京阪駅, 138.5万円
12位 二条城前駅, 131.0万円
13位 京都駅, 130.3万円
14位 大宮(京都)駅, 126.2万円
15位 東山(京都)駅, 119.4万円
16位 松ケ崎(京都)駅, 112.5万円
17位 神宮丸太町駅, 112.1万円
18位 北山(京都)駅, 106.8万円
19位 今出川駅, 102.6万円
20位 二条駅, 98.3万円
21位 出町柳駅, 97.6万円
22位 西院(阪急)駅, 97.2万円
23位 北大路駅, 97.0万円
24位 嵐電嵯峨駅, 96.0万円
25位 鞍馬口駅, 93.2万円
26位 桃山御陵前駅, 92.7万円
27位 七条駅, 92.5万円
28位 丹波口駅, 88.7万円
29位 西大路御池駅, 86.0万円
30位 嵐山(京福)駅, 85.8万円
31位 近鉄丹波橋駅, 85.2万円
32位 茶山(京都)駅, 84.3万円
33位 円町駅, 81.8万円
34位 北野白梅町駅, 79.5万円
35位 一乗寺駅, 79.5万円
36位 西大路三条駅, 78.8万円
37位 元田中駅, 77.5万円
38位 伏見桃山駅, 75.1万円
39位 西京極駅, 73.3万円
40位 山ノ内(京都)駅, 71.7万円
41位 桃山駅, 71.6万円
42位 桂駅, 70.6万円
43位 国際会館駅, 70.0万円
44位 西大路駅, 69.8万円
45位 蹴上駅, 68.3万円
46位 東寺駅, 67.1万円
47位 丹波橋駅, 66.9万円
48位 太秦天神川駅, 66.5万円
49位 太秦広隆寺駅, 66.5万円
50位 御室仁和寺駅, 64.9万円
51位 修学院駅, 64.7万円
52位 くいな橋駅, 63.7万円
53位 上桂駅, 63.3万円
54位 常盤(京都)駅, 62.0万円
55位 妙心寺駅, 61.4万円
56位 十条(近鉄)駅, 61.2万円
57位 帷子ノ辻駅, 60.9万円
58位 宝ケ池駅, 60.5万円
59位 洛西口駅, 59.6万円
60位 蚕ノ社駅, 59.1万円
61位 十条(京都市営)駅, 58.8万円
62位 山科駅, 58.6万円
63位 東向日駅, 58.5万円
64位 車折神社駅, 58.4万円
65位 鹿王院駅, 57.4万円
66位 長岡天神駅, 57.4万円
67位 竹田(京都)駅, 56.8万円
68位 松尾大社駅, 56.1万円
69位 宇治(京阪)駅, 55.8万円
70位 東福寺駅, 54.5万円
71位 長岡京駅, 53.6万円
72位 嵐山(阪急)駅, 53.5万円
73位 花園(京都)駅, 53.4万円
74位 桃山南口駅, 52.8万円
75位 松井山手駅, 52.4万円
76位 太秦(JR)駅, 52.1万円
77位 伏見(京都)駅, 50.9万円
78位 嵯峨嵐山駅, 50.8万円
79位 向日町駅, 50.2万円
80位 等持院駅, 50.0万円
81位 藤森駅, 49.5万円
82位 龍安寺駅, 49.3万円
83位 九条(京都)駅, 49.1万円
84位 西向日駅, 49.0万円
85位 木野駅, 48.6万円
86位 墨染駅, 48.5万円
87位 鳥羽街道駅, 48.2万円
88位 深草駅, 46.7万円
89位 中書島駅, 46.6万円
90位 桂川(京都)駅, 46.2万円
91位 六地蔵(京阪)駅, 45.9万円
92位 伏見稲荷駅, 45.8万円
93位 椥辻駅, 45.6万円
94位 大山崎駅, 45.6万円
95位 六地蔵(京都市営)駅, 45.6万円
96位 伊勢田駅, 45.1万円
97位 京都精華大前駅, 45.0万円
98位 小野(京都)駅, 44.8万円
99位 有栖川駅, 44.6万円
100位 東野(京都)駅, 44.4万円
101位 上鳥羽口駅, 44.3万円
102位 JR小倉駅, 44.2万円
103位 岩倉(京都)駅, 43.1万円
104位 八幡前(京都)駅, 42.5万円
105位 西山天王山駅, 42.4万円
106位 鳴滝駅, 41.1万円
107位 JR藤森駅, 40.4万円
108位 木幡(京阪)駅, 39.9万円
109位 黄檗(JR)駅, 39.7万円
110位 追分(滋賀)駅, 39.5万円
111位 石田(京都市営)駅, 39.2万円
112位 大久保(京都)駅, 39.0万円
113位 高の原駅, 38.6万円
114位 御陵駅, 38.6万円
115位 四宮駅, 38.5万円
116位 六地蔵(JR)駅, 38.4万円
117位 黄檗(京阪)駅, 38.4万円
118位 山崎(京都)駅, 38.2万円
119位 寺田(京都)駅, 38.1万円
120位 醍醐(京都)駅, 37.9万円
121位 宇多野駅, 37.8万円
122位 小倉(京都)駅, 37.2万円
123位 新田(京都)駅, 36.0万円
124位 三室戸駅, 36.0万円
125位 新田辺駅, 35.9万円
126位 城陽駅, 35.0万円
127位 観月橋駅, 34.5万円
128位 久津川駅, 34.5万円
129位 富野荘駅, 34.3万円
130位 三宅八幡駅, 33.9万円
131位 淀駅, 33.9万円
132位 宇治(JR)駅, 33.4万円
133位 稲荷駅, 33.4万円
134位 学研奈良登美ケ丘駅, 32.3万円
135位 樟葉駅, 31.8万円
136位 三山木駅, 29.6万円
137位 同志社前駅, 28.9万円
138位 木幡(JR)駅, 28.7万円
139位 興戸駅, 27.7万円
140位 向島駅, 27.5万円
141位 祝園駅, 26.8万円
142位 京田辺駅, 26.6万円
143位 JR三山木駅, 26.5万円
144位 二軒茶屋(京都)駅, 25.7万円
145位 市原駅, 25.6万円
146位 山田川駅, 24.3万円
147位 橋本(京都)駅, 23.6万円
148位 馬堀駅, 23.2万円
149位 並河駅, 23.1万円
150位 平城山駅, 23.0万円
151位 八幡市駅, 21.9万円
152位 長池駅, 21.5万円
153位 大住駅, 21.0万円
154位 狛田駅, 20.7万円
155位 新祝園駅, 20.6万円
156位 木津川台駅, 20.2万円
157位 木津(京都)駅, 20.2万円
158位 千代川駅, 20.1万円
159位 東舞鶴駅, 19.8万円
160位 保津峡駅, 19.0万円
161位 西舞鶴駅, 18.7万円
162位 亀岡駅, 17.7万円
163位 福知山市民病院口駅, 17.1万円
164位 西木津駅, 17.0万円
165位 近鉄宮津駅, 16.5万円
166位 福知山駅, 16.4万円
167位 荒河かしの木台駅, 15.2万円
168位 下狛駅, 14.8万円
169位 松尾寺駅, 14.3万円
170位 綾部駅, 14.1万円
171位 加茂(京都)駅, 13.0万円
172位 石原(京都)駅, 12.8万円
173位 棚倉駅, 12.7万円
174位 宮津駅, 12.5万円
175位 八瀬比叡山口駅, 12.5万円
176位 園部駅, 12.0万円
177位 山城青谷駅, 10.9万円
178位 上狛駅, 9.7万円
179位 山城多賀駅, 9.2万円
180位 八木駅, 9.2万円
181位 玉水駅, 7.8万円
182位 宮村駅, 7.5万円
183位 淵垣駅, 7.0万円
184位 四所駅, 6.3万円
185位 大江(京都)駅, 5.9万円
186位 高津(京都)駅, 5.8万円
187位 鞍馬駅, 5.6万円
188位 京丹後大宮駅, 5.6万円
189位 天橋立駅, 5.5万円
190位 峰山駅, 5.4万円
191位 胡麻駅, 5.1万円
192位 岩滝口駅, 5.0万円
193位 上川口駅, 4.9万円
194位 大江高校前駅, 4.7万円
195位 吉富(京都)駅, 4.7万円
196位 久美浜駅, 4.5万円
197位 下山(京都)駅, 4.4万円
198位 網野駅, 3.9万円
199位 笠置駅, 3.9万円
200位 与謝野駅, 3.7万円
201位 丹後由良駅, 3.7万円
202位 喜多駅, 3.7万円
203位 夕日ケ浦木津温泉駅, 3.6万円
204位 日吉(京都)駅, 3.6万円
205位 真倉駅, 3.5万円
206位 東雲(京都)駅, 3.5万円
207位 下夜久野駅, 3.2万円
208位 月ケ瀬口駅, 3.1万円
209位 栗田駅, 2.9万円
210位 小天橋駅, 2.8万円
211位 鍼灸大学前駅, 2.5万円
212位 丹後神崎駅, 2.3万円
213位 牧(京都)駅, 2.0万円
214位 上夜久野駅, 1.9万円
215位 梅迫駅, 1.7万円
216位 和知駅, 1.7万円
217位 公庄駅, 1.6万円
218位 山家駅, 1.5万円
219位 大江山口内宮駅, 1.3万円
220位 二俣駅, 1.1万円
221位 船岡(京都)駅, 1.0万円
222位 かぶと山駅, 0.9万円
223位 立木駅, 0.8万円
224位 貴船口駅, 0.5万円
225位 辛皮駅, 0.5万円
226位 安栖里駅, 0.4万円

興味本位で東京でも同じようなことやってみました。 銀座が飛び抜けているのは外れ値の影響もありそうな。

1位 銀座駅, 2751.7万円
2位 京橋(東京)駅, 2430.0万円
3位 六本木一丁目駅, 1902.5万円
4位 銀座一丁目駅, 1810.0万円
5位 竹橋駅, 1800.0万円
6位 虎ノ門駅, 1556.0万円
7位 東銀座駅, 1518.8万円
8位 汐留駅, 1500.0万円
9位 日本橋(東京)駅, 1405.6万円
10位 東京駅, 1400.0万円
11位 内幸町駅, 1390.0万円
12位 溜池山王駅, 1267.5万円
13位 築地市場駅, 1225.0万円
14位 浜松町駅, 1205.0万円
15位 京成上野駅, 1200.0万円
16位 新橋駅, 1113.5万円
17位 三越前駅, 1100.0万円
18位 明治神宮前駅, 994.7万円
19位 御成門駅, 978.3万円
20位 赤坂見附駅, 962.7万円
21位 九段下駅, 949.5万円
22位 半蔵門駅, 928.4万円
23位 麹町駅, 915.4万円
24位 宝町(東京)駅, 856.7万円
25位 六本木駅, 848.8万円
26位 原宿駅, 826.9万円
27位 赤坂(東京)駅, 820.7万円
28位 大門(東京)駅, 670.0万円
29位 表参道駅, 660.8万円
30位 大手町(東京)駅, 660.0万円
31位 青山一丁目駅, 639.0万円
32位 岩本町駅, 623.3万円
33位 神田(東京)駅, 620.9万円
34位 神谷町駅, 612.9万円
35位 東日本橋駅, 600.8万円
36位 淡路町駅, 595.0万円
37位 八丁堀(東京)駅, 589.2万円
38位 神保町駅, 581.0万円
39位 築地駅, 581.0万円
40位 麻布十番駅, 575.9万円
41位 芝公園駅, 556.7万円
42位 新宿駅, 556.5万円
43位 渋谷駅, 554.4万円
44位 田町(東京)駅, 533.5万円
45位 代官山駅, 530.4万円
46位 御茶ノ水駅, 518.8万円
47位 秋葉原駅, 512.9万円
48位 赤羽橋駅, 510.0万円
49位 市ケ谷駅, 509.2万円
50位 新日本橋駅, 506.9万円
51位 乃木坂駅, 505.7万円
52位 新宿西口駅, 500.0万円
53位 人形町駅, 498.0万円
54位 都庁前駅, 480.0万円
55位 小伝馬町駅, 474.4万円
56位 新御茶ノ水駅, 473.3万円
57位 外苑前駅, 471.8万円
58位 桜ケ丘駅, 470.0万円
59位 馬喰町駅, 469.4万円
60位 茅場町駅, 466.4万円
61位 末広町(東京)駅, 464.6万円
62位 北参道駅, 460.0万円
63位 広尾駅, 456.5万円
64位 千駄ケ谷駅, 444.6万円
65位 御徒町駅, 440.7万円
66位 仲御徒町駅, 438.9万円
67位 三田(東京)駅, 437.4万円
68位 上野駅, 436.2万円
69位 永田町駅, 430.0万円
70位 水天宮前駅, 429.8万円
71位 水道橋駅, 427.2万円
72位 代々木駅, 420.5万円
73位 新富町(東京)駅, 417.8万円
74位 小川町(東京)駅, 411.1万円
75位 馬喰横山駅, 408.6万円
76位 品川駅, 406.9万円
77位 浜町駅, 401.1万円
78位 西武新宿駅, 400.0万円
79位 国会議事堂前駅, 400.0万円
80位 代々木公園駅, 385.9万円
81位 恵比寿駅, 382.9万円
82位 白金台駅, 373.0万円
83位 神泉駅, 372.8万円
84位 代々木八幡駅, 366.9万円
85位 五反田駅, 359.5万円
86位 東新宿駅, 353.8万円
87位 四ツ谷駅, 349.8万円
88位 新庚申塚駅, 345.0万円
89位 白金高輪駅, 343.9万円
90位 飯田橋駅, 342.7万円
91位 湯島駅, 342.0万円
92位 勝どき駅, 340.5万円
93位 泉岳寺駅, 325.8万円
94位 高輪台駅, 323.6万円
95位 本郷三丁目駅, 320.5万円
96位 新宿三丁目駅, 315.0万円
97位 蔵前駅, 313.6万円
98位 月島駅, 309.8万円
99位 四谷三丁目駅, 308.5万円
100位 浅草橋駅, 307.5万円
101位 新御徒町駅, 307.3万円
102位 田原町(東京)駅, 305.6万円
103位 自由が丘(東京)駅, 305.2万円
104位 参宮橋駅, 301.3万円
105位 品川シーサイド駅, 300.0万円
106位 牛込神楽坂駅, 298.4万円
107位 中目黒駅, 296.0万円
108位 新宿御苑前駅, 292.7万円
109位 代々木上原駅, 290.7万円
110位 神楽坂駅, 288.6万円
111位 南新宿駅, 288.5万円
112位 牛込柳町駅, 284.8万円
113位 錦糸町駅, 283.1万円
114位 稲荷町(東京)駅, 282.8万円
115位 青海(東京)駅, 280.0万円
116位 池袋駅, 279.9万円
117位 茗荷谷駅, 278.4万円
118位 西新宿駅, 277.4万円
119位 北品川駅, 275.2万円
120位 大森海岸駅, 275.2万円
121位 東大前駅, 272.5万円
122位 春日(東京)駅, 271.9万円
123位 国立競技場駅, 270.0万円
124位 駒場東大前駅, 265.8万円
125位 池尻大橋駅, 263.0万円
126位 若松河田駅, 262.6万円
127位 下北沢駅, 260.6万円
128位 有明(東京)駅, 260.0万円
129位 高田馬場駅, 259.6万円
130位 江戸川橋駅, 258.9万円
131位 後楽園駅, 253.6万円
132位 新大久保駅, 250.7万円
133位 初台駅, 247.5万円
134位 浅草(東武・都営・メトロ)駅, 246.6万円
135位 目黒駅, 245.7万円
136位 千石駅, 244.3万円
137位 国際展示場駅, 242.5万円
138位 大崎駅, 242.2万円
139位 巣鴨駅, 241.9万円
140位 目白駅, 241.3万円
141位 曙橋駅, 240.8万円
142位 奥沢駅, 240.1万円
143位 学芸大学駅, 240.1万円
144位 本駒込駅, 238.7万円
145位 都立大学駅, 238.4万円
146位 駒込駅, 237.3万円
147位 根津駅, 236.7万円
148位 大久保(東京)駅, 235.3万円
149位 祐天寺駅, 233.6万円
150位 早稲田(メトロ)駅, 232.3万円
151位 西新宿五丁目駅, 231.7万円
152位 武蔵小山駅, 230.5万円
153位 山下(東京)駅, 230.0万円
154位 千駄木駅, 229.3万円
155位 洗足駅, 228.0万円
156位 中野坂上駅, 227.6万円
157位 白山(東京)駅, 225.6万円
158位 池ノ上駅, 225.4万円
159位 浅草(つくばEXP)駅, 224.0万円
160位 巣鴨新田駅, 223.3万円
161位 桜新町駅, 222.9万円
162位 緑が丘(東京)駅, 222.5万円
163位 三軒茶屋駅, 221.3万円
164位 世田谷代田駅, 221.0万円
165位 大岡山駅, 220.4万円
166位 雑司が谷(東京メトロ)駅, 220.1万円
167位 戸越銀座駅, 219.3万円
168位 京急蒲田駅, 218.6万円
169位 清澄白河駅, 218.6万円
170位 九品仏駅, 217.9万円
171位 両国駅, 217.1万円
172位 大崎広小路駅, 216.5万円
173位 お台場海浜公園駅, 216.5万円
174位 駒沢大学駅, 216.4万円
175位 蒲田駅, 216.2万円
176位 西小山駅, 215.6万円
177位 森下(東京)駅, 214.4万円
178位 田園調布駅, 213.8万円
179位 東北沢駅, 213.3万円
180位 幡ケ谷駅, 212.7万円
181位 不動前駅, 212.7万円
182位 西太子堂駅, 211.6万円
183位 大井町駅, 211.5万円
184位 上町駅, 209.2万円
185位 戸越公園駅, 208.4万円
186位 尾山台駅, 207.8万円
187位 入谷(東京)駅, 207.3万円
188位 用賀駅, 206.9万円
189位 門前仲町駅, 206.3万円
190位 北千束駅, 205.7万円
191位 新代田駅, 205.2万円
192位 西早稲田駅, 205.1万円
193位 中延駅, 204.7万円
194位 日暮里駅, 204.2万円
195位 梅ケ丘駅, 203.6万円
196位 笹塚駅, 203.3万円
197位 信濃町駅, 203.3万円
198位 鶯谷駅, 203.2万円
199位 東松原駅, 202.4万円
200位 椎名町駅, 202.2万円
201位 西日暮里駅, 201.9万円
202位 中野(東京)駅, 201.9万円
203位 護国寺駅, 201.4万円
204位 雪が谷大塚駅, 198.8万円
205位 豪徳寺駅, 197.8万円
206位 大塚(東京)駅, 197.6万円
207位 下落合駅, 197.4万円
208位 若林(東京)駅, 197.2万円
209位 押上駅, 197.2万円
210位 旗の台駅, 197.1万円
211位 上野毛駅, 196.8万円
212位 新大塚駅, 196.8万円
213位 新中野駅, 196.7万円
214位 東中野駅, 196.1万円
215位 松原(東京)駅, 195.7万円
216位 越中島駅, 195.5万円
217位 松陰神社前駅, 193.8万円
218位 新馬場駅, 193.5万円
219位 多摩川駅, 192.7万円
220位 吉祥寺駅, 192.1万円
221位 荏原町駅, 191.9万円
222位 戸越駅, 191.9万円
223位 世田谷駅, 191.4万円
224位 下神明駅, 190.2万円
225位 青物横丁駅, 189.7万円
226位 荏原中延駅, 189.4万円
227位 明大前駅, 188.9万円
228位 落合(東京)駅, 187.5万円
229位 住吉(東京)駅, 186.6万円
230位 高円寺駅, 186.3万円
231位 沼部駅, 186.2万円
232位 板橋駅, 185.7万円
233位 二子玉川駅, 185.4万円
234位 等々力駅, 185.4万円
235位 経堂駅, 184.8万円
236位 本所吾妻橋駅, 184.0万円
237位 西大井駅, 183.4万円
238位 木場駅, 181.4万円
239位 田端駅, 180.8万円
240位 向原(東京)駅, 180.0万円
241位 とうきょうスカイツリー駅, 179.8万円
242位 大森(東京)駅, 179.1万円
243位 菊川(東京)駅, 178.7万円
244位 中野新橋駅, 177.9万円
245位 長原(東京)駅, 177.0万円
246位 千歳船橋駅, 176.6万円
247位 下高井戸駅, 175.9万円
248位 潮見駅, 175.7万円
249位 落合南長崎駅, 175.6万円
250位 要町駅, 175.3万円
251位 東雲(東京)駅, 174.9万円
252位 洗足池駅, 174.9万円
253位 宮の坂駅, 174.4万円
254位 天王洲アイル駅, 174.3万円
255位 荻窪駅, 174.1万円
256位 立会川駅, 173.9万円
257位 永福町駅, 173.7万円
258位 西荻窪駅, 173.5万円
259位 亀戸駅, 173.1万円
260位 芝浦ふ頭駅, 173.0万円
261位 御嶽山駅, 171.9万円
262位 阿佐ケ谷駅, 171.9万円
263位 浜田山駅, 171.4万円
264位 都電雑司ケ谷駅, 170.0万円
265位 東高円寺駅, 169.9万円
266位 久が原駅, 169.4万円
267位 千鳥町駅, 167.6万円
268位 池上駅, 167.6万円
269位 鵜の木駅, 167.3万円
270位 石川台駅, 167.3万円
271位 中野富士見町駅, 166.2万円
272位 辰巳駅, 165.9万円
273位 江古田駅, 163.6万円
274位 蓮沼駅, 163.4万円
275位 千川駅, 161.8万円
276位 成城学園前駅, 161.6万円
277位 東池袋駅, 161.5万円
278位 豊洲駅, 159.7万円
279位 祖師ケ谷大蔵駅, 159.6万円
280位 王子駅, 159.2万円
281位 東陽町駅, 158.9万円
282位 新高円寺駅, 158.9万円
283位 平和島駅, 158.2万円
284位 西巣鴨駅, 158.1万円
285位 方南町駅, 157.9万円
286位 板橋区役所前駅, 157.4万円
287位 代田橋駅, 157.4万円
288位 鮫洲駅, 157.1万円
289位 上北沢駅, 156.8万円
290位 馬込駅, 156.7万円
291位 西ケ原四丁目駅, 156.6万円
292位 東長崎駅, 156.4万円
293位 西ケ原駅, 156.0万円
294位 中井駅, 154.8万円
295位 井の頭公園駅, 154.3万円
296位 下丸子駅, 154.1万円
297位 北池袋駅, 154.0万円
298位 沼袋駅, 153.9万円
299位 久我山駅, 152.8万円
300位 西永福駅, 152.8万円
301位 千歳烏山駅, 152.5万円
302位 西馬込駅, 151.1万円
303位 三鷹駅, 150.8万円
304位 新江古田駅, 149.6万円
305位 練馬駅, 149.1万円
306位 桜上水駅, 148.8万円
307位 富士見ケ丘駅, 148.3万円
308位 武蔵新田駅, 148.0万円
309位 八幡山駅, 147.9万円
310位 下板橋駅, 147.8万円
311位 新井薬師前駅, 147.2万円
312位 小竹向原駅, 147.1万円
313位 ときわ台(東京)駅, 147.1万円
314位 桜台(東京)駅, 147.1万円
315位 三ノ輪駅, 147.0万円
316位 大山(東京)駅, 146.3万円
317位 大森町駅, 146.0万円
318位 鬼子母神前駅, 146.0万円
319位 矢口渡駅, 144.6万円
320位 梅屋敷(東京)駅, 144.0万円
321位 新板橋駅, 143.8万円
322位 都立家政駅, 143.7万円
323位 南阿佐ケ谷駅, 142.8万円
324位 高井戸駅, 142.6万円
325位 西大島駅, 141.8万円
326位 野方駅, 141.6万円
327位 下井草駅, 141.2万円
328位 東池袋四丁目駅, 140.0万円
329位 三河島駅, 138.4万円
330位 糀谷駅, 138.2万円
331位 新桜台駅, 138.1万円
332位 芦花公園駅, 137.9万円
333位 赤羽岩淵駅, 137.5万円
334位 流通センター駅, 137.2万円
335位 豊島園駅, 136.9万円
336位 鷺ノ宮駅, 136.6万円
337位 井荻駅, 135.6万円
338位 東十条駅, 134.9万円
339位 西葛西駅, 134.4万円
340位 南砂町駅, 134.2万円
341位 氷川台駅, 133.9万円
342位 尾久駅, 133.8万円
343位 中村橋駅, 133.6万円
344位 石神井公園駅, 133.3万円
345位 赤羽駅, 132.9万円
346位 中板橋駅, 132.0万円
347位 雑色駅, 130.9万円
348位 学習院下駅, 130.0万円
349位 曳舟駅, 129.3万円
350位 大鳥居駅, 128.1万円
351位 三鷹台駅, 127.6万円
352位 上中里駅, 127.3万円
353位 南千住駅, 127.2万円
354位 鐘ケ淵駅, 126.7万円
355位 大島(東京)駅, 126.7万円
356位 滝野川一丁目駅, 126.3万円
357位 板橋本町駅, 126.1万円
358位 府中(東京)駅, 125.6万円
359位 武蔵関駅, 124.7万円
360位 調布駅, 124.3万円
361位 十条(東京)駅, 124.2万円
362位 六郷土手駅, 124.2万円
363位 上石神井駅, 124.2万円
364位 赤土小学校前駅, 123.9万円
365位 早稲田(都電)駅, 123.8万円
366位 富士見台駅, 122.7万円
367位 亀戸水神駅, 122.0万円
368位 平和台(東京)駅, 122.0万円
369位 上井草駅, 121.7万円
370位 武蔵境駅, 120.4万円
371位 飛鳥山駅, 120.3万円
372位 大井競馬場前駅, 120.0万円
373位 蓮根駅, 119.8万円
374位 志村坂上駅, 119.1万円
375位 新三河島駅, 118.5万円
376位 地下鉄赤塚駅, 118.3万円
377位 練馬春日町駅, 118.3万円
378位 本蓮沼駅, 117.9万円
379位 東向島駅, 117.4万円
380位 練馬高野台駅, 116.3万円
381位 北千住駅, 116.3万円
382位 国領駅, 116.3万円
383位 町屋駅, 116.2万円
384位 府中競馬正門前駅, 115.7万円
385位 東大島駅, 115.5万円
386位 地下鉄成増駅, 115.0万円
387位 立川駅, 114.6万円
388位 穴守稲荷駅, 114.6万円
389位 千住大橋駅, 114.2万円
390位 綾瀬駅, 114.1万円
391位 葛西臨海公園駅, 113.3万円
392位 葛西駅, 113.1万円
393位 天空橋駅, 112.6万円
394位 京成関屋駅, 112.0万円
395位 上板橋駅, 111.9万円
396位 王子神谷駅, 110.7万円
397位 町屋二丁目駅, 110.2万円
398位 京成曳舟駅, 109.3万円
399位 北赤羽駅, 109.1万円
400位 荒川二丁目駅, 108.4万円
401位 下赤塚駅, 107.9万円
402位 東武練馬駅, 107.8万円
403位 大泉学園駅, 107.7万円
404位 仙川駅, 107.7万円
405位 西台駅, 107.6万円
406位 荒川七丁目駅, 107.0万円
407位 小岩駅, 107.0万円
408位 東尾久三丁目駅, 106.6万円
409位 高島平駅, 106.4万円
410位 新高島平駅, 106.4万円
411位 梶原駅, 106.2万円
412位 小田急多摩センター駅, 106.0万円
413位 国分寺駅, 105.7万円
414位 荒川遊園地前駅, 105.7万円
415位 光が丘駅, 105.0万円
416位 荒川区役所前駅, 104.9万円
417位 柴崎駅, 104.9万円
418位 青砥駅, 104.9万円
419位 志村三丁目駅, 104.6万円
420位 東府中駅, 104.4万円
421位 つつじケ丘駅, 104.3万円
422位 新小岩駅, 104.0万円
423位 布田駅, 103.9万円
424位 小村井駅, 103.9万円
425位 船堀駅, 103.9万円
426位 志茂駅, 103.7万円
427位 東小金井駅, 103.6万円
428位 成増駅, 103.2万円
429位 国立駅, 102.9万円
430位 平井(東京)駅, 102.6万円
431位 高松(東京)駅, 102.1万円
432位 飛田給駅, 102.0万円
433位 西調布駅, 102.0万円
434位 喜多見駅, 101.9万円
435位 牛田(東京)駅, 101.7万円
436位 京成立石駅, 100.8万円
437位 亀有駅, 100.8万円
438位 東伏見駅, 100.7万円
439位 浮間舟渡駅, 100.6万円
440位 狛江駅, 100.3万円
441位 昭和島駅, 100.2万円
442位 武蔵小金井駅, 99.9万円
443位 新木場駅, 99.9万円
444位 新柴又駅, 99.3万円
445位 四ツ木駅, 98.6万円
446位 京成小岩駅, 97.0万円
447位 瑞江駅, 97.0万円
448位 新小金井駅, 96.8万円
449位 篠崎駅, 96.7万円
450位 東あずま駅, 95.3万円
451位 分倍河原駅, 95.2万円
452位 熊野前駅, 94.6万円
453位 お花茶屋駅, 94.4万円
454位 西新井駅, 94.2万円
455位 京王多摩川駅, 94.0万円
456位 八広駅, 94.0万円
457位 保谷駅, 94.0万円
458位 宮ノ前駅, 93.9万円
459位 ひばりケ丘(東京)駅, 93.9万円
460位 府中本町駅, 93.5万円
461位 荒川車庫前駅, 93.1万円
462位 和泉多摩川駅, 93.1万円
463位 京成高砂駅, 91.6万円
464位 白糸台駅, 91.6万円
465位 青井駅, 91.5万円
466位 堀切菖蒲園駅, 91.4万円
467位 柴又駅, 91.2万円
468位 多磨霊園駅, 90.9万円
469位 栄町(東京)駅, 90.6万円
470位 京成金町駅, 90.0万円
471位 一之江駅, 89.7万円
472位 武蔵野台駅, 89.7万円
473位 江戸川駅, 89.7万円
474位 一橋学園駅, 89.5万円
475位 有明テニスの森駅, 89.5万円
476位 西府駅, 89.2万円
477位 五反野駅, 89.1万円
478位 西高島平駅, 88.5万円
479位 荒川一中前駅, 88.1万円
480位 田無駅, 87.9万円
481位 西国立駅, 87.6万円
482位 町屋駅前駅, 87.5万円
483位 西国分寺駅, 86.2万円
484位 堀切駅, 86.0万円
485位 北府中駅, 84.3万円
486位 金町駅, 84.0万円
487位 竹ノ塚駅, 83.7万円
488位 矢野口駅, 83.0万円
489位 梅島駅, 83.0万円
490位 競艇場前駅, 82.6万円
491位 六町駅, 82.3万円
492位 多磨駅, 82.2万円
493位 新小平駅, 82.2万円
494位 北綾瀬駅, 82.1万円
495位 西武柳沢駅, 81.1万円
496位 大師前駅, 80.3万円
497位 谷在家駅, 79.9万円
498位 中河原駅, 79.8万円
499位 小台駅, 79.8万円
500位 矢川駅, 79.0万円
501位 花小金井駅, 78.3万円
502位 京王よみうりランド駅, 77.7万円
503位 是政駅, 76.2万円
504位 恋ケ窪駅, 75.8万円
505位 西新井大師西駅, 75.7万円
506位 立飛駅, 75.5万円
507位 東久留米駅, 75.4万円
508位 舎人駅, 75.0万円
509位 小菅駅, 74.1万円
510位 泉体育館駅, 73.9万円
511位 豊田駅, 72.9万円
512位 青梅街道駅, 72.9万円
513位 谷保駅, 72.5万円
514位 久米川駅, 71.5万円
515位 町田駅, 71.4万円
516位 稲城長沼駅, 70.8万円
517位 小平駅, 70.3万円
518位 小川(東京)駅, 69.7万円
519位 砂川七番駅, 69.2万円
520位 江北駅, 69.0万円
521位 秋津駅, 68.8万円
522位 柴崎体育館駅, 68.7万円
523位 鷹の台駅, 68.3万円
524位 見沼代親水公園駅, 68.1万円
525位 万願寺駅, 68.0万円
526位 西立川駅, 67.5万円
527位 京王多摩センター駅, 67.0万円
528位 日野(東京)駅, 66.7万円
529位 高幡不動駅, 66.6万円
530位 南町田駅, 66.3万円
531位 高野(東京)駅, 66.2万円
532位 中神駅, 66.1万円
533位 谷塚駅, 65.7万円
534位 甲州街道駅, 65.3万円
535位 扇大橋駅, 65.3万円
536位 舎人公園駅, 65.3万円
537位 南多摩駅, 65.2万円
538位 松が谷駅, 65.1万円
539位 足立小台駅, 64.9万円
540位 つくし野駅, 64.7万円
541位 清瀬駅, 64.7万円
542位 すずかけ台駅, 64.1万円
543位 新百合ケ丘駅, 63.7万円
544位 桜街道駅, 63.2万円
545位 八坂(東京)駅, 62.8万円
546位 東村山駅, 62.4万円
547位 東大和市駅, 62.2万円
548位 成瀬駅, 62.2万円
549位 聖蹟桜ケ丘駅, 61.9万円
550位 東中神駅, 61.2万円
551位 京王八王子駅, 61.2万円
552位 玉川上水駅, 60.5万円
553位 萩山駅, 59.8万円
554位 稲城駅, 59.3万円
555位 昭島駅, 58.6万円
556位 京王永山駅, 57.8万円
557位 新秋津駅, 56.4万円
558位 こどもの国(神奈川)駅, 56.0万円
559位 牛浜駅, 55.5万円
560位 拝島駅, 54.9万円
561位 庚申塚駅, 54.0万円
562位 小田急永山駅, 54.0万円
563位 玉川学園前駅, 53.7万円
564位 唐木田駅, 53.5万円
565位 八潮駅, 53.2万円
566位 柿生駅, 53.2万円
567位 武蔵砂川駅, 52.6万円
568位 八王子駅, 51.4万円
569位 西八王子駅, 51.3万円
570位 鶴川駅, 51.2万円
571位 古淵駅, 51.1万円
572位 熊川駅, 50.6万円
573位 京王堀之内駅, 49.9万円
574位 平山城址公園駅, 49.8万円
575位 小作駅, 49.8万円
576位 西武園駅, 49.8万円
577位 西武立川駅, 49.6万円
578位 南大沢駅, 49.6万円
579位 橋本(神奈川)駅, 49.0万円
580位 羽村駅, 48.8万円
581位 黒川(神奈川)駅, 48.2万円
582位 百草園駅, 47.8万円
583位 河辺駅, 47.7万円
584位 所沢駅, 47.6万円
585位 福生駅, 47.5万円
586位 南平駅, 47.2万円
587位 浦安(千葉)駅, 47.0万円
588位 上北台駅, 46.3万円
589位 多摩境駅, 46.0万円
590位 程久保駅, 45.7万円
591位 武蔵大和駅, 45.0万円
592位 狭間駅, 44.6万円
593位 八王子みなみ野駅, 44.1万円
594位 中央大学・明星大学駅, 43.5万円
595位 京王片倉駅, 43.5万円
596位 めじろ台駅, 43.4万円
597位 北八王子駅, 43.3万円
598位 北野(東京)駅, 42.8万円
599位 栗平駅, 42.4万円
600位 長沼(東京)駅, 41.4万円
601位 淵野辺駅, 41.3万円
602位 片倉駅, 41.0万円
603位 若葉台駅, 41.0万円
604位 大塚・帝京大学駅, 41.0万円
605位 矢部駅, 38.9万円
606位 東福生駅, 37.9万円
607位 相模原駅, 36.5万円
608位 多摩動物公園駅, 36.1万円
609位 小宮駅, 33.6万円
610位 武蔵引田駅, 33.5万円
611位 高尾山口駅, 33.3万円
612位 東秋留駅, 33.3万円
613位 西武遊園地駅, 33.2万円
614位 秋川駅, 32.9万円
615位 相原駅, 32.4万円
616位 高尾(東京)駅, 32.0万円
617位 長津田駅, 31.0万円
618位 青梅駅, 30.8万円
619位 東青梅駅, 29.9万円
620位 新座駅, 29.1万円
621位 山田(東京)駅, 29.1万円
622位 武蔵増戸駅, 27.6万円
623位 箱根ケ崎駅, 27.2万円
624位 武蔵五日市駅, 21.0万円
625位 日向和田駅, 20.5万円
626位 宮ノ平駅, 15.0万円
627位 石神前駅, 13.0万円
628位 二俣尾駅, 12.0万円
629位 軍畑駅, 12.0万円
630位 沢井駅, 11.9万円
631位 鳩ノ巣駅, 8.1万円
632位 御嶽駅, 6.9万円
633位 奥多摩駅, 6.3万円
634位 川井駅, 6.0万円
635位 古里(東京)駅, 5.3万円
636位 白丸駅, 5.0万円
637位 飯能駅, 3.6万円

Ubuntu 上に python 環境をセットアップする

さくら VPS 上に作成した Ubuntu サーバー上で、 pyenv を使って python 環境を整備します。

ssh の設定

ssh ubuntu@xxx.xxx.xxx.xxx

するとパスワードを求められる。
面倒な作業を省略するため、パスワード入力なしにログイン出来るようにする。
クライアントマシン側で生成した公開鍵を、サーバー側で登録するため、

ssh-copy-id -i ~/.ssh/id_rsa.pub user_name@ip_ address

を実行すれば良い。

qiita.com

pyenv のセットアップ

以下を参考にします。 python そのものをビルドするのに必要なモジュールもインストールしておく必要があるのに注意。

qiita.com

ハマリポイント

pyenv のバージョンが切り替わらない

手順通りやっても pyenv で python のバージョンが切り替わらない場合は、pyenv よりもローカルの python が優先されるように $PATH が定義されている可能性があります。

export PATH="$HOME/.pyenv/shims:$PATH"

を ~/.bashrc あたりに追加すると解決します。

qiita.com

Mac(High Sierra) で python のビルドに失敗する

コンパイル時のオプションを切り替える必要があります。

CFLAGS="-I$(brew --prefix openssl)/include" LDFLAGS="-L$(brew --prefix openssl)/lib" pyenv install -v 3.6.1

以下のページが詳しいです。

github.com

さくら VPS の Ubuntu 上に Django アプリをデプロイする

さくら VPSUbuntu 上に Django アプリをデプロイします。

セットアップ

# パッケージリストを更新します
sudo apt-get update -y

# 公開鍵と秘密鍵を作成します。鍵の種類はRSAに設定
ssh-keygen -t rsa

# 生成された公開鍵を確認。
cat ~/.ssh/id_rsa.pub 

# 公開鍵を GitHub に登録。
# Personal settings>SSH and GPG keys にコピペ。

# git を install
sudo apt install -y git

# リポジトリを clone
git clone <repo>

# 8080 ポートを開放
# https://qiita.com/hekki/items/c3f42c31632105389c79

sudo apt install -y emacs
sudo emacs /etc/iptables/iptables.rules
# "-A INPUT -m state --state NEW -m tcp -p tcp --dport 3000 -j ACCEPT" を追記

# 変更の反映
sudo iptables-restore < /etc/iptables/iptables.rules

# 現在適用されているルールの確認
sudo iptables -L -n -v

Python 関連

# 仮想環境の作成
sudo apt-get install -y python3-venv
python3 -m venv venv

# 仮想環境をアクティベート。プロンプトに(venv)が表示される。
source venv/bin/activate

# python3 系になっていることを確認
python --version

# django をインストール
pip install django

# インストールしたパッケージを吐き出す
pip freeze > requirements.txt

# パッケージの一括インストールができる
# 既にインストール済なのでRequirement already satisfiedって言われる
pip install -r requirements.txt 

Django 関連

# プロジェクトを作成
django-admin startproject <project>

cd <project>

# settings.py の ALLOWED_HOSTS にサーバーの ipアドレスを追加

# マイグレーション
python manage.py migrate

# 開発用途のサーバーを立てる
python manage.py runserver 0.0.0.0:8080

# ブラウザから http://ip_address:8080 にアクセス
# アクセス出来ない場合はポート開放が適切にできているか確認する。

Web アプリケーションを Nginx にデプロイする

www.digitalocean.com

sudo apt-get install nginx -y
sudo mv configurations/gunicorn.service /etc/systemd/system/
sudo mv configurations/castillo /etc/nginx/sites-available/
sudo ln -s /etc/nginx/sites-available/castillo /etc/nginx/sites-enabled

sudo systemctl daemon-reload
sudo systemctl restart gunicorn
sudo nginx -t && sudo systemctl restart nginx

Python-fire で CLI ツールを実装してみる

python-fire って?

Python Fire is a library for automatically generating command line interfaces (CLIs) from absolutely any Python object.

python fire はPython で書いたソースコードコマンドラインツールとして使えるようにするライブラリとのこと。

blog.amedama.jp

2018 年に流行ってる Python オープンソースソフトウェアとしてもピックアップされてます。

medium.mybridge.co

使ってみた

#!/usr/bin/env python3

import os
import subprocess

import fire

class CommandHandler(object):

    def __init__(self):
        pass

    def _execute(self, cmd):
        print(cmd)
        subprocess.call(cmd, shell=True)

    def sync(self):
        path = os.path.expanduser("~/.cmdrc")
        cmd = "cli.py -- --completion > %s" % path
        self._execute(cmd)


if __name__ == '__main__':
    fire.Fire(CommandHandler)

メソッドとして定義した関数が、そのままコマンドラインのオプションとして使える感じ。 引数はコマンドラインオプションのパラメータとして注入できます。
なんとなく argparse っぽいなと思って github みたところ、やはり内部的には argparse 使ってます。

関数シンボルを自動的にコマンドラインオプション化シてくれるのもうれしいですが、個人的にもっと嬉しいのは、python cli.py -- --completion すると、bash 補完のために必要なスクリプトが自動生成されること。

自動生成されたコードは、~/.bashrc で実行するようにすれば tab 補完も効いてバリバリ CLI ツールが実装できますよね。

番外編: IntelliJ IDEA で python

PythonIDE どうすっかなーって最近悩んでいて、色々試したところ IntelliJ IDEA が一番使いやすいという結論に至りました。

qiita.com

pip で virtualenv にインストールしたサードパーティ製モジュール群のインテリセンスが効かなくて悩んだけど、

  • Project が参照する SDK を正しくvirtualenv に指定する
  • File -> Invalidate Caches/Restart でキャッシュをクリアする

で解決しました。 参考にしたリンクは以下です。

stackoverflow.com

Python で Twitter Bot を作る

Python をつかって Twitter Bot を作ります。
以下の 3 段構成でまとめます。

  1. Tweet する文面をスクレイピングして取得する
  2. Twitter API を使って Tweet するためのコードを書く
  3. デプロイする

1. Tweet する文面をスクレイピングして取得する

HTTP 通信周りは requests を、HTML のパーサーは BeautifulSoup4 を使うため、以下のようにインストールします。

pip install requests BeautifulSoup4

HTTP GET リクエストを行い、ステータスコードをチェックします。

import requests

response = requests.get(url)

if response.status_code != 200:
    print("!!! INVALID STATUS CODE")
    sys.exit()

問題なければ response をパーサーに掛けます。

# 文字化け対策
soup = BeautifulSoup(response.content, 'html.parser')


# 条件を絞ったタグの取得
for a in soup.find_all("a", class_="entry-link"):
    print(a.get("title") + " : " + a.get("href"))

文字化け対策

html.parser を使うのは文字化け対策のためです。
詳細は以下のページを参照してください。
orangain.hatenablog.com

条件を絞ったタグの取得

BeautifulSoup で html のクラス要素で絞込を掛けてタグを取得することができます。 はてなブックマークホッテントリなんかは entry-link で簡単に抽出できます。 qiita.com

2. Twitter API を使って Tweet するためのコードを書く

apps.twitter.com

上記ページにアクセスして、Consumer Key (API Key) と Consumer Secret (API Secret) を取得します。

コマンドラインで Oauth Token を取ってくる方法については以下のページを参考にしました。

qiita.com

コードの整理

argparse を使って、スクリプト内でハードコードしている url や credential 類を引数指定するようにリファクタリングします。
url を外部注入する形にしておけば、いざリンクが変わった時にスクリプトの修正をすることが不要になります。
また、credential 類をスクリプトにハードコードしていると、うっかりリポジトリに push してしまう事態になりかねません。
やらかさないために、私は以下の方法で別ファイルに分けて管理しています。

  • .private/* を .gitignore に追加
  • .private 以下に credentials.yml を追加
  • PyYaml で読み出す

他にも decouple を入れて秘匿情報を分離する方法もありますが。

simpleisbetterthancomplex.com

例えば tweet_trend.py --url URL --rank RANK --credential CREDENTIAL といった引数指定をしたい場合は、argparse を使って以下の通り実装すれば良いです。

parser = argparse.ArgumentParser(description="Tweet Trend Script")

parser.add_argument("--url",
                    type=str,
                    required=True,
                    help="hatena hot entry url: http://b.hatena.ne.jp/hotentry/*")
parser.add_argument("--rank",
                    type=int,
                    required=True,
                    help="ranking number starting from 0")
parser.add_argument("--credential",
                    type=str,
                    required=True,
                    help="path to credential file")

args = parser.parse_args()
print("Arguments:\n\t%s\n\t%d\n\t%s" % (args.url, args.rank, args.credential))

3. デプロイする

スクリプトができたらどこかのサーバーにデプロイします。
Bot の駆動のためには、実行のためのサーバーが必要です。
ここではさくら VPS 上で cron を使って定期的に Bot を実行することにします。

cron の詳細についてはこちらが詳しいです。  

qiita.com

たとえば 17:00 に tweet_trend.py を実行したい場合は、crontab -e して以下のように書くだけです。

0 17 * * * python3.6 /root/repos/anchoko/scripts/tweet_trend.py --url http://b.hatena.ne.jp/ctop/it --rank 0 --credential ~/repos/anchoko/.private/config.yml

デプロイ時のあるあるトラブル

  • cron のサービスが起動していますか?
    • service crond status で確認
  • crontab -e で記載したスクリプトのパスが正しいですか?
    • cat /var/spool/mail/root してエラーが出てないか確認
  • 重複した文章をツイートしようとしていないですか?
    • details: {'errors': [{'code': 187, 'message': 'Status is a duplicate.'}]} のエラーコードが返ってきます。

はてなブログを使った Markdown 記法入門

Markdown 記法ではてなブログを始めるにあたり有用と思われるノウハウをまとめます。

はてなブログの編集方法

ブログ記事を書くにあたって、編集方法は以下の 3 種類のモードがあります。

このうち、Markdownはてな記法では、シンタックスハイライトが実装されています。

シンタックスハイライト

Markdownシンタックスハイライト書式は、

```プログラム言語の種類
コード
```

とすればよいです。 例えば、

```python
print("Hello world")
```

は、以下の通りハイライトされます。

print("Hello world")

はてな公式が展開している情報はこちらです。

help.hatenablog.com

Markdown そのものの書き方については、以下が詳しいです。

Markdown記法 チートシート - Qiita

数式の挿入

おなじみ Tex 記法ではてなブログ上で数式を書く方法についてです。

基本的には、[tex:TeXのコマンド]で数式を表示できます。 例えば、

[tex:\int\_a^{b} f(x) dx]

は、

\int_a^{b}  f(x) dx

のように表示されます。

以下のページが詳しいです。

cocodrips.hateblo.jp

LaTeX コマンドそのものについては下記参照。

www.latex-cmd.com