snack.elve.club
で、だいぶ理想の形なのですが、できればはてブが多い順でかつ古い方から抽出したい。
https://b.hatena.ne.jp/entrylist?url=https%3A%2F%2Fsnack.elve.club%2F&sort=eid&page=2
のページ数変えていけばブクマされたエントリを取得できそう。
ソートは
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://snack.elve.club/' #行頭文字 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("終わり!")
出力
(たぶん)よし!!
あ、タイトルにブログ名入って、文字数によっては切れる・・・まぁいいか(;´Д`)