まだやる過去ログリスト作成w

snack.elve.club
で、だいぶ理想の形なのですが、できればはてブが多い順でかつ古い方から抽出したい。
https://b.hatena.ne.jp/entrylist?url=https%3A%2F%2Fsnack.elve.club%2F&sort=eid&page=2
のページ数変えていけばブクマされたエントリを取得できそう。
f:id:elve:20200302230753p:plain

ソートは
snack.elve.club
こっちを応用すれば行けそう

import os
import urllib.request, urllib.error
from bs4 import BeautifulSoup as bs4
import pandas as pd
import datetime
#書き込みファイル
FILE_NAME_A = r'C:\Users\miki sunonhara\Documents\hateBoList.txt'
#文字コード
FILE_ENCODING = 'UTF-8'
#URL
INPUT_URL = 'https://elve.hatenadiary.jp/'
#行頭文字
HEAD='#はてなブログ 過去記事>>'
#ファイル書き込み(文字列をそのまま書き込み)
def write_file_from_str(p_filename, p_mode, p_data):
file = open(p_filename, p_mode, encoding=FILE_ENCODING)
file.write(p_data)
file.close()
#メイン処理
#出力ファイルがあったら削除
if os.path.exists(FILE_NAME_A):
os.remove(FILE_NAME_A)
#データ空に
bmInfos = []
p = 1
while 1:
#多分本当はINPUT_URLをエンコード? しないといけないと思うけど動いた
readPage = "https://b.hatena.ne.jp/entrylist?url=" + INPUT_URL + "&sort=eid&page=" + str(p)
#URL取得
try:
f = urllib.request.urlopen(readPage)
except:
print("html読み込めなんだ")
break
outputText = ''
soup = bs4(f, "lxml")
#エントリータイトルクラス取得
ss = soup.findAll(class_='entrylist-contents-main')
if ss == []:
print("エントリーなし")
break
for s in ss:
#エントリーごとの処理
#ノードのリンクタグ
a = s.find('a', class_='js-keyboard-openable')
#ノードの時間情報変換
d = datetime.datetime.strptime(s.find('li', class_="entrylist-contents-date").get_text(), '%Y/%m/%d %H:%M')
#ブクマ情報 ブクマカウント|日付|タイトル|URL
bmInfo = {"bmCount": int(s.find('span', class_='').get_text(strip=True)), "date": int(d.strftime('%Y%m%d')), "title": a.get_text(strip=True), "url": a.get('href')}
#データ追加
bmInfos.append(bmInfo)
#次のページへ
p = p + 1
#データをデーターベースっぽいのにする
df = pd.DataFrame(bmInfos)
#ソート ブクマ数降順、日付昇順
df = df.sort_values(['bmCount', 'date'], ascending=[False, True])
#いったん保存する
df.to_csv(FILE_NAME_A, index=False)
#700件読み込む
df_none_nrows = pd.read_csv(FILE_NAME_A, header=1, usecols=[1, 2, 3], nrows=700)
#出力ファイルがあったら削除
if os.path.exists(FILE_NAME_A):
os.remove(FILE_NAME_A)
#ノードごとに書き込む
for  b in df_none_nrows.itertuples():
write_file_from_str(FILE_NAME_A, 'a', HEAD + ' ' + b[2] + '/' + str(b[1]) + ' ' + b[3] + "\n")
print("終わり!")

出力

f:id:elve:20200302232219p:plain

(たぶん)よし!!

あ、タイトルにブログ名入って、文字数によっては切れる・・・まぁいいか(;´Д`)

どのくらい面白かった?

星を押して送信してね

平均 0 / 5. Vote count: 0

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

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

コメントする

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