ブコメ一覧出力プログラム

f:id:elve:20180506123254p:plain
f:id:elve:20180506123319p:plain
f:id:elve:20180506123330p:plain
というわけでプログラムではてぶを抽出します。
クソ仕様ですw
ブログのURLから日付を取得してるので日付と6桁の値がURL末尾に入らないブログでは使えないor誤動作するっすw
三日はてブを45日くらいにして出力ちょっと弄ってる。いうなれば「月はてブ」。
汚いコードだけど何かの参考になれば幸い
html出力といいつつはてなブログに貼り付けることを考えた出力のため改行など追加してください。

出力

htmlだと
f:id:elve:20180506125935p:plain
黄色の部分に改行入らない。
ソースを表示してもらえれば
f:id:elve:20180506130100p:plain
コピペでブログに貼り付けれるっす。
するとエントリのタイトルやアイコンが表示されてIDコールが乱れ飛びますwww
お気をつけてwww

コード

# -*- coding:utf-8 -*-
import urllib
import urllib.request
import json
import datetime as dt
import sys
from bs4 import BeautifulSoup
# HTML出力
def HtmlOutput(bmInfos):
f = open('月はてブ.html', 'ab')
tableStr = f'<h3>{bmInfos[0]["url"]}</h3>\n'
tableStr += f'[{bmInfos[0]["url"]}:title]\n'
for b in bmInfos:
bUrl = b['url'].replace("http://", "")
bUrl = b['url'].replace("https://", "s/")
bUrl = urllib.parse.quote(bUrl)
if b['star'] == 1:
tableStr += '★'
tableStr += f'<img src="https://cdn.profile-image.st-hatena.com/users/{b["user"]}/profile_s.gif">id:{b["user"]}'
tableStr += f' {b["date"].strftime("%Y/%m/%d")}\n'
tableStr += f'{b["comment"]}\n'
html = f"""
    {tableStr}
    """
f.write(html.encode('utf-8'))
f.close()
# 入力したはてなIDがスター(黄)つけているか
# 0: はてなスターをつけていない
# 1: はてなスターをつけている
def GetImgIndex(time, eid, user):
# URL作成
url = f'http://b.hatena.ne.jp/{user}/'
url += time.strftime("%Y%m%d")
url += "#bookmark-" + str(eid)
url = urllib.parse.quote(url)
# アクセス(エンコードしない)
r = urllib.request.urlopen("http://s.hatena.com/entry.json?uri=" + url).read()
# jsonに変換
jsonStr = json.loads(r)
for st in jsonStr['entries']:
for st2 in st['stars']:
if st2['name'] == myId:
return 1
return 0
# ---メイン処理ここから--ー
# 検索値、ユーザーID入力
myStr = input("検索したいurl: ")
myId = input("あなたのはてなID: ")
if myStr == "" or myId == "":
print("なんか入れて")
sys.exit()
if myId.encode('utf-8').isalnum():
if len(myId) > 15:
print("長すぎる")
sys.exit()
else:
print("半角英数以外")
sys.exit()
f = open('月はてブ.html', 'wb')
html = f"""
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
</head>
<body>
"""
f.write(html.encode('utf-8'))
f.close()
pageCount = 0
endflg = False
while True:
r = urllib.request.urlopen("http://b.hatena.ne.jp/search/text?safe=off&q=" + urllib.parse.quote(myStr, '') +\
"&users=1&of=" + str(pageCount * 40)).read()
pageCount += 1
soup = BeautifulSoup(r, 'lxml')
for a in soup.find_all("a", attrs={"class": "capture"}):
bmInfos = []
targetURL=a.get("href")
tmpD = targetURL[len(targetURL)-17:]
try:
chkD = dt.datetime.strptime(tmpD[:10], '%Y/%m/%d')
except:
continue
if chkD < (dt.datetime.now() - dt.timedelta(days=45)):
endflg = True
break
r = urllib.request.urlopen("http://b.hatena.ne.jp/entry/jsonlite/?url=" + urllib.parse.quote(targetURL, '')).read()
jsonStr = json.loads(r)
for bm in jsonStr['bookmarks']:
tdatetime = dt.datetime.strptime(bm['timestamp'], '%Y/%m/%d %H:%M:%S')
if tdatetime > (dt.datetime.now() - dt.timedelta(days=45)):
if bm['comment'] != "":
bmInfo = {"star": GetImgIndex(tdatetime, jsonStr['eid'], bm['user']), "url": jsonStr['url'], "user": bm['user'], "date": tdatetime, "comment": bm['comment']}
bmInfos.append(bmInfo)
if len(bmInfos) > 0:
HtmlOutput(bmInfos)
if endflg:
break
f = open('月はてブ.html', 'ab')
html = f"""
</body>
</html>
"""
f.write(html.encode('utf-8'))
f.close()
print("END")

どのくらい面白かった?

星を押して送信してね

平均 0 / 5. Vote count: 0

是非フォローしてください

最新の情報をお伝えします

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です