-
Notifications
You must be signed in to change notification settings - Fork 0
/
hatebu_bot.py
69 lines (47 loc) · 2.31 KB
/
hatebu_bot.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# -*- coding: utf-8 -*-
from urllib3 import PoolManager
import urllib
import feedparser
import datetime
class Hatebu(object):
http = None
def __init__(self):
user_agent = {'user-agent': 'Mozilla/5.0 (Windows NT 6.3; rv:36.0) Gecko/20100101 Firefox/36.0'}
self.http = PoolManager(headers=user_agent)
def get_rss_data(self, word, threshold):
"""
はてブから キーワード( = word)、ブックマーク数 (= threshold)を基に
xmlデータを取得してくるメソッド
"""
url = urllib.request.quote("b.hatena.ne.jp/keyword/{0}?mode=rss&sort=current&threshold={1}".format(str(word), str(threshold)))
response = self.http.request_encode_url('GET', url)
result = response.data.decode('utf-8')
return result
def parse_xml_data(self, xml):
"""
取得してきたXMLデータを解析して必要な情報のみを抜き出す。
"""
result = []
feed = feedparser.parse(xml)
"""
各ブックマークは、XMLデータのentriesタグの中にItemタグ単位で保存されている。
feed["entries"]でentriesの中から一つずつItemを取り出し、dataに格納する。
dataは、Itemタグ内のtitleやdateの情報がparse関数によってdict型に変換されて
格納されているため、data["title"]などで必要な情報が得られる。
"""
for data in feed["entries"]:
# hatebu_bookmarkcountの項目がない場合があるため、項目がある場合のみ取得
if "hatena_bookmarkcount" in data.keys():
tmp = dict(title=data["title"],
date=data["date"],
url=data["links"][0]["href"],
bookmark_count=data["hatena_bookmarkcount"])
result.append(tmp)
# resultにブックマークを格納した時に、取得した順と逆に格納されてしまうため、取得順になるように reversed関数で配列を逆順にしている。
return reversed(result)
if __name__ == "__main__":
hatebu = Hatebu()
xml = hatebu.get_rss_data("Linux", 30)
parse = hatebu.parse_xml_data(xml)
for d in parse:
print(d["date"])