スナックelve 本店

バツイチ40代女の日記です

まだやる過去ログリスト作成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

(たぶん)よし!!

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